From 73e7b261b33703abeb1fd02c93acb8806c974a27 Mon Sep 17 00:00:00 2001 From: vbernier02 Date: Mon, 3 Feb 2025 20:06:12 +0100 Subject: [PATCH 01/15] add icone visibity vector --- .../main/kotlin/org/fossify/notes/activities/MainActivity.kt | 1 + app/src/main/res/drawable/ic_visibility_vector.xml | 3 +++ app/src/main/res/menu/menu.xml | 5 +++++ 3 files changed, 9 insertions(+) create mode 100644 app/src/main/res/drawable/ic_visibility_vector.xml diff --git a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt index aebdb5eb..9db9a752 100644 --- a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt @@ -250,6 +250,7 @@ class MainActivity : SimpleActivity() { R.id.share -> fragment?.handleUnlocking { shareText() } R.id.cab_create_shortcut -> createShortcut() R.id.lock_note -> lockNote() + //R.id.read_only -> readOnly R.id.unlock_note -> unlockNote() R.id.open_file -> tryOpenFile() R.id.import_folder -> openFolder() diff --git a/app/src/main/res/drawable/ic_visibility_vector.xml b/app/src/main/res/drawable/ic_visibility_vector.xml new file mode 100644 index 00000000..a0ef2a1e --- /dev/null +++ b/app/src/main/res/drawable/ic_visibility_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/app/src/main/res/menu/menu.xml b/app/src/main/res/menu/menu.xml index 40046e55..9fe376b8 100644 --- a/app/src/main/res/menu/menu.xml +++ b/app/src/main/res/menu/menu.xml @@ -21,6 +21,11 @@ android:icon="@drawable/ic_plus_vector" android:title="@string/create_new_note" app:showAsAction="always" /> + Date: Fri, 7 Mar 2025 01:32:10 +0100 Subject: [PATCH 02/15] read-only implementation --- .../5.json | 146 ++++++++++++++++++ .../fossify/notes/activities/MainActivity.kt | 42 ++++- .../fossify/notes/databases/NotesDatabase.kt | 9 +- .../fossify/notes/fragments/NoteFragment.kt | 11 ++ .../kotlin/org/fossify/notes/models/Note.kt | 3 +- .../res/drawable/ic_visibility_off_vector.xml | 3 + app/src/main/res/menu/menu.xml | 7 +- app/src/main/res/values/strings.xml | 2 + 8 files changed, 219 insertions(+), 4 deletions(-) create mode 100644 app/schemas/org.fossify.notes.databases.NotesDatabase/5.json create mode 100644 app/src/main/res/drawable/ic_visibility_off_vector.xml diff --git a/app/schemas/org.fossify.notes.databases.NotesDatabase/5.json b/app/schemas/org.fossify.notes.databases.NotesDatabase/5.json new file mode 100644 index 00000000..92cf3f33 --- /dev/null +++ b/app/schemas/org.fossify.notes.databases.NotesDatabase/5.json @@ -0,0 +1,146 @@ +{ + "formatVersion": 1, + "database": { + "version": 5, + "identityHash": "966c9b683bea02221758ffc16bf6247c", + "entities": [ + { + "tableName": "notes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `title` TEXT NOT NULL, `value` TEXT NOT NULL, `type` INTEGER NOT NULL, `path` TEXT NOT NULL, `protection_type` INTEGER NOT NULL, `protection_hash` TEXT NOT NULL, `is_read_only` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "path", + "columnName": "path", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "protectionType", + "columnName": "protection_type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "protectionHash", + "columnName": "protection_hash", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isReadOnly", + "columnName": "is_read_only", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_notes_id", + "unique": true, + "columnNames": [ + "id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_notes_id` ON `${TABLE_NAME}` (`id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "widgets", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `widget_id` INTEGER NOT NULL, `note_id` INTEGER NOT NULL, `widget_bg_color` INTEGER NOT NULL, `widget_text_color` INTEGER NOT NULL, `widget_show_title` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "widgetId", + "columnName": "widget_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "noteId", + "columnName": "note_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "widgetBgColor", + "columnName": "widget_bg_color", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "widgetTextColor", + "columnName": "widget_text_color", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "widgetShowTitle", + "columnName": "widget_show_title", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_widgets_widget_id", + "unique": true, + "columnNames": [ + "widget_id" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_widgets_widget_id` ON `${TABLE_NAME}` (`widget_id`)" + } + ], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '966c9b683bea02221758ffc16bf6247c')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt index 9db9a752..ba9d1898 100644 --- a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt @@ -20,6 +20,7 @@ import android.util.TypedValue import android.view.ActionMode import android.view.Gravity import android.view.MenuItem +import android.view.View import android.view.inputmethod.EditorInfo import android.webkit.WebResourceRequest import android.webkit.WebView @@ -43,6 +44,7 @@ import org.fossify.notes.databases.NotesDatabase import org.fossify.notes.databinding.ActivityMainBinding import org.fossify.notes.dialogs.* import org.fossify.notes.extensions.* +import org.fossify.notes.fragments.NoteFragment import org.fossify.notes.fragments.TextFragment import org.fossify.notes.helpers.* import org.fossify.notes.models.Note @@ -91,6 +93,18 @@ class MainActivity : SimpleActivity() { super.onCreate(savedInstanceState) setContentView(binding.root) appLaunched(BuildConfig.APPLICATION_ID) + + mCurrentNote = Note( + id = null, + title = "", + value = "", + type = NoteType.TYPE_TEXT, + path = "", + protectionType = PROTECTION_NONE, + protectionHash = "", + isReadOnly = false + ) + setupOptionsMenu() refreshMenuItems() @@ -225,6 +239,9 @@ class MainActivity : SimpleActivity() { saveNoteButton = findItem(R.id.save_note) saveNoteButton!!.isVisible = !config.autosaveNotes && showSaveButton && (::mCurrentNote.isInitialized && mCurrentNote.type == NoteType.TYPE_TEXT) + + findItem(R.id.read_only).isVisible = !mCurrentNote.isReadOnly + findItem(R.id.unlock_read_only).isVisible = mCurrentNote.isReadOnly } binding.pagerTabStrip.beVisibleIf(multipleNotesExist) @@ -250,8 +267,9 @@ class MainActivity : SimpleActivity() { R.id.share -> fragment?.handleUnlocking { shareText() } R.id.cab_create_shortcut -> createShortcut() R.id.lock_note -> lockNote() - //R.id.read_only -> readOnly R.id.unlock_note -> unlockNote() + R.id.read_only -> toggleReadOnly() + R.id.unlock_read_only -> toggleReadOnly() R.id.open_file -> tryOpenFile() R.id.import_folder -> openFolder() R.id.export_as_file -> fragment?.handleUnlocking { tryExportAsFile() } @@ -474,6 +492,7 @@ class MainActivity : SimpleActivity() { mCurrentNote = mNotes[it] config.currentNoteId = mCurrentNote.id!! refreshMenuItems() + checkReadOnlyState() } } @@ -484,6 +503,14 @@ class MainActivity : SimpleActivity() { } } + private fun checkReadOnlyState() { + getCurrentFragment()?.apply { + if (this is TextFragment) { + (this as TextFragment).getNotesView().isEnabled = !mCurrentNote.isReadOnly + } + } + } + private fun setupSearchButtons() { searchQueryET.onTextChangeListener { searchTextChanged(it) @@ -1312,4 +1339,17 @@ class MainActivity : SimpleActivity() { updateWidgets() } } + + private fun toggleReadOnly() { + mCurrentNote.isReadOnly = !mCurrentNote.isReadOnly + NotesHelper(this).insertOrUpdateNote(mCurrentNote) { + refreshMenuItems() + getCurrentFragment()?.apply { + (this as? NoteFragment)?.updateLockedViews(mCurrentNote) + if (this is TextFragment) { + (this as TextFragment).getNotesView().isEnabled = !mCurrentNote.isReadOnly + } + } + } + } } diff --git a/app/src/main/kotlin/org/fossify/notes/databases/NotesDatabase.kt b/app/src/main/kotlin/org/fossify/notes/databases/NotesDatabase.kt index 9e7aa1a6..4f85125f 100644 --- a/app/src/main/kotlin/org/fossify/notes/databases/NotesDatabase.kt +++ b/app/src/main/kotlin/org/fossify/notes/databases/NotesDatabase.kt @@ -16,7 +16,7 @@ import org.fossify.notes.models.NoteType import org.fossify.notes.models.Widget import java.util.concurrent.Executors -@Database(entities = [Note::class, Widget::class], version = 4) +@Database(entities = [Note::class, Widget::class], version = 5) abstract class NotesDatabase : RoomDatabase() { abstract fun NotesDao(): NotesDao @@ -42,6 +42,7 @@ abstract class NotesDatabase : RoomDatabase() { .addMigrations(MIGRATION_1_2) .addMigrations(MIGRATION_2_3) .addMigrations(MIGRATION_3_4) + .addMigrations(MIGRATION_4_5) .build() db!!.openHelper.setWriteAheadLoggingEnabled(true) } @@ -85,5 +86,11 @@ abstract class NotesDatabase : RoomDatabase() { database.execSQL("ALTER TABLE widgets ADD COLUMN widget_show_title INTEGER NOT NULL DEFAULT 0") } } + + private val MIGRATION_4_5 = object : Migration(4, 5) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("ALTER TABLE notes ADD COLUMN is_read_only INTEGER NOT NULL DEFAULT 0") + } + } } } diff --git a/app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt b/app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt index 3eb0835e..11ff0cfe 100644 --- a/app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt +++ b/app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt @@ -7,6 +7,7 @@ import android.widget.TextView import androidx.fragment.app.Fragment import org.fossify.commons.extensions.* import org.fossify.commons.helpers.PROTECTION_NONE +import org.fossify.notes.R import org.fossify.notes.activities.MainActivity import org.fossify.notes.extensions.config import org.fossify.notes.extensions.getPercentageFontSize @@ -17,6 +18,16 @@ abstract class NoteFragment : Fragment() { protected var note: Note? = null var shouldShowLockedContent = false + fun updateLockedViews(note: Note) { + setupLockedViews(object : CommonNoteBinding { + override val root: View get() = view!! + override val noteLockedLayout: View get() = view!!.findViewById(R.id.note_locked_layout) + override val noteLockedImage: ImageView get() = view!!.findViewById(R.id.note_locked_image) + override val noteLockedLabel: TextView get() = view!!.findViewById(R.id.note_locked_label) + override val noteLockedShow: TextView get() = view!!.findViewById(R.id.note_locked_show) + }, note) + } + protected fun setupLockedViews(binding: CommonNoteBinding, note: Note) { binding.apply { noteLockedLayout.beVisibleIf(note.isLocked() && !shouldShowLockedContent) diff --git a/app/src/main/kotlin/org/fossify/notes/models/Note.kt b/app/src/main/kotlin/org/fossify/notes/models/Note.kt index 0aecc47b..678c8769 100644 --- a/app/src/main/kotlin/org/fossify/notes/models/Note.kt +++ b/app/src/main/kotlin/org/fossify/notes/models/Note.kt @@ -25,7 +25,8 @@ data class Note( @ColumnInfo(name = "type") var type: NoteType, @ColumnInfo(name = "path") var path: String, @ColumnInfo(name = "protection_type") var protectionType: Int, - @ColumnInfo(name = "protection_hash") var protectionHash: String + @ColumnInfo(name = "protection_hash") var protectionHash: String, + @ColumnInfo(name = "is_read_only") var isReadOnly: Boolean = false, ) { fun getNoteStoredValue(context: Context): String? { diff --git a/app/src/main/res/drawable/ic_visibility_off_vector.xml b/app/src/main/res/drawable/ic_visibility_off_vector.xml new file mode 100644 index 00000000..8fc6602e --- /dev/null +++ b/app/src/main/res/drawable/ic_visibility_off_vector.xml @@ -0,0 +1,3 @@ + + + diff --git a/app/src/main/res/menu/menu.xml b/app/src/main/res/menu/menu.xml index 9fe376b8..3d10a9f9 100644 --- a/app/src/main/res/menu/menu.xml +++ b/app/src/main/res/menu/menu.xml @@ -24,7 +24,12 @@ + New checklist The app cannot load files over the internet To backup notes automatically, please grant the app permission to schedule exact alarms. + Note read only + Note read only disable Open file From 62fe414760895fe76b4949a146e88ac347970fe3 Mon Sep 17 00:00:00 2001 From: vbernier02 Date: Wed, 12 Mar 2025 22:29:43 +0100 Subject: [PATCH 03/15] Cleaning code --- .../fossify/notes/activities/MainActivity.kt | 17 +++-------------- .../fossify/notes/fragments/NoteFragment.kt | 18 ++++++++++-------- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt index ba9d1898..49e7adbd 100644 --- a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt @@ -93,17 +93,6 @@ class MainActivity : SimpleActivity() { super.onCreate(savedInstanceState) setContentView(binding.root) appLaunched(BuildConfig.APPLICATION_ID) - - mCurrentNote = Note( - id = null, - title = "", - value = "", - type = NoteType.TYPE_TEXT, - path = "", - protectionType = PROTECTION_NONE, - protectionHash = "", - isReadOnly = false - ) setupOptionsMenu() refreshMenuItems() @@ -240,8 +229,8 @@ class MainActivity : SimpleActivity() { saveNoteButton!!.isVisible = !config.autosaveNotes && showSaveButton && (::mCurrentNote.isInitialized && mCurrentNote.type == NoteType.TYPE_TEXT) - findItem(R.id.read_only).isVisible = !mCurrentNote.isReadOnly - findItem(R.id.unlock_read_only).isVisible = mCurrentNote.isReadOnly + findItem(R.id.read_only).isVisible = (::mCurrentNote.isInitialized && !mCurrentNote.isReadOnly) + findItem(R.id.unlock_read_only).isVisible = (::mCurrentNote.isInitialized && mCurrentNote.isReadOnly) } binding.pagerTabStrip.beVisibleIf(multipleNotesExist) @@ -1345,7 +1334,7 @@ class MainActivity : SimpleActivity() { NotesHelper(this).insertOrUpdateNote(mCurrentNote) { refreshMenuItems() getCurrentFragment()?.apply { - (this as? NoteFragment)?.updateLockedViews(mCurrentNote) + (this as? NoteFragment)?.updateReadOnlyViews(mCurrentNote) if (this is TextFragment) { (this as TextFragment).getNotesView().isEnabled = !mCurrentNote.isReadOnly } diff --git a/app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt b/app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt index 11ff0cfe..d1f3f204 100644 --- a/app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt +++ b/app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt @@ -18,14 +18,16 @@ abstract class NoteFragment : Fragment() { protected var note: Note? = null var shouldShowLockedContent = false - fun updateLockedViews(note: Note) { - setupLockedViews(object : CommonNoteBinding { - override val root: View get() = view!! - override val noteLockedLayout: View get() = view!!.findViewById(R.id.note_locked_layout) - override val noteLockedImage: ImageView get() = view!!.findViewById(R.id.note_locked_image) - override val noteLockedLabel: TextView get() = view!!.findViewById(R.id.note_locked_label) - override val noteLockedShow: TextView get() = view!!.findViewById(R.id.note_locked_show) - }, note) + fun updateReadOnlyViews(note: Note) { + val rootView = view ?: return + val binding = object : CommonNoteBinding { + override val root: View get() = rootView + override val noteLockedLayout: View get() = rootView.findViewById(R.id.note_locked_layout) + override val noteLockedImage: ImageView get() = rootView.findViewById(R.id.note_locked_image) + override val noteLockedLabel: TextView get() = rootView.findViewById(R.id.note_locked_label) + override val noteLockedShow: TextView get() = rootView.findViewById(R.id.note_locked_show) + } + setupLockedViews(binding, note) } protected fun setupLockedViews(binding: CommonNoteBinding, note: Note) { From 6b2f88adde16f6225561ccee34e09cf165c6938c Mon Sep 17 00:00:00 2001 From: vbernier02 Date: Mon, 17 Mar 2025 17:01:19 +0100 Subject: [PATCH 04/15] Disable read-only button for checklists --- .../main/kotlin/org/fossify/notes/activities/MainActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt index 49e7adbd..1c19384a 100644 --- a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt @@ -229,8 +229,8 @@ class MainActivity : SimpleActivity() { saveNoteButton!!.isVisible = !config.autosaveNotes && showSaveButton && (::mCurrentNote.isInitialized && mCurrentNote.type == NoteType.TYPE_TEXT) - findItem(R.id.read_only).isVisible = (::mCurrentNote.isInitialized && !mCurrentNote.isReadOnly) - findItem(R.id.unlock_read_only).isVisible = (::mCurrentNote.isInitialized && mCurrentNote.isReadOnly) + findItem(R.id.read_only).isVisible = (::mCurrentNote.isInitialized && !mCurrentNote.isReadOnly && mCurrentNote.type != NoteType.TYPE_CHECKLIST) + findItem(R.id.unlock_read_only).isVisible = (::mCurrentNote.isInitialized && mCurrentNote.isReadOnly && mCurrentNote.type != NoteType.TYPE_CHECKLIST) } binding.pagerTabStrip.beVisibleIf(multipleNotesExist) From 252b7e6930089bc96f93046a464a2b6ec21cbac6 Mon Sep 17 00:00:00 2001 From: vbernier02 Date: Mon, 17 Mar 2025 20:27:59 +0100 Subject: [PATCH 05/15] debug read only --- .../kotlin/org/fossify/notes/helpers/NotesHelper.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/notes/helpers/NotesHelper.kt b/app/src/main/kotlin/org/fossify/notes/helpers/NotesHelper.kt index fd438f73..92adfacb 100644 --- a/app/src/main/kotlin/org/fossify/notes/helpers/NotesHelper.kt +++ b/app/src/main/kotlin/org/fossify/notes/helpers/NotesHelper.kt @@ -72,9 +72,15 @@ class NotesHelper(val context: Context) { fun insertOrUpdateNote(note: Note, callback: ((newNoteId: Long) -> Unit)? = null) { ensureBackgroundThread { - val noteId = context.notesDB.insertOrUpdate(note) - Handler(Looper.getMainLooper()).post { - callback?.invoke(noteId) + if (note.isReadOnly) { + Handler(Looper.getMainLooper()).post { + callback?.invoke(note.id ?: -1L) + } + } else { + val noteId = context.notesDB.insertOrUpdate(note) + Handler(Looper.getMainLooper()).post { + callback?.invoke(noteId) + } } } } From 8075ded85e6aaf2e67779c55fc359c89f4b1d5cd Mon Sep 17 00:00:00 2001 From: vbernier02 Date: Mon, 17 Mar 2025 20:55:00 +0100 Subject: [PATCH 06/15] format code and optimize imports --- .../kotlin/org/fossify/notes/activities/MainActivity.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt index 1c19384a..4f4b9e7d 100644 --- a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt @@ -20,7 +20,6 @@ import android.util.TypedValue import android.view.ActionMode import android.view.Gravity import android.view.MenuItem -import android.view.View import android.view.inputmethod.EditorInfo import android.webkit.WebResourceRequest import android.webkit.WebView @@ -93,7 +92,7 @@ class MainActivity : SimpleActivity() { super.onCreate(savedInstanceState) setContentView(binding.root) appLaunched(BuildConfig.APPLICATION_ID) - + setupOptionsMenu() refreshMenuItems() @@ -230,7 +229,8 @@ class MainActivity : SimpleActivity() { !config.autosaveNotes && showSaveButton && (::mCurrentNote.isInitialized && mCurrentNote.type == NoteType.TYPE_TEXT) findItem(R.id.read_only).isVisible = (::mCurrentNote.isInitialized && !mCurrentNote.isReadOnly && mCurrentNote.type != NoteType.TYPE_CHECKLIST) - findItem(R.id.unlock_read_only).isVisible = (::mCurrentNote.isInitialized && mCurrentNote.isReadOnly && mCurrentNote.type != NoteType.TYPE_CHECKLIST) + findItem(R.id.unlock_read_only).isVisible = + (::mCurrentNote.isInitialized && mCurrentNote.isReadOnly && mCurrentNote.type != NoteType.TYPE_CHECKLIST) } binding.pagerTabStrip.beVisibleIf(multipleNotesExist) From ba5647490521d39f27776782cde7ed960431ba82 Mon Sep 17 00:00:00 2001 From: vbernier02 Date: Mon, 17 Mar 2025 21:28:23 +0100 Subject: [PATCH 07/15] cleaning --- .../org/fossify/notes/activities/MainActivity.kt | 1 - .../org/fossify/notes/fragments/NoteFragment.kt | 12 ------------ 2 files changed, 13 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt index 4f4b9e7d..14ebd800 100644 --- a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt @@ -1334,7 +1334,6 @@ class MainActivity : SimpleActivity() { NotesHelper(this).insertOrUpdateNote(mCurrentNote) { refreshMenuItems() getCurrentFragment()?.apply { - (this as? NoteFragment)?.updateReadOnlyViews(mCurrentNote) if (this is TextFragment) { (this as TextFragment).getNotesView().isEnabled = !mCurrentNote.isReadOnly } diff --git a/app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt b/app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt index d1f3f204..564c8585 100644 --- a/app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt +++ b/app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt @@ -18,18 +18,6 @@ abstract class NoteFragment : Fragment() { protected var note: Note? = null var shouldShowLockedContent = false - fun updateReadOnlyViews(note: Note) { - val rootView = view ?: return - val binding = object : CommonNoteBinding { - override val root: View get() = rootView - override val noteLockedLayout: View get() = rootView.findViewById(R.id.note_locked_layout) - override val noteLockedImage: ImageView get() = rootView.findViewById(R.id.note_locked_image) - override val noteLockedLabel: TextView get() = rootView.findViewById(R.id.note_locked_label) - override val noteLockedShow: TextView get() = rootView.findViewById(R.id.note_locked_show) - } - setupLockedViews(binding, note) - } - protected fun setupLockedViews(binding: CommonNoteBinding, note: Note) { binding.apply { noteLockedLayout.beVisibleIf(note.isLocked() && !shouldShowLockedContent) From 3439158f3c352499af942514e3479e0f0e878323 Mon Sep 17 00:00:00 2001 From: vbernier02 Date: Mon, 17 Mar 2025 21:28:59 +0100 Subject: [PATCH 08/15] cleaning --- app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt b/app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt index 564c8585..3eb0835e 100644 --- a/app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt +++ b/app/src/main/kotlin/org/fossify/notes/fragments/NoteFragment.kt @@ -7,7 +7,6 @@ import android.widget.TextView import androidx.fragment.app.Fragment import org.fossify.commons.extensions.* import org.fossify.commons.helpers.PROTECTION_NONE -import org.fossify.notes.R import org.fossify.notes.activities.MainActivity import org.fossify.notes.extensions.config import org.fossify.notes.extensions.getPercentageFontSize From 711a2965c91b96221ab37e529f03bbd29b43e2eb Mon Sep 17 00:00:00 2001 From: vbernier02 Date: Tue, 18 Mar 2025 18:59:11 +0100 Subject: [PATCH 09/15] read-only implementation (2) --- .../fossify/notes/activities/MainActivity.kt | 18 ++++++++---------- .../org/fossify/notes/helpers/NotesHelper.kt | 4 ++-- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt index 14ebd800..b48532b0 100644 --- a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt @@ -43,7 +43,6 @@ import org.fossify.notes.databases.NotesDatabase import org.fossify.notes.databinding.ActivityMainBinding import org.fossify.notes.dialogs.* import org.fossify.notes.extensions.* -import org.fossify.notes.fragments.NoteFragment import org.fossify.notes.fragments.TextFragment import org.fossify.notes.helpers.* import org.fossify.notes.models.Note @@ -92,7 +91,6 @@ class MainActivity : SimpleActivity() { super.onCreate(savedInstanceState) setContentView(binding.root) appLaunched(BuildConfig.APPLICATION_ID) - setupOptionsMenu() refreshMenuItems() @@ -492,14 +490,6 @@ class MainActivity : SimpleActivity() { } } - private fun checkReadOnlyState() { - getCurrentFragment()?.apply { - if (this is TextFragment) { - (this as TextFragment).getNotesView().isEnabled = !mCurrentNote.isReadOnly - } - } - } - private fun setupSearchButtons() { searchQueryET.onTextChangeListener { searchTextChanged(it) @@ -1329,6 +1319,14 @@ class MainActivity : SimpleActivity() { } } + private fun checkReadOnlyState() { + getCurrentFragment()?.apply { + if (this is TextFragment) { + (this as TextFragment).getNotesView().isEnabled = !mCurrentNote.isReadOnly + } + } + } + private fun toggleReadOnly() { mCurrentNote.isReadOnly = !mCurrentNote.isReadOnly NotesHelper(this).insertOrUpdateNote(mCurrentNote) { diff --git a/app/src/main/kotlin/org/fossify/notes/helpers/NotesHelper.kt b/app/src/main/kotlin/org/fossify/notes/helpers/NotesHelper.kt index 92adfacb..9371066a 100644 --- a/app/src/main/kotlin/org/fossify/notes/helpers/NotesHelper.kt +++ b/app/src/main/kotlin/org/fossify/notes/helpers/NotesHelper.kt @@ -72,12 +72,12 @@ class NotesHelper(val context: Context) { fun insertOrUpdateNote(note: Note, callback: ((newNoteId: Long) -> Unit)? = null) { ensureBackgroundThread { + val noteId = context.notesDB.insertOrUpdate(note) if (note.isReadOnly) { Handler(Looper.getMainLooper()).post { - callback?.invoke(note.id ?: -1L) + callback?.invoke(noteId) } } else { - val noteId = context.notesDB.insertOrUpdate(note) Handler(Looper.getMainLooper()).post { callback?.invoke(noteId) } From a4bca7778ed4c8493bd98104a019c4dd9f817a61 Mon Sep 17 00:00:00 2001 From: vbernier02 Date: Wed, 30 Apr 2025 22:26:59 +0200 Subject: [PATCH 10/15] read only mode functional --- .../fossify/notes/activities/MainActivity.kt | 87 ++----------------- .../fossify/notes/fragments/TextFragment.kt | 11 ++- .../org/fossify/notes/helpers/NotesHelper.kt | 10 +-- 3 files changed, 14 insertions(+), 94 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt index 271da127..333d8f3d 100644 --- a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt @@ -4,11 +4,7 @@ import android.accounts.NetworkErrorException import android.annotation.SuppressLint import android.content.ActivityNotFoundException import android.content.Intent -import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK -import android.content.Intent.FLAG_ACTIVITY_NEW_TASK -import android.content.Intent.FLAG_ACTIVITY_NO_HISTORY -import android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION -import android.content.Intent.FLAG_GRANT_WRITE_URI_PERMISSION +import android.content.Intent.* import android.content.pm.ShortcutInfo import android.content.pm.ShortcutManager import android.graphics.drawable.Icon @@ -33,59 +29,9 @@ import android.widget.Toast import androidx.appcompat.content.res.AppCompatResources import androidx.core.net.toUri import androidx.viewpager.widget.ViewPager -import org.fossify.commons.dialogs.ConfirmationAdvancedDialog -import org.fossify.commons.dialogs.ConfirmationDialog -import org.fossify.commons.dialogs.FilePickerDialog -import org.fossify.commons.dialogs.RadioGroupDialog -import org.fossify.commons.dialogs.SecurityDialog -import org.fossify.commons.extensions.appLaunched -import org.fossify.commons.extensions.appLockManager -import org.fossify.commons.extensions.applyColorFilter -import org.fossify.commons.extensions.baseConfig -import org.fossify.commons.extensions.beVisibleIf -import org.fossify.commons.extensions.checkWhatsNew -import org.fossify.commons.extensions.clearBackgroundSpans -import org.fossify.commons.extensions.convertToBitmap -import org.fossify.commons.extensions.deleteFile -import org.fossify.commons.extensions.fadeIn -import org.fossify.commons.extensions.fadeOut -import org.fossify.commons.extensions.getContrastColor -import org.fossify.commons.extensions.getCurrentFormattedDateTime -import org.fossify.commons.extensions.getDocumentFile -import org.fossify.commons.extensions.getFilenameFromContentUri -import org.fossify.commons.extensions.getFilenameFromPath -import org.fossify.commons.extensions.getProperBackgroundColor -import org.fossify.commons.extensions.getProperPrimaryColor -import org.fossify.commons.extensions.getProperStatusBarColor -import org.fossify.commons.extensions.getRealPathFromURI -import org.fossify.commons.extensions.handleDeletePasswordProtection -import org.fossify.commons.extensions.hasPermission -import org.fossify.commons.extensions.hideKeyboard -import org.fossify.commons.extensions.highlightText -import org.fossify.commons.extensions.isMediaFile -import org.fossify.commons.extensions.launchMoreAppsFromUsIntent -import org.fossify.commons.extensions.needsStupidWritePermissions -import org.fossify.commons.extensions.onGlobalLayout -import org.fossify.commons.extensions.onPageChangeListener -import org.fossify.commons.extensions.onTextChangeListener -import org.fossify.commons.extensions.performSecurityCheck -import org.fossify.commons.extensions.searchMatches -import org.fossify.commons.extensions.shortcutManager -import org.fossify.commons.extensions.showErrorToast -import org.fossify.commons.extensions.showKeyboard -import org.fossify.commons.extensions.toast -import org.fossify.commons.extensions.updateTextColors -import org.fossify.commons.extensions.value -import org.fossify.commons.extensions.viewBinding -import org.fossify.commons.helpers.LICENSE_RTL -import org.fossify.commons.helpers.PERMISSION_READ_STORAGE -import org.fossify.commons.helpers.PERMISSION_WRITE_STORAGE -import org.fossify.commons.helpers.PROTECTION_NONE -import org.fossify.commons.helpers.REAL_FILE_PATH -import org.fossify.commons.helpers.SHOW_ALL_TABS -import org.fossify.commons.helpers.ensureBackgroundThread -import org.fossify.commons.helpers.isNougatMR1Plus -import org.fossify.commons.helpers.isQPlus +import org.fossify.commons.dialogs.* +import org.fossify.commons.extensions.* +import org.fossify.commons.helpers.* import org.fossify.commons.models.FAQItem import org.fossify.commons.models.FileDirItem import org.fossify.commons.models.RadioItem @@ -96,29 +42,10 @@ import org.fossify.notes.R import org.fossify.notes.adapters.NotesPagerAdapter import org.fossify.notes.databases.NotesDatabase import org.fossify.notes.databinding.ActivityMainBinding -import org.fossify.notes.dialogs.DeleteNoteDialog -import org.fossify.notes.dialogs.ExportFileDialog -import org.fossify.notes.dialogs.ImportFolderDialog -import org.fossify.notes.dialogs.NewNoteDialog -import org.fossify.notes.dialogs.OpenFileDialog -import org.fossify.notes.dialogs.OpenNoteDialog -import org.fossify.notes.dialogs.RenameNoteDialog -import org.fossify.notes.dialogs.SortChecklistDialog -import org.fossify.notes.extensions.config -import org.fossify.notes.extensions.getPercentageFontSize -import org.fossify.notes.extensions.notesDB -import org.fossify.notes.extensions.parseChecklistItems -import org.fossify.notes.extensions.updateWidgets -import org.fossify.notes.extensions.widgetsDB +import org.fossify.notes.dialogs.* +import org.fossify.notes.extensions.* import org.fossify.notes.fragments.TextFragment -import org.fossify.notes.helpers.MIME_TEXT_PLAIN -import org.fossify.notes.helpers.MyMovementMethod -import org.fossify.notes.helpers.NEW_CHECKLIST -import org.fossify.notes.helpers.NEW_TEXT_NOTE -import org.fossify.notes.helpers.NotesHelper -import org.fossify.notes.helpers.OPEN_NOTE_ID -import org.fossify.notes.helpers.SHORTCUT_NEW_CHECKLIST -import org.fossify.notes.helpers.SHORTCUT_NEW_TEXT_NOTE +import org.fossify.notes.helpers.* import org.fossify.notes.models.Note import org.fossify.notes.models.NoteType import java.io.File diff --git a/app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt b/app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt index a43b1e66..b39496da 100644 --- a/app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt +++ b/app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt @@ -89,7 +89,6 @@ class TextFragment : NoteFragment() { override fun onResume() { super.onResume() - NotesHelper(requireActivity()).getNoteWithId(noteId) { if (it != null) { note = it @@ -126,6 +125,7 @@ class TextFragment : NoteFragment() { super.onSaveInstanceState(outState) if (note != null) { outState.putString(TEXT, getCurrentNoteViewText()) + outState.putBoolean("isReadOnly", note!!.isReadOnly) } } @@ -135,6 +135,8 @@ class TextFragment : NoteFragment() { skipTextUpdating = true val newText = savedInstanceState.getString(TEXT) ?: "" innerBinding.root.findViewById(R.id.text_note_view).text = newText + note!!.isReadOnly = savedInstanceState.getBoolean("isReadOnly") + updateReadOnlyState(note!!.isReadOnly) } } @@ -356,21 +358,18 @@ class TextFragment : NoteFragment() { override val noteLockedShow: TextView = it.noteLockedShow } } + fun updateReadOnlyState(isReadOnly: Boolean) { noteEditText.apply { if (isReadOnly == true) { - setTextColor(context.getProperPrimaryColor()) keyListener = null } if (isReadOnly == false) { - setTextColor(context.getProperTextColor()) keyListener = initialKeyListener } isLongClickable = true setTextIsSelectable(true) - saveText(force = true) + saveText(force = false) } - android.util.Log.d("TextFragment", "isReadOnly: $isReadOnly") } } - diff --git a/app/src/main/kotlin/org/fossify/notes/helpers/NotesHelper.kt b/app/src/main/kotlin/org/fossify/notes/helpers/NotesHelper.kt index 9371066a..fd438f73 100644 --- a/app/src/main/kotlin/org/fossify/notes/helpers/NotesHelper.kt +++ b/app/src/main/kotlin/org/fossify/notes/helpers/NotesHelper.kt @@ -73,14 +73,8 @@ class NotesHelper(val context: Context) { fun insertOrUpdateNote(note: Note, callback: ((newNoteId: Long) -> Unit)? = null) { ensureBackgroundThread { val noteId = context.notesDB.insertOrUpdate(note) - if (note.isReadOnly) { - Handler(Looper.getMainLooper()).post { - callback?.invoke(noteId) - } - } else { - Handler(Looper.getMainLooper()).post { - callback?.invoke(noteId) - } + Handler(Looper.getMainLooper()).post { + callback?.invoke(noteId) } } } From e22bd48aa7b19e6ce1bebd5c74f14dfabd08a71d Mon Sep 17 00:00:00 2001 From: vbernier02 Date: Tue, 6 May 2025 15:20:13 +0200 Subject: [PATCH 11/15] Save text and button undo redo fix --- .../main/kotlin/org/fossify/notes/activities/MainActivity.kt | 4 ++-- .../main/kotlin/org/fossify/notes/fragments/TextFragment.kt | 2 +- app/src/main/kotlin/org/fossify/notes/models/Note.kt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt index 333d8f3d..665ea805 100644 --- a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt @@ -184,12 +184,12 @@ class MainActivity : SimpleActivity() { binding.mainToolbar.menu.apply { findItem(R.id.undo).apply { - isVisible = showUndoButton && mCurrentNote.type == NoteType.TYPE_TEXT + isVisible = showUndoButton && !mCurrentNote.isReadOnly && mCurrentNote.type == NoteType.TYPE_TEXT icon?.alpha = if (isEnabled) 255 else 127 } findItem(R.id.redo).apply { - isVisible = showRedoButton && mCurrentNote.type == NoteType.TYPE_TEXT + isVisible = showRedoButton && !mCurrentNote.isReadOnly && mCurrentNote.type == NoteType.TYPE_TEXT icon?.alpha = if (isEnabled) 255 else 127 } diff --git a/app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt b/app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt index b39496da..31410712 100644 --- a/app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt +++ b/app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt @@ -369,7 +369,7 @@ class TextFragment : NoteFragment() { } isLongClickable = true setTextIsSelectable(true) - saveText(force = false) + saveText(force = true) } } } diff --git a/app/src/main/kotlin/org/fossify/notes/models/Note.kt b/app/src/main/kotlin/org/fossify/notes/models/Note.kt index 678c8769..f467e464 100644 --- a/app/src/main/kotlin/org/fossify/notes/models/Note.kt +++ b/app/src/main/kotlin/org/fossify/notes/models/Note.kt @@ -26,7 +26,7 @@ data class Note( @ColumnInfo(name = "path") var path: String, @ColumnInfo(name = "protection_type") var protectionType: Int, @ColumnInfo(name = "protection_hash") var protectionHash: String, - @ColumnInfo(name = "is_read_only") var isReadOnly: Boolean = false, + @ColumnInfo(name = "is_read_only") var isReadOnly: Boolean = false ) { fun getNoteStoredValue(context: Context): String? { From 56b12f1ce0bbc413a0436e64e4503f36c39541ca Mon Sep 17 00:00:00 2001 From: vbernier02 Date: Tue, 6 May 2025 17:07:54 +0200 Subject: [PATCH 12/15] fix import --- .../fossify/notes/activities/MainActivity.kt | 90 +++++++++++++++++-- 1 file changed, 82 insertions(+), 8 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt index 665ea805..ba0648c5 100644 --- a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt @@ -4,7 +4,11 @@ import android.accounts.NetworkErrorException import android.annotation.SuppressLint import android.content.ActivityNotFoundException import android.content.Intent -import android.content.Intent.* +import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK +import android.content.Intent.FLAG_ACTIVITY_NEW_TASK +import android.content.Intent.FLAG_ACTIVITY_NO_HISTORY +import android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION +import android.content.Intent.FLAG_GRANT_WRITE_URI_PERMISSION import android.content.pm.ShortcutInfo import android.content.pm.ShortcutManager import android.graphics.drawable.Icon @@ -29,9 +33,59 @@ import android.widget.Toast import androidx.appcompat.content.res.AppCompatResources import androidx.core.net.toUri import androidx.viewpager.widget.ViewPager -import org.fossify.commons.dialogs.* -import org.fossify.commons.extensions.* -import org.fossify.commons.helpers.* +import org.fossify.commons.dialogs.ConfirmationAdvancedDialog +import org.fossify.commons.dialogs.ConfirmationDialog +import org.fossify.commons.dialogs.FilePickerDialog +import org.fossify.commons.dialogs.RadioGroupDialog +import org.fossify.commons.dialogs.SecurityDialog +import org.fossify.commons.extensions.appLaunched +import org.fossify.commons.extensions.appLockManager +import org.fossify.commons.extensions.applyColorFilter +import org.fossify.commons.extensions.baseConfig +import org.fossify.commons.extensions.beVisibleIf +import org.fossify.commons.extensions.checkWhatsNew +import org.fossify.commons.extensions.clearBackgroundSpans +import org.fossify.commons.extensions.convertToBitmap +import org.fossify.commons.extensions.deleteFile +import org.fossify.commons.extensions.fadeIn +import org.fossify.commons.extensions.fadeOut +import org.fossify.commons.extensions.getContrastColor +import org.fossify.commons.extensions.getCurrentFormattedDateTime +import org.fossify.commons.extensions.getDocumentFile +import org.fossify.commons.extensions.getFilenameFromContentUri +import org.fossify.commons.extensions.getFilenameFromPath +import org.fossify.commons.extensions.getProperBackgroundColor +import org.fossify.commons.extensions.getProperPrimaryColor +import org.fossify.commons.extensions.getProperStatusBarColor +import org.fossify.commons.extensions.getRealPathFromURI +import org.fossify.commons.extensions.handleDeletePasswordProtection +import org.fossify.commons.extensions.hasPermission +import org.fossify.commons.extensions.hideKeyboard +import org.fossify.commons.extensions.highlightText +import org.fossify.commons.extensions.isMediaFile +import org.fossify.commons.extensions.launchMoreAppsFromUsIntent +import org.fossify.commons.extensions.needsStupidWritePermissions +import org.fossify.commons.extensions.onGlobalLayout +import org.fossify.commons.extensions.onPageChangeListener +import org.fossify.commons.extensions.onTextChangeListener +import org.fossify.commons.extensions.performSecurityCheck +import org.fossify.commons.extensions.searchMatches +import org.fossify.commons.extensions.shortcutManager +import org.fossify.commons.extensions.showErrorToast +import org.fossify.commons.extensions.showKeyboard +import org.fossify.commons.extensions.toast +import org.fossify.commons.extensions.updateTextColors +import org.fossify.commons.extensions.value +import org.fossify.commons.extensions.viewBinding +import org.fossify.commons.helpers.LICENSE_RTL +import org.fossify.commons.helpers.PERMISSION_READ_STORAGE +import org.fossify.commons.helpers.PERMISSION_WRITE_STORAGE +import org.fossify.commons.helpers.PROTECTION_NONE +import org.fossify.commons.helpers.REAL_FILE_PATH +import org.fossify.commons.helpers.SHOW_ALL_TABS +import org.fossify.commons.helpers.ensureBackgroundThread +import org.fossify.commons.helpers.isNougatMR1Plus +import org.fossify.commons.helpers.isQPlus import org.fossify.commons.models.FAQItem import org.fossify.commons.models.FileDirItem import org.fossify.commons.models.RadioItem @@ -42,10 +96,29 @@ import org.fossify.notes.R import org.fossify.notes.adapters.NotesPagerAdapter import org.fossify.notes.databases.NotesDatabase import org.fossify.notes.databinding.ActivityMainBinding -import org.fossify.notes.dialogs.* -import org.fossify.notes.extensions.* +import org.fossify.notes.dialogs.DeleteNoteDialog +import org.fossify.notes.dialogs.ExportFileDialog +import org.fossify.notes.dialogs.ImportFolderDialog +import org.fossify.notes.dialogs.NewNoteDialog +import org.fossify.notes.dialogs.OpenFileDialog +import org.fossify.notes.dialogs.OpenNoteDialog +import org.fossify.notes.dialogs.RenameNoteDialog +import org.fossify.notes.dialogs.SortChecklistDialog +import org.fossify.notes.extensions.config +import org.fossify.notes.extensions.getPercentageFontSize +import org.fossify.notes.extensions.notesDB +import org.fossify.notes.extensions.parseChecklistItems +import org.fossify.notes.extensions.updateWidgets +import org.fossify.notes.extensions.widgetsDB import org.fossify.notes.fragments.TextFragment -import org.fossify.notes.helpers.* +import org.fossify.notes.helpers.MIME_TEXT_PLAIN +import org.fossify.notes.helpers.MyMovementMethod +import org.fossify.notes.helpers.NEW_CHECKLIST +import org.fossify.notes.helpers.NEW_TEXT_NOTE +import org.fossify.notes.helpers.NotesHelper +import org.fossify.notes.helpers.OPEN_NOTE_ID +import org.fossify.notes.helpers.SHORTCUT_NEW_CHECKLIST +import org.fossify.notes.helpers.SHORTCUT_NEW_TEXT_NOTE import org.fossify.notes.models.Note import org.fossify.notes.models.NoteType import java.io.File @@ -211,7 +284,8 @@ class MainActivity : SimpleActivity() { saveNoteButton!!.isVisible = !config.autosaveNotes && showSaveButton && (::mCurrentNote.isInitialized && mCurrentNote.type == NoteType.TYPE_TEXT) - findItem(R.id.preview_mode).isVisible = (::mCurrentNote.isInitialized && !mCurrentNote.isReadOnly && mCurrentNote.type != NoteType.TYPE_CHECKLIST) + findItem(R.id.preview_mode).isVisible = + (::mCurrentNote.isInitialized && !mCurrentNote.isReadOnly && mCurrentNote.type != NoteType.TYPE_CHECKLIST) findItem(R.id.edit_mode).isVisible = (::mCurrentNote.isInitialized && mCurrentNote.isReadOnly && mCurrentNote.type != NoteType.TYPE_CHECKLIST) } From b8b4cf86b395c113ab34badd8e3ec0ce812508e9 Mon Sep 17 00:00:00 2001 From: vbernier02 Date: Wed, 7 May 2025 17:34:37 +0200 Subject: [PATCH 13/15] fix maximum line length --- .../kotlin/org/fossify/notes/activities/MainActivity.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt index ba0648c5..495d9b53 100644 --- a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt @@ -284,10 +284,8 @@ class MainActivity : SimpleActivity() { saveNoteButton!!.isVisible = !config.autosaveNotes && showSaveButton && (::mCurrentNote.isInitialized && mCurrentNote.type == NoteType.TYPE_TEXT) - findItem(R.id.preview_mode).isVisible = - (::mCurrentNote.isInitialized && !mCurrentNote.isReadOnly && mCurrentNote.type != NoteType.TYPE_CHECKLIST) - findItem(R.id.edit_mode).isVisible = - (::mCurrentNote.isInitialized && mCurrentNote.isReadOnly && mCurrentNote.type != NoteType.TYPE_CHECKLIST) + findItem(R.id.preview_mode).isVisible = (::mCurrentNote.isInitialized && !mCurrentNote.isReadOnly && mCurrentNote.type != NoteType.TYPE_CHECKLIST) + findItem(R.id.edit_mode).isVisible = (::mCurrentNote.isInitialized && mCurrentNote.isReadOnly && mCurrentNote.type != NoteType.TYPE_CHECKLIST) } binding.pagerTabStrip.beVisibleIf(multipleNotesExist) From 7226d3f3398c35cebe28011441e8bb6ac4ea1f4f Mon Sep 17 00:00:00 2001 From: vbernier02 Date: Tue, 17 Jun 2025 16:55:44 +0200 Subject: [PATCH 14/15] Spell check and keyboard disabled --- .../kotlin/org/fossify/notes/fragments/TextFragment.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt b/app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt index 31410712..7bfe24f9 100644 --- a/app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt +++ b/app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt @@ -10,6 +10,7 @@ import android.text.TextWatcher import android.text.method.KeyListener import android.text.style.UnderlineSpan import android.text.util.Linkify +import android.text.InputType import android.util.TypedValue import android.view.LayoutInflater import android.view.MotionEvent @@ -22,6 +23,7 @@ import android.widget.TextView import androidx.viewbinding.ViewBinding import org.fossify.commons.extensions.* import org.fossify.commons.views.MyEditText +import org.fossify.commons.extensions.hideKeyboard import org.fossify.notes.R import org.fossify.notes.activities.MainActivity import org.fossify.notes.databinding.FragmentTextBinding @@ -361,14 +363,16 @@ class TextFragment : NoteFragment() { fun updateReadOnlyState(isReadOnly: Boolean) { noteEditText.apply { + val baseInputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE if (isReadOnly == true) { + inputType = baseInputType or InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS keyListener = null + requireActivity().hideKeyboard(this) } if (isReadOnly == false) { + inputType = baseInputType keyListener = initialKeyListener } - isLongClickable = true - setTextIsSelectable(true) saveText(force = true) } } From d3391e6e567f487b13f24be46bcf451914763a7a Mon Sep 17 00:00:00 2001 From: vbernier02 Date: Thu, 19 Jun 2025 15:37:09 +0200 Subject: [PATCH 15/15] crash long press in read-only mode --- app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt b/app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt index 7bfe24f9..deac0bfb 100644 --- a/app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt +++ b/app/src/main/kotlin/org/fossify/notes/fragments/TextFragment.kt @@ -373,6 +373,8 @@ class TextFragment : NoteFragment() { inputType = baseInputType keyListener = initialKeyListener } + isLongClickable = true + setTextIsSelectable(true) saveText(force = true) } }