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