diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/helpers/LocalAuthentication.kt b/apps/android/app/src/main/java/chat/simplex/app/views/helpers/LocalAuthentication.kt index 818f6b247b..403b21899c 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/helpers/LocalAuthentication.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/helpers/LocalAuthentication.kt @@ -1,6 +1,7 @@ package chat.simplex.app.views.helpers import android.os.Build.VERSION.SDK_INT +import androidx.activity.compose.BackHandler import androidx.biometric.BiometricManager import androidx.biometric.BiometricManager.Authenticators.* import androidx.biometric.BiometricPrompt @@ -53,6 +54,10 @@ fun authenticate( LAMode.PASSCODE -> { val password = ksAppPassword.get() ?: return completed(LAResult.Unavailable(generalGetString(R.string.la_no_app_password))) ModalManager.shared.showCustomModal(animated = false) { close -> + BackHandler { + close() + completed(LAResult.Error(generalGetString(R.string.authentication_cancelled))) + } Surface(Modifier.fillMaxSize(), color = MaterialTheme.colors.background) { LocalAuthView(SimplexApp.context.chatModel, LocalAuthRequest(promptTitle, promptSubtitle, password) { close() diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/localauth/SetAppPasscodeView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/localauth/SetAppPasscodeView.kt index 0506c592dd..cb6c6368d0 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/localauth/SetAppPasscodeView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/localauth/SetAppPasscodeView.kt @@ -1,5 +1,6 @@ package chat.simplex.app.views.localauth +import androidx.activity.compose.BackHandler import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable import chat.simplex.app.R @@ -18,6 +19,10 @@ fun SetAppPasscodeView( @Composable fun SetPasswordView(title: String, submitLabel: String, submitEnabled: (((String) -> Boolean))? = null, submit: () -> Unit) { + BackHandler { + close() + cancel() + } PasscodeView(passcode, title = title, submitLabel = submitLabel, submitEnabled = submitEnabled, submit = submit) { close() cancel() diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/DeveloperView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/DeveloperView.kt index ca7180ffff..6a79b807de 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/DeveloperView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/DeveloperView.kt @@ -21,7 +21,7 @@ import chat.simplex.app.views.helpers.* fun DeveloperView( m: ChatModel, showCustomModal: (@Composable (ChatModel, () -> Unit) -> Unit) -> (() -> Unit), - withAuth: (block: () -> Unit) -> Unit + withAuth: (title: String, desc: String, block: () -> Unit) -> Unit ) { Column(Modifier.fillMaxWidth().verticalScroll(rememberScrollState())) { val uriHandler = LocalUriHandler.current @@ -30,7 +30,7 @@ fun DeveloperView( val devTools = remember { developerTools.state } SectionView() { InstallTerminalAppItem(uriHandler) - ChatConsoleItem { withAuth(showCustomModal { it, close -> TerminalView(it, close) }) } + ChatConsoleItem { withAuth(generalGetString(R.string.auth_open_chat_console), generalGetString(R.string.auth_log_in_using_credential), showCustomModal { it, close -> TerminalView(it, close) })} SettingsPreferenceItem(painterResource(R.drawable.ic_drive_folder_upload), stringResource(R.string.confirm_database_upgrades), m.controller.appPrefs.confirmDBUpgrades) SettingsPreferenceItem(painterResource(R.drawable.ic_code), stringResource(R.string.show_developer_options), developerTools) } diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/SettingsView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/SettingsView.kt index 78ed4eb452..c28aa38f5a 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/SettingsView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/usersettings/SettingsView.kt @@ -8,6 +8,7 @@ import SectionView import TextIconSpaced import android.content.Context import android.content.res.Configuration +import androidx.activity.compose.BackHandler import androidx.compose.foundation.* import androidx.compose.foundation.layout.* import androidx.compose.material.* @@ -76,10 +77,11 @@ fun SettingsView(chatModel: ChatModel, setPerformLA: (Boolean, FragmentActivity) } } }, - withAuth = { block -> + withAuth = { title, desc, block -> if (!requireAuth.value) { block() } else { + var autoShow = true ModalManager.shared.showModalCloseable { close -> val onFinishAuth = { success: Boolean -> if (success) { @@ -87,8 +89,12 @@ fun SettingsView(chatModel: ChatModel, setPerformLA: (Boolean, FragmentActivity) block() } } + LaunchedEffect(Unit) { - runAuth(context, onFinishAuth) + if (autoShow) { + autoShow = false + runAuth(title, desc, context, onFinishAuth) + } } Box( Modifier.fillMaxSize(), @@ -98,7 +104,7 @@ fun SettingsView(chatModel: ChatModel, setPerformLA: (Boolean, FragmentActivity) stringResource(R.string.auth_unlock), icon = painterResource(R.drawable.ic_lock), click = { - runAuth(context, onFinishAuth) + runAuth(title, desc, context, onFinishAuth) } ) } @@ -126,7 +132,7 @@ fun SettingsLayout( showSettingsModalWithSearch: (@Composable (ChatModel, MutableState) -> Unit) -> Unit, showCustomModal: (@Composable (ChatModel, () -> Unit) -> Unit) -> (() -> Unit), showVersion: () -> Unit, - withAuth: (block: () -> Unit) -> Unit + withAuth: (title: String, desc: String, block: () -> Unit) -> Unit ) { val uriHandler = LocalUriHandler.current Box(Modifier.fillMaxSize().verticalScroll(rememberScrollState()).background(MaterialTheme.colors.background)) { @@ -142,7 +148,7 @@ fun SettingsLayout( ProfilePreview(profile, stopped = stopped) } val profileHidden = rememberSaveable { mutableStateOf(false) } - SettingsActionItem(painterResource(R.drawable.ic_manage_accounts), stringResource(R.string.your_chat_profiles), { withAuth { showSettingsModalWithSearch { it, search -> UserProfilesView(it, search, profileHidden) } } }, disabled = stopped, extraPadding = true) + SettingsActionItem(painterResource(R.drawable.ic_manage_accounts), stringResource(R.string.your_chat_profiles), { withAuth(generalGetString(R.string.auth_open_chat_profiles), generalGetString(R.string.auth_log_in_using_credential)) { showSettingsModalWithSearch { it, search -> UserProfilesView(it, search, profileHidden) } } }, disabled = stopped, extraPadding = true) SettingsIncognitoActionItem(incognitoPref, incognito, stopped) { showModal { IncognitoView() }() } SettingsActionItem(painterResource(R.drawable.ic_qr_code), stringResource(R.string.your_simplex_contact_address), showModal { CreateLinkView(it, CreateLinkTab.LONG_TERM) }, disabled = stopped, extraPadding = true) ChatPreferencesItem(showCustomModal, stopped = stopped) @@ -473,10 +479,10 @@ fun PreferenceToggleWithIcon( } } -private fun runAuth(context: Context, onFinish: (success: Boolean) -> Unit) { +private fun runAuth(title: String, desc: String, context: Context, onFinish: (success: Boolean) -> Unit) { authenticate( - generalGetString(R.string.auth_open_chat_console), - generalGetString(R.string.auth_log_in_using_credential), + title, + desc, context as FragmentActivity, completed = { laResult -> onFinish(laResult == LAResult.Success || laResult is LAResult.Unavailable) @@ -506,7 +512,7 @@ fun PreviewSettingsLayout() { showSettingsModalWithSearch = { }, showCustomModal = { {} }, showVersion = {}, - withAuth = {}, + withAuth = { _, _, _ -> }, ) } } diff --git a/apps/android/app/src/main/res/values/strings.xml b/apps/android/app/src/main/res/values/strings.xml index 15621e0e5f..578c14a298 100644 --- a/apps/android/app/src/main/res/values/strings.xml +++ b/apps/android/app/src/main/res/values/strings.xml @@ -194,6 +194,7 @@ Device authentication is disabled. Turning off SimpleX Lock. Stop chat Open chat console + Open chat profiles SimpleX Lock not enabled! You can turn on SimpleX Lock via Settings.