diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 91dfc6ec..3820008d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -21,7 +21,7 @@
@@ -55,9 +55,9 @@
android:name=".activities.ThreadActivity"
android:configChanges="orientation"
android:exported="false"
+ android:launchMode="singleTop"
android:parentActivityName=".activities.MainActivity"
- android:windowSoftInputMode="adjustResize"
- android:launchMode="singleTop" />
+ android:windowSoftInputMode="adjustResize" />
toast(R.string.invalid_file_format)
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt
index fc86ece8..d97e67d0 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/SettingsActivity.kt
@@ -5,9 +5,7 @@ import android.content.Intent
import android.os.Build
import android.os.Bundle
import com.simplemobiletools.commons.activities.ManageBlockedNumbersActivity
-import com.simplemobiletools.commons.dialogs.ChangeDateTimeFormatDialog
-import com.simplemobiletools.commons.dialogs.FeatureLockedDialog
-import com.simplemobiletools.commons.dialogs.RadioGroupDialog
+import com.simplemobiletools.commons.dialogs.*
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.RadioItem
@@ -49,6 +47,7 @@ class SettingsActivity : SimpleActivity() {
setupGroupMessageAsMMS()
setupLockScreenVisibility()
setupMMSFileSizeLimit()
+ setupAppPasswordProtection()
updateTextColors(settings_nested_scrollview)
if (blockedNumbersAtPause != -1 && blockedNumbersAtPause != getBlockedNumbers().hashCode()) {
@@ -59,7 +58,8 @@ class SettingsActivity : SimpleActivity() {
settings_color_customization_section_label,
settings_general_settings_label,
settings_outgoing_messages_label,
- settings_notifications_label
+ settings_notifications_label,
+ settings_security_label
).forEach {
it.setTextColor(getProperPrimaryColor())
}
@@ -244,6 +244,28 @@ class SettingsActivity : SimpleActivity() {
}
}
+ private fun setupAppPasswordProtection() {
+ settings_app_password_protection.isChecked = config.isAppPasswordProtectionOn
+ settings_app_password_protection_holder.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
+ settings_app_password_protection.isChecked = !hasPasswordProtection
+ config.isAppPasswordProtectionOn = !hasPasswordProtection
+ config.appPasswordHash = if (hasPasswordProtection) "" else hash
+ config.appProtectionType = type
+
+ if (config.isAppPasswordProtectionOn) {
+ val confirmationTextId = if (config.appProtectionType == PROTECTION_FINGERPRINT)
+ R.string.fingerprint_setup_successfully else R.string.protection_setup_successfully
+ ConfirmationDialog(this, "", confirmationTextId, R.string.ok, 0) { }
+ }
+ }
+ }
+ }
+ }
+
private fun getMMSFileLimitText() = getString(
when (config.mmsFileSizeLimit) {
FILE_SIZE_100_KB -> R.string.mms_file_size_limit_100kb
diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt
index 6a116d02..08f251ac 100644
--- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt
@@ -101,6 +101,7 @@ class ThreadActivity : SimpleActivity() {
private var loadingOlderMessages = false
private var allMessagesFetched = false
private var oldestMessageDate = -1
+ private var wasProtectionHandled = false
private var isScheduledMessage: Boolean = false
private var scheduledMessage: Message? = null
@@ -111,7 +112,7 @@ class ThreadActivity : SimpleActivity() {
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
finish()
- startActivity(intent)
+ startActivity(intent)
}
override fun onCreate(savedInstanceState: Bundle?) {
@@ -136,28 +137,23 @@ class ThreadActivity : SimpleActivity() {
intent.getStringExtra(THREAD_TITLE)?.let {
thread_toolbar.title = it
}
+ wasProtectionHandled = intent.getBooleanExtra(WAS_PROTECTION_HANDLED, false)
bus = EventBus.getDefault()
bus!!.register(this)
- handlePermission(PERMISSION_READ_PHONE_STATE) { granted ->
- if (granted) {
- setupButtons()
- setupConversation()
- setupCachedMessages {
- val searchedMessageId = intent.getLongExtra(SEARCHED_MESSAGE_ID, -1L)
- intent.removeExtra(SEARCHED_MESSAGE_ID)
- if (searchedMessageId != -1L) {
- val index = threadItems.indexOfFirst { (it as? Message)?.id == searchedMessageId }
- if (index != -1) {
- thread_messages_list.smoothScrollToPosition(index)
- }
- }
- setupThread()
- setupScrollFab()
+ if (savedInstanceState == null) {
+ if (!wasProtectionHandled) {
+ handleAppPasswordProtection {
+ wasProtectionHandled = it
+ if (it) {
+ loadConversation()
+ } else {
+ finish()
+ }
}
} else {
- finish()
+ loadConversation()
}
}
@@ -221,6 +217,29 @@ class ThreadActivity : SimpleActivity() {
bus?.unregister(this)
}
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ outState.putBoolean(WAS_PROTECTION_HANDLED, wasProtectionHandled)
+ }
+
+ override fun onRestoreInstanceState(savedInstanceState: Bundle) {
+ super.onRestoreInstanceState(savedInstanceState)
+ wasProtectionHandled = savedInstanceState.getBoolean(WAS_PROTECTION_HANDLED, false)
+
+ if (!wasProtectionHandled) {
+ handleAppPasswordProtection {
+ wasProtectionHandled = it
+ if (it) {
+ loadConversation()
+ } else {
+ finish()
+ }
+ }
+ } else {
+ loadConversation()
+ }
+ }
+
private fun refreshMenuItems() {
val firstPhoneNumber = participants.firstOrNull()?.phoneNumbers?.firstOrNull()?.value
thread_toolbar.menu.apply {
@@ -546,6 +565,30 @@ class ThreadActivity : SimpleActivity() {
}
}
+ private fun loadConversation() {
+ handlePermission(PERMISSION_READ_PHONE_STATE) { granted ->
+ if (granted) {
+ setupButtons()
+ setupConversation()
+ setupCachedMessages {
+ val searchedMessageId = intent.getLongExtra(SEARCHED_MESSAGE_ID, -1L)
+ intent.removeExtra(SEARCHED_MESSAGE_ID)
+ if (searchedMessageId != -1L) {
+ val index = threadItems.indexOfFirst { (it as? Message)?.id == searchedMessageId }
+ if (index != -1) {
+ thread_messages_list.smoothScrollToPosition(index)
+ }
+ }
+
+ setupThread()
+ setupScrollFab()
+ }
+ } else {
+ finish()
+ }
+ }
+ }
+
private fun setupConversation() {
ensureBackgroundThread {
conversation = conversationsDB.getConversationWithThreadId(threadId)
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
index 7083d0c3..99dfaa9b 100644
--- a/app/src/main/res/layout/activity_settings.xml
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -341,6 +341,32 @@
tools:text="@string/mms_file_size_limit_none" />
+
+
+
+
+
+
+
+
+
+