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 4f6b4f4c..bb09cb04 100644 --- a/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/notes/activities/MainActivity.kt @@ -83,6 +83,9 @@ class MainActivity : SimpleActivity() { private val binding by viewBinding(ActivityMainBinding::inflate) + private var mIsPasswordProtectionPending = false + private var mWasProtectionHandled = false + override fun onCreate(savedInstanceState: Bundle?) { isMaterialActivity = true super.onCreate(savedInstanceState) @@ -121,6 +124,23 @@ class MainActivity : SimpleActivity() { checkAppOnSDCard() setupSearchButtons() + + mIsPasswordProtectionPending = config.isAppPasswordProtectionOn + + if (savedInstanceState == null) { + binding.viewPager.beGoneIf(mIsPasswordProtectionPending) + if (mIsPasswordProtectionPending && !mWasProtectionHandled) { + handleAppPasswordProtection { + mWasProtectionHandled = it + if (it) { + mIsPasswordProtectionPending = false + binding.viewPager.beVisible() + } else { + finish() + } + } + } + } } override fun onResume() { @@ -1069,7 +1089,13 @@ class MainActivity : SimpleActivity() { private fun displayDeleteNotePrompt() { DeleteNoteDialog(this, mCurrentNote) { - deleteNote(it, mCurrentNote) + if (config.isDeletePasswordProtectionOn) { + handleDeletePasswordProtection { + deleteNote(it, mCurrentNote) + } + } else { + deleteNote(it, mCurrentNote) + } } } diff --git a/app/src/main/kotlin/org/fossify/notes/activities/SettingsActivity.kt b/app/src/main/kotlin/org/fossify/notes/activities/SettingsActivity.kt index 057f491c..486de9a8 100644 --- a/app/src/main/kotlin/org/fossify/notes/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/org/fossify/notes/activities/SettingsActivity.kt @@ -10,7 +10,9 @@ import androidx.core.view.ViewCompat import kotlinx.serialization.SerializationException import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import org.fossify.commons.dialogs.ConfirmationDialog import org.fossify.commons.dialogs.RadioGroupDialog +import org.fossify.commons.dialogs.SecurityDialog import org.fossify.commons.extensions.* import org.fossify.commons.helpers.* import org.fossify.commons.models.RadioItem @@ -62,6 +64,8 @@ class SettingsActivity : SimpleActivity() { setupNotesImport() setupEnableAutomaticBackups() setupManageAutomaticBackups() + setupAppPasswordProtection() + setupNoteDeletionPasswordProtection() updateTextColors(binding.settingsNestedScrollview) arrayOf( @@ -395,4 +399,48 @@ class SettingsActivity : SimpleActivity() { binding.settingsEnableAutomaticBackups.isChecked = enable binding.settingsManageAutomaticBackupsHolder.beVisibleIf(enable) } + + private fun setupAppPasswordProtection() { + binding.settingsAppPasswordProtection.isChecked = config.isAppPasswordProtectionOn + binding.settingsAppPasswordProtectionHolder.setOnClickListener { + val tabToShow = if (config.isAppPasswordProtectionOn) config.appProtectionType else SHOW_ALL_TABS + SecurityDialog(this, config.appPasswordHash, tabToShow) { hash, type, success -> + if (success) { + val hasPasswordProtection = config.isAppPasswordProtectionOn + binding.settingsAppPasswordProtection.isChecked = !hasPasswordProtection + config.isAppPasswordProtectionOn = !hasPasswordProtection + config.appPasswordHash = if (hasPasswordProtection) "" else hash + config.appProtectionType = type + + if (config.isAppPasswordProtectionOn) { + val confirmationTextId = if (config.appProtectionType == PROTECTION_FINGERPRINT) + org.fossify.commons.R.string.fingerprint_setup_successfully else org.fossify.commons.R.string.protection_setup_successfully + ConfirmationDialog(this, "", confirmationTextId, org.fossify.commons.R.string.ok, 0) { } + } + } + } + } + } + + private fun setupNoteDeletionPasswordProtection() { + binding.settingsNoteDeletionPasswordProtection.isChecked = config.isDeletePasswordProtectionOn + binding.settingsNoteDeletionPasswordProtectionHolder.setOnClickListener { + val tabToShow = if (config.isDeletePasswordProtectionOn) config.deleteProtectionType else SHOW_ALL_TABS + SecurityDialog(this, config.deletePasswordHash, tabToShow) { hash, type, success -> + if (success) { + val hasPasswordProtection = config.isDeletePasswordProtectionOn + binding.settingsNoteDeletionPasswordProtection.isChecked = !hasPasswordProtection + config.isDeletePasswordProtectionOn = !hasPasswordProtection + config.deletePasswordHash = if (hasPasswordProtection) "" else hash + config.deleteProtectionType = type + + if (config.isDeletePasswordProtectionOn) { + val confirmationTextId = if (config.deleteProtectionType == PROTECTION_FINGERPRINT) + org.fossify.commons.R.string.fingerprint_setup_successfully else org.fossify.commons.R.string.protection_setup_successfully + ConfirmationDialog(this, "", confirmationTextId, org.fossify.commons.R.string.ok, 0) { } + } + } + } + } + } } diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 4856e43e..8bc43697 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -351,6 +351,51 @@ android:id="@+id/settings_saving_divider" layout="@layout/divider" /> + + + + + + + + + + + + + + + + + + Use Incognito mode of keyboards Move done checklist items to the bottom Add new checklist items at the top + Password protect note deletion Checklist