From a2faa7107f23bb1c7ff38ae2ecff8c3c3dca3030 Mon Sep 17 00:00:00 2001 From: Andrii Chubko Date: Fri, 27 Aug 2021 16:38:59 +0300 Subject: [PATCH] Remove note protection if biometric id is no longer available This check is done to avoid user not being able to unlock the note if he removes biometric id from phone settings. --- .../notes/pro/activities/MainActivity.kt | 27 +++++++++++-------- .../pro/activities/WidgetConfigureActivity.kt | 20 +++++++------- .../notes/pro/fragments/ChecklistFragment.kt | 14 ++++++---- .../notes/pro/fragments/TextFragment.kt | 26 +++++++++++------- .../notes/pro/models/Note.kt | 9 ++++++- 5 files changed, 60 insertions(+), 36 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/activities/MainActivity.kt index dd42450e..a6644313 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/activities/MainActivity.kt @@ -316,8 +316,11 @@ class MainActivity : SimpleActivity() { } private fun initViewPager(wantedNoteId: Long? = null) { - NotesHelper(this).getNotes { - mNotes = it + NotesHelper(this).getNotes { notes -> + notes.filter { it.isBiometricLockUnavailable(this) } + .forEach(::removeProtection) + + mNotes = notes invalidateOptionsMenu() mCurrentNote = mNotes[0] mAdapter = NotesPagerAdapter(supportFragmentManager, mNotes, this) @@ -1084,19 +1087,21 @@ class MainActivity : SimpleActivity() { performSecurityCheck( protectionType = mCurrentNote.protectionType, requiredHash = mCurrentNote.protectionHash, - successCallback = { _, _ -> removeProtection() } + successCallback = { _, _ -> removeProtection(mCurrentNote) } ) } - private fun removeProtection() { - mCurrentNote.protectionHash = "" - mCurrentNote.protectionType = PROTECTION_NONE - NotesHelper(this).insertOrUpdateNote(mCurrentNote) { - getCurrentFragment()?.apply { - shouldShowLockedContent = true - checkLockState() + private fun removeProtection(note: Note) { + note.protectionHash = "" + note.protectionType = PROTECTION_NONE + NotesHelper(this).insertOrUpdateNote(note) { + if (note == mCurrentNote) { + getCurrentFragment()?.apply { + shouldShowLockedContent = true + checkLockState() + } + invalidateOptionsMenu() } - invalidateOptionsMenu() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/activities/WidgetConfigureActivity.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/activities/WidgetConfigureActivity.kt index 3e88f15a..6d46dad2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/activities/WidgetConfigureActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/activities/WidgetConfigureActivity.kt @@ -104,16 +104,18 @@ class WidgetConfigureActivity : SimpleActivity() { if (mNotes.size == 1 && note == null) { note = mNotes.first() - performSecurityCheck( - protectionType = note.protectionType, - requiredHash = note.protectionHash, - successCallback = { _, _ -> updateCurrentNote(note) }, - failureCallback = { finish() } - ) - } else { - if (note != null) { + if (note.isBiometricLockUnavailable(this)) { updateCurrentNote(note) + } else { + performSecurityCheck( + protectionType = note.protectionType, + requiredHash = note.protectionHash, + successCallback = { _, _ -> updateCurrentNote(note) }, + failureCallback = { finish() } + ) } + } else if (note != null) { + updateCurrentNote(note) } } } @@ -127,7 +129,7 @@ class WidgetConfigureActivity : SimpleActivity() { RadioGroupDialog(this, items, mCurrentNoteId.toInt()) { val selectedId = it as Int val note = mNotes.firstOrNull { it.id!!.toInt() == selectedId } ?: return@RadioGroupDialog - if (note.protectionType == PROTECTION_NONE) { + if (note.protectionType == PROTECTION_NONE || note.isBiometricLockUnavailable(this)) { updateCurrentNote(note) } else { performSecurityCheck( diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/fragments/ChecklistFragment.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/fragments/ChecklistFragment.kt index 86b7aed5..7506c0c0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/fragments/ChecklistFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/fragments/ChecklistFragment.kt @@ -78,11 +78,13 @@ class ChecklistFragment : NoteFragment(), ChecklistItemsListener { items.clear() note.value.split("\n").map { it.trim() }.filter { it.isNotBlank() }.forEachIndexed { index, value -> - items.add(ChecklistItem( - id = index, - title = value, - isDone = false - )) + items.add( + ChecklistItem( + id = index, + title = value, + isDone = false + ) + ) } saveChecklist() @@ -120,6 +122,8 @@ class ChecklistFragment : NoteFragment(), ChecklistItemsListener { } override fun checkLockState() { + if (note == null) return + view.apply { checklist_content_holder.beVisibleIf(!note!!.isLocked() || shouldShowLockedContent) checklist_fab.beVisibleIf(!note!!.isLocked() || shouldShowLockedContent) diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/fragments/TextFragment.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/fragments/TextFragment.kt index 3cf5991f..7d280cfd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/fragments/TextFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/fragments/TextFragment.kt @@ -176,6 +176,8 @@ class TextFragment : NoteFragment() { fun removeTextWatcher() = view.text_note_view.removeTextChangedListener(textWatcher) override fun checkLockState() { + if (note == null) return + view.apply { notes_counter.beVisibleIf((!note!!.isLocked() || shouldShowLockedContent) && config!!.showWordCount) notes_scrollview.beVisibleIf(!note!!.isLocked() || shouldShowLockedContent) @@ -263,11 +265,13 @@ class TextFragment : NoteFragment() { text.removeSpan(span) } - Selection.setSelection(text, if (edit.before == null) { - start - } else { - start + edit.before.length - }) + Selection.setSelection( + text, if (edit.before == null) { + start + } else { + start + edit.before.length + } + ) } fun redo() { @@ -285,11 +289,13 @@ class TextFragment : NoteFragment() { text.removeSpan(o) } - Selection.setSelection(text, if (edit.after == null) { - start - } else { - start + edit.after.length - }) + Selection.setSelection( + text, if (edit.after == null) { + start + } else { + start + edit.after.length + } + ) } fun isUndoAvailable() = textHistory.position > 0 diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/Note.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/Note.kt index f9dae3dc..37697816 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/Note.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/models/Note.kt @@ -6,6 +6,8 @@ import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.Index import androidx.room.PrimaryKey +import com.simplemobiletools.commons.extensions.isBiometricIdAvailable +import com.simplemobiletools.commons.helpers.PROTECTION_FINGERPRINT import com.simplemobiletools.commons.helpers.PROTECTION_NONE import java.io.File @@ -17,7 +19,8 @@ data class Note( @ColumnInfo(name = "type") var type: Int, @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 +) { fun getNoteStoredValue(context: Context): String? { return if (path.isNotEmpty()) { @@ -37,4 +40,8 @@ data class Note( } fun isLocked() = protectionType != PROTECTION_NONE + + fun isBiometricLockUnavailable(context: Context): Boolean { + return protectionType == PROTECTION_FINGERPRINT && !context.isBiometricIdAvailable() + } }