mirror of
https://github.com/SimpleMobileTools/Simple-Notes.git
synced 2025-06-05 17:00:23 +02:00
appending package name with .pro
This commit is contained in:
@ -0,0 +1,75 @@
|
||||
package com.simplemobiletools.notes.pro.helpers
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Environment
|
||||
import com.simplemobiletools.commons.helpers.BaseConfig
|
||||
|
||||
class Config(context: Context) : BaseConfig(context) {
|
||||
companion object {
|
||||
fun newInstance(context: Context) = Config(context)
|
||||
}
|
||||
|
||||
var autosaveNotes: Boolean
|
||||
get() = prefs.getBoolean(AUTOSAVE_NOTES, true)
|
||||
set(autosaveNotes) = prefs.edit().putBoolean(AUTOSAVE_NOTES, autosaveNotes).apply()
|
||||
|
||||
var displaySuccess: Boolean
|
||||
get() = prefs.getBoolean(DISPLAY_SUCCESS, false)
|
||||
set(displaySuccess) = prefs.edit().putBoolean(DISPLAY_SUCCESS, displaySuccess).apply()
|
||||
|
||||
var clickableLinks: Boolean
|
||||
get() = prefs.getBoolean(CLICKABLE_LINKS, false)
|
||||
set(clickableLinks) = prefs.edit().putBoolean(CLICKABLE_LINKS, clickableLinks).apply()
|
||||
|
||||
var monospacedFont: Boolean
|
||||
get() = prefs.getBoolean(MONOSPACED_FONT, false)
|
||||
set(monospacedFont) = prefs.edit().putBoolean(MONOSPACED_FONT, monospacedFont).apply()
|
||||
|
||||
var showKeyboard: Boolean
|
||||
get() = prefs.getBoolean(SHOW_KEYBOARD, true)
|
||||
set(showKeyboard) = prefs.edit().putBoolean(SHOW_KEYBOARD, showKeyboard).apply()
|
||||
|
||||
var showNotePicker: Boolean
|
||||
get() = prefs.getBoolean(SHOW_NOTE_PICKER, false)
|
||||
set(showNotePicker) = prefs.edit().putBoolean(SHOW_NOTE_PICKER, showNotePicker).apply()
|
||||
|
||||
var showWordCount: Boolean
|
||||
get() = prefs.getBoolean(SHOW_WORD_COUNT, false)
|
||||
set(showWordCount) = prefs.edit().putBoolean(SHOW_WORD_COUNT, showWordCount).apply()
|
||||
|
||||
var fontSize: Int
|
||||
get() = prefs.getInt(FONT_SIZE, FONT_SIZE_MEDIUM)
|
||||
set(size) = prefs.edit().putInt(FONT_SIZE, size).apply()
|
||||
|
||||
var gravity: Int
|
||||
get() = prefs.getInt(GRAVITY, GRAVITY_LEFT)
|
||||
set(size) = prefs.edit().putInt(GRAVITY, size).apply()
|
||||
|
||||
var currentNoteId: Int
|
||||
get() = prefs.getInt(CURRENT_NOTE_ID, 1)
|
||||
set(id) = prefs.edit().putInt(CURRENT_NOTE_ID, id).apply()
|
||||
|
||||
var widgetNoteId: Int
|
||||
get() = prefs.getInt(WIDGET_NOTE_ID, 1)
|
||||
set(id) = prefs.edit().putInt(WIDGET_NOTE_ID, id).apply()
|
||||
|
||||
var placeCursorToEnd: Boolean
|
||||
get() = prefs.getBoolean(CURSOR_PLACEMENT, true)
|
||||
set(placement) = prefs.edit().putBoolean(CURSOR_PLACEMENT, placement).apply()
|
||||
|
||||
var enableLineWrap: Boolean
|
||||
get() = prefs.getBoolean(ENABLE_LINE_WRAP, true)
|
||||
set(enableLineWrap) = prefs.edit().putBoolean(ENABLE_LINE_WRAP, enableLineWrap).apply()
|
||||
|
||||
var lastUsedExtension: String
|
||||
get() = prefs.getString(LAST_USED_EXTENSION, "txt")
|
||||
set(lastUsedExtension) = prefs.edit().putString(LAST_USED_EXTENSION, lastUsedExtension).apply()
|
||||
|
||||
var lastUsedSavePath: String
|
||||
get() = prefs.getString(LAST_USED_SAVE_PATH, Environment.getExternalStorageDirectory().toString())
|
||||
set(lastUsedSavePath) = prefs.edit().putString(LAST_USED_SAVE_PATH, lastUsedSavePath).apply()
|
||||
|
||||
var useIncognitoMode: Boolean
|
||||
get() = prefs.getBoolean(USE_INCOGNITO_MODE, false)
|
||||
set(useIncognitoMode) = prefs.edit().putBoolean(USE_INCOGNITO_MODE, useIncognitoMode).apply()
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package com.simplemobiletools.notes.pro.helpers
|
||||
|
||||
const val NOTE_ID = "note_id"
|
||||
const val OPEN_NOTE_ID = "open_note_id"
|
||||
|
||||
// shared preferences
|
||||
const val CURRENT_NOTE_ID = "current_note_id"
|
||||
const val AUTOSAVE_NOTES = "autosave_notes"
|
||||
const val DISPLAY_SUCCESS = "display_success"
|
||||
const val CLICKABLE_LINKS = "clickable_links"
|
||||
const val WIDGET_NOTE_ID = "widget_note_id"
|
||||
const val MONOSPACED_FONT = "monospaced_font"
|
||||
const val SHOW_KEYBOARD = "show_keyboard"
|
||||
const val SHOW_NOTE_PICKER = "show_note_picker"
|
||||
const val SHOW_WORD_COUNT = "show_word_count"
|
||||
const val FONT_SIZE = "font_size"
|
||||
const val GRAVITY = "gravity"
|
||||
const val CURSOR_PLACEMENT = "cursor_placement"
|
||||
const val LAST_USED_EXTENSION = "last_used_extension"
|
||||
const val LAST_USED_SAVE_PATH = "last_used_save_path"
|
||||
const val ENABLE_LINE_WRAP = "enable_line_wrap"
|
||||
const val USE_INCOGNITO_MODE = "use_incognito_mode"
|
||||
|
||||
// gravity
|
||||
const val GRAVITY_LEFT = 0
|
||||
const val GRAVITY_CENTER = 1
|
||||
const val GRAVITY_RIGHT = 2
|
||||
|
||||
// font sizes
|
||||
const val FONT_SIZE_SMALL = 0
|
||||
const val FONT_SIZE_MEDIUM = 1
|
||||
const val FONT_SIZE_LARGE = 2
|
||||
const val FONT_SIZE_EXTRA_LARGE = 3
|
||||
|
||||
// note types
|
||||
const val TYPE_NOTE = 0
|
||||
const val TYPE_CHECKLIST = 1
|
||||
|
||||
// mime types
|
||||
const val MIME_TEXT_PLAIN = "text/plain"
|
@ -0,0 +1,244 @@
|
||||
package com.simplemobiletools.notes.pro.helpers
|
||||
|
||||
import android.appwidget.AppWidgetManager
|
||||
import android.content.ComponentName
|
||||
import android.content.ContentValues
|
||||
import android.content.Context
|
||||
import android.database.Cursor
|
||||
import android.database.sqlite.SQLiteDatabase
|
||||
import android.database.sqlite.SQLiteDatabase.CONFLICT_IGNORE
|
||||
import android.database.sqlite.SQLiteOpenHelper
|
||||
import com.simplemobiletools.commons.extensions.getIntValue
|
||||
import com.simplemobiletools.commons.extensions.getStringValue
|
||||
import com.simplemobiletools.notes.pro.R
|
||||
import com.simplemobiletools.notes.pro.extensions.config
|
||||
import com.simplemobiletools.notes.pro.models.Note
|
||||
import com.simplemobiletools.notes.pro.models.Widget
|
||||
import java.io.File
|
||||
import java.util.*
|
||||
|
||||
class DBHelper private constructor(private val mContext: Context) : SQLiteOpenHelper(mContext, DB_NAME, null, DB_VERSION) {
|
||||
private val mDb = writableDatabase
|
||||
|
||||
companion object {
|
||||
private const val DB_NAME = "notes.db"
|
||||
private const val DB_VERSION = 4
|
||||
private const val NOTES_TABLE_NAME = "notes"
|
||||
private const val WIDGETS_TABLE_NAME = "widgets"
|
||||
|
||||
private const val COL_ID = "id"
|
||||
private const val COL_TITLE = "title"
|
||||
private const val COL_VALUE = "value"
|
||||
private const val COL_TYPE = "type"
|
||||
private const val COL_PATH = "path"
|
||||
|
||||
private const val COL_WIDGET_ID = "widget_id"
|
||||
private const val COL_NOTE_ID = "note_id"
|
||||
|
||||
fun newInstance(context: Context) = DBHelper(context)
|
||||
}
|
||||
|
||||
override fun onCreate(db: SQLiteDatabase) {
|
||||
db.execSQL("CREATE TABLE $NOTES_TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_TITLE TEXT UNIQUE, $COL_VALUE TEXT, $COL_TYPE INTEGER DEFAULT 0, $COL_PATH TEXT)")
|
||||
db.execSQL("CREATE TABLE $WIDGETS_TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_WIDGET_ID INTEGER DEFAULT 0, $COL_NOTE_ID INTEGER DEFAULT 0)")
|
||||
insertFirstNote(db)
|
||||
}
|
||||
|
||||
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
|
||||
if (oldVersion < 2) {
|
||||
db.execSQL("ALTER TABLE $NOTES_TABLE_NAME ADD COLUMN $COL_TYPE INTEGER DEFAULT 0")
|
||||
}
|
||||
|
||||
if (oldVersion < 3) {
|
||||
db.execSQL("ALTER TABLE $NOTES_TABLE_NAME ADD COLUMN $COL_PATH TEXT DEFAULT ''")
|
||||
}
|
||||
|
||||
if (oldVersion < 4) {
|
||||
db.execSQL("CREATE TABLE $WIDGETS_TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_WIDGET_ID INTEGER DEFAULT 0, $COL_NOTE_ID INTEGER DEFAULT 0)")
|
||||
insertFirstWidget(db)
|
||||
}
|
||||
}
|
||||
|
||||
private fun insertFirstNote(db: SQLiteDatabase) {
|
||||
val generalNote = mContext.resources.getString(R.string.general_note)
|
||||
val note = Note(1, generalNote, "", TYPE_NOTE)
|
||||
insertNote(note, db)
|
||||
}
|
||||
|
||||
// if a user has exactly 1 widget active, prefill it. Can happen only at upgrading from older app versions
|
||||
private fun insertFirstWidget(db: SQLiteDatabase) {
|
||||
val widgetIDs = AppWidgetManager.getInstance(mContext).getAppWidgetIds(ComponentName(mContext, MyWidgetProvider::class.java))
|
||||
if (widgetIDs.size == 1) {
|
||||
val widget = Widget(widgetIDs.first(), mContext.config.widgetNoteId)
|
||||
insertWidget(widget, db)
|
||||
}
|
||||
}
|
||||
|
||||
private fun insertNote(note: Note, db: SQLiteDatabase) {
|
||||
val values = fillNoteContentValues(note)
|
||||
db.insert(NOTES_TABLE_NAME, null, values)
|
||||
}
|
||||
|
||||
private fun insertWidget(widget: Widget, db: SQLiteDatabase) {
|
||||
val values = fillWidgetContentValues(widget)
|
||||
db.insert(WIDGETS_TABLE_NAME, null, values)
|
||||
}
|
||||
|
||||
fun insertNote(note: Note): Int {
|
||||
val values = fillNoteContentValues(note)
|
||||
return mDb.insertWithOnConflict(NOTES_TABLE_NAME, null, values, CONFLICT_IGNORE).toInt()
|
||||
}
|
||||
|
||||
fun insertWidget(widget: Widget): Int {
|
||||
val values = fillWidgetContentValues(widget)
|
||||
return mDb.insertWithOnConflict(WIDGETS_TABLE_NAME, null, values, CONFLICT_IGNORE).toInt()
|
||||
}
|
||||
|
||||
private fun fillNoteContentValues(note: Note): ContentValues {
|
||||
return ContentValues().apply {
|
||||
put(COL_TITLE, note.title)
|
||||
put(COL_VALUE, note.value)
|
||||
put(COL_PATH, note.path)
|
||||
put(COL_TYPE, 0)
|
||||
}
|
||||
}
|
||||
|
||||
private fun fillWidgetContentValues(widget: Widget): ContentValues {
|
||||
return ContentValues().apply {
|
||||
put(COL_WIDGET_ID, widget.widgetId)
|
||||
put(COL_NOTE_ID, widget.noteId)
|
||||
}
|
||||
}
|
||||
|
||||
fun deleteNote(id: Int) {
|
||||
mDb.delete(NOTES_TABLE_NAME, "$COL_ID = $id", null)
|
||||
mDb.delete(WIDGETS_TABLE_NAME, "$COL_NOTE_ID = $id", null)
|
||||
}
|
||||
|
||||
fun doesNoteTitleExist(title: String): Boolean {
|
||||
val cols = arrayOf(COL_ID)
|
||||
val selection = "$COL_TITLE = ? COLLATE NOCASE"
|
||||
val selectionArgs = arrayOf(title)
|
||||
var cursor: Cursor? = null
|
||||
try {
|
||||
cursor = mDb.query(NOTES_TABLE_NAME, cols, selection, selectionArgs, null, null, null)
|
||||
return cursor.count == 1
|
||||
} finally {
|
||||
cursor?.close()
|
||||
}
|
||||
}
|
||||
|
||||
fun getNotes(): ArrayList<Note> {
|
||||
val notes = ArrayList<Note>()
|
||||
val cols = arrayOf(COL_ID, COL_TITLE, COL_VALUE, COL_TYPE, COL_PATH)
|
||||
var cursor: Cursor? = null
|
||||
try {
|
||||
cursor = mDb.query(NOTES_TABLE_NAME, cols, null, null, null, null, "$COL_TITLE COLLATE NOCASE ASC")
|
||||
if (cursor?.moveToFirst() == true) {
|
||||
do {
|
||||
try {
|
||||
val id = cursor.getIntValue(COL_ID)
|
||||
val title = cursor.getStringValue(COL_TITLE)
|
||||
val value = cursor.getStringValue(COL_VALUE)
|
||||
val type = cursor.getIntValue(COL_TYPE)
|
||||
val path = cursor.getStringValue(COL_PATH) ?: ""
|
||||
if (path.isNotEmpty() && !File(path).exists()) {
|
||||
deleteNote(id)
|
||||
continue
|
||||
}
|
||||
|
||||
val note = Note(id, title, value, type, path)
|
||||
notes.add(note)
|
||||
} catch (e: Exception) {
|
||||
continue
|
||||
}
|
||||
} while (cursor.moveToNext())
|
||||
}
|
||||
} finally {
|
||||
cursor?.close()
|
||||
}
|
||||
|
||||
return notes
|
||||
}
|
||||
|
||||
fun getNoteWithId(id: Int): Note? {
|
||||
val cols = arrayOf(COL_TITLE, COL_VALUE, COL_TYPE, COL_PATH)
|
||||
val selection = "$COL_ID = ?"
|
||||
val selectionArgs = arrayOf(id.toString())
|
||||
var note: Note? = null
|
||||
var cursor: Cursor? = null
|
||||
try {
|
||||
cursor = mDb.query(NOTES_TABLE_NAME, cols, selection, selectionArgs, null, null, null)
|
||||
if (cursor?.moveToFirst() == true) {
|
||||
val title = cursor.getStringValue(COL_TITLE)
|
||||
val value = cursor.getStringValue(COL_VALUE)
|
||||
val type = cursor.getIntValue(COL_TYPE)
|
||||
val path = cursor.getStringValue(COL_PATH) ?: ""
|
||||
note = Note(id, title, value, type, path)
|
||||
}
|
||||
} finally {
|
||||
cursor?.close()
|
||||
}
|
||||
return note
|
||||
}
|
||||
|
||||
fun getNoteId(path: String): Int {
|
||||
val cols = arrayOf(COL_ID)
|
||||
val selection = "$COL_PATH = ?"
|
||||
val selectionArgs = arrayOf(path)
|
||||
var cursor: Cursor? = null
|
||||
try {
|
||||
cursor = mDb.query(NOTES_TABLE_NAME, cols, selection, selectionArgs, null, null, null)
|
||||
if (cursor?.moveToFirst() == true) {
|
||||
return cursor.getIntValue(COL_ID)
|
||||
}
|
||||
} finally {
|
||||
cursor?.close()
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
fun updateNoteValue(note: Note) {
|
||||
val values = ContentValues().apply { put(COL_VALUE, note.value) }
|
||||
updateNote(note.id, values)
|
||||
}
|
||||
|
||||
fun updateNoteTitle(note: Note) {
|
||||
val values = ContentValues().apply { put(COL_TITLE, note.title) }
|
||||
updateNote(note.id, values)
|
||||
}
|
||||
|
||||
fun updateNotePath(note: Note) {
|
||||
val values = ContentValues().apply { put(COL_PATH, note.path) }
|
||||
updateNote(note.id, values)
|
||||
}
|
||||
|
||||
private fun updateNote(id: Int, values: ContentValues) {
|
||||
val selection = "$COL_ID = ?"
|
||||
val selectionArgs = arrayOf(id.toString())
|
||||
mDb.update(NOTES_TABLE_NAME, values, selection, selectionArgs)
|
||||
}
|
||||
|
||||
fun isValidId(id: Int) = id > 0
|
||||
|
||||
fun getWidgets(): ArrayList<Widget> {
|
||||
val widgets = ArrayList<Widget>()
|
||||
val cols = arrayOf(COL_WIDGET_ID, COL_NOTE_ID)
|
||||
var cursor: Cursor? = null
|
||||
try {
|
||||
cursor = mDb.query(WIDGETS_TABLE_NAME, cols, null, null, null, null, null)
|
||||
if (cursor?.moveToFirst() == true) {
|
||||
do {
|
||||
val widgetId = cursor.getIntValue(COL_WIDGET_ID)
|
||||
val noteId = cursor.getIntValue(COL_NOTE_ID)
|
||||
val widget = Widget(widgetId, noteId)
|
||||
widgets.add(widget)
|
||||
} while (cursor.moveToNext())
|
||||
}
|
||||
} finally {
|
||||
cursor?.close()
|
||||
}
|
||||
|
||||
return widgets
|
||||
}
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
package com.simplemobiletools.notes.pro.helpers
|
||||
|
||||
import android.text.Selection
|
||||
import android.text.Spannable
|
||||
import android.text.method.ArrowKeyMovementMethod
|
||||
import android.text.style.ClickableSpan
|
||||
import android.view.MotionEvent
|
||||
import android.widget.TextView
|
||||
|
||||
class MyMovementMethod : ArrowKeyMovementMethod() {
|
||||
companion object {
|
||||
private var sInstance: MyMovementMethod? = null
|
||||
|
||||
fun getInstance(): MyMovementMethod {
|
||||
if (sInstance == null) {
|
||||
sInstance = MyMovementMethod()
|
||||
}
|
||||
return sInstance!!
|
||||
}
|
||||
}
|
||||
|
||||
override fun onTouchEvent(widget: TextView, buffer: Spannable, event: MotionEvent): Boolean {
|
||||
val action = event.action
|
||||
|
||||
if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
|
||||
var x = event.x.toInt()
|
||||
var y = event.y.toInt()
|
||||
|
||||
x -= widget.totalPaddingLeft
|
||||
y -= widget.totalPaddingTop
|
||||
|
||||
x += widget.scrollX
|
||||
y += widget.scrollY
|
||||
|
||||
val layout = widget.layout
|
||||
val line = layout.getLineForVertical(y)
|
||||
val off = layout.getOffsetForHorizontal(line, x.toFloat())
|
||||
|
||||
val links = buffer.getSpans(off, off, ClickableSpan::class.java)
|
||||
if (links.isNotEmpty()) {
|
||||
if (action == MotionEvent.ACTION_UP) {
|
||||
links[0].onClick(widget)
|
||||
} else if (action == MotionEvent.ACTION_DOWN) {
|
||||
Selection.setSelection(buffer,
|
||||
buffer.getSpanStart(links[0]),
|
||||
buffer.getSpanEnd(links[0]))
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return super.onTouchEvent(widget, buffer, event)
|
||||
}
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
package com.simplemobiletools.notes.pro.helpers
|
||||
|
||||
import android.app.PendingIntent
|
||||
import android.appwidget.AppWidgetManager
|
||||
import android.appwidget.AppWidgetProvider
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.widget.RemoteViews
|
||||
import com.simplemobiletools.commons.extensions.getLaunchIntent
|
||||
import com.simplemobiletools.commons.extensions.setBackgroundColor
|
||||
import com.simplemobiletools.notes.pro.R
|
||||
import com.simplemobiletools.notes.pro.activities.SplashActivity
|
||||
import com.simplemobiletools.notes.pro.extensions.config
|
||||
import com.simplemobiletools.notes.pro.extensions.dbHelper
|
||||
import com.simplemobiletools.notes.pro.models.Widget
|
||||
import com.simplemobiletools.notes.pro.services.WidgetService
|
||||
|
||||
class MyWidgetProvider : AppWidgetProvider() {
|
||||
private fun setupAppOpenIntent(context: Context, views: RemoteViews, id: Int, widget: Widget) {
|
||||
val intent = context.getLaunchIntent() ?: Intent(context, SplashActivity::class.java)
|
||||
intent.putExtra(OPEN_NOTE_ID, widget.noteId)
|
||||
val pendingIntent = PendingIntent.getActivity(context, widget.widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT)
|
||||
views.setOnClickPendingIntent(id, pendingIntent)
|
||||
}
|
||||
|
||||
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
|
||||
super.onUpdate(context, appWidgetManager, appWidgetIds)
|
||||
val widgets = context.dbHelper.getWidgets()
|
||||
widgets.forEach {
|
||||
val views = RemoteViews(context.packageName, R.layout.widget)
|
||||
views.setBackgroundColor(R.id.notes_widget_holder, context.config.widgetBgColor)
|
||||
setupAppOpenIntent(context, views, R.id.notes_widget_holder, it)
|
||||
|
||||
Intent(context, WidgetService::class.java).apply {
|
||||
putExtra(NOTE_ID, it.noteId)
|
||||
data = Uri.parse(this.toUri(Intent.URI_INTENT_SCHEME))
|
||||
views.setRemoteAdapter(R.id.notes_widget_listview, this)
|
||||
}
|
||||
|
||||
val startActivityIntent = context.getLaunchIntent() ?: Intent(context, SplashActivity::class.java)
|
||||
startActivityIntent.putExtra(OPEN_NOTE_ID, it.noteId)
|
||||
val startActivityPendingIntent = PendingIntent.getActivity(context, it.widgetId, startActivityIntent, PendingIntent.FLAG_UPDATE_CURRENT)
|
||||
views.setPendingIntentTemplate(R.id.notes_widget_listview, startActivityPendingIntent)
|
||||
|
||||
appWidgetManager.updateAppWidget(it.widgetId, views)
|
||||
appWidgetManager.notifyAppWidgetViewDataChanged(it.widgetId, R.id.notes_widget_listview)
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user