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" /> + + + + + + + + + +