Add dialog to backpress on create account flow

This commit is contained in:
bemusementpark 2024-07-03 18:53:55 +09:30
parent 4660905c09
commit 39f9b959ce
5 changed files with 75 additions and 20 deletions

View File

@ -0,0 +1,31 @@
package org.thoughtcrime.securesms.onboarding
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import network.loki.messenger.R
import org.thoughtcrime.securesms.ui.AlertDialog
import org.thoughtcrime.securesms.ui.DialogButtonModel
import org.thoughtcrime.securesms.ui.GetString
import org.thoughtcrime.securesms.ui.color.LocalColors
@Composable
fun OnboardingBackPressAlertDialog(
dismissDialog: () -> Unit,
quit: () -> Unit
) {
AlertDialog(
onDismissRequest = dismissDialog,
title = stringResource(R.string.warning),
text = stringResource(R.string.you_cannot_go_back_further_in_order_to_stop_loading_your_account_session_needs_to_quit),
buttons = listOf(
DialogButtonModel(
GetString(stringResource(R.string.quit)),
color = LocalColors.current.danger,
onClick = quit
),
DialogButtonModel(
GetString(stringResource(R.string.cancel))
)
)
)
}

View File

@ -19,6 +19,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import network.loki.messenger.R import network.loki.messenger.R
import org.thoughtcrime.securesms.onboarding.OnboardingBackPressAlertDialog
import org.thoughtcrime.securesms.onboarding.messagenotifications.MessageNotificationsViewModel.UiState import org.thoughtcrime.securesms.onboarding.messagenotifications.MessageNotificationsViewModel.UiState
import org.thoughtcrime.securesms.onboarding.ui.ContinuePrimaryOutlineButton import org.thoughtcrime.securesms.onboarding.ui.ContinuePrimaryOutlineButton
import org.thoughtcrime.securesms.ui.AlertDialog import org.thoughtcrime.securesms.ui.AlertDialog
@ -57,21 +58,7 @@ internal fun MessageNotificationsScreen(
return return
} }
if (state.showDialog) AlertDialog( if (state.showDialog) OnboardingBackPressAlertDialog(dismissDialog, quit)
onDismissRequest = dismissDialog,
title = stringResource(R.string.warning),
text = stringResource(R.string.you_cannot_go_back_further_in_order_to_stop_loading_your_account_session_needs_to_quit),
buttons = listOf(
DialogButtonModel(
GetString(stringResource(R.string.quit)),
color = LocalColors.current.danger,
onClick = quit
),
DialogButtonModel(
GetString(stringResource(R.string.cancel))
)
)
)
Column { Column {
Spacer(Modifier.weight(1f)) Spacer(Modifier.weight(1f))

View File

@ -15,6 +15,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import network.loki.messenger.R import network.loki.messenger.R
import org.thoughtcrime.securesms.onboarding.OnboardingBackPressAlertDialog
import org.thoughtcrime.securesms.onboarding.ui.ContinuePrimaryOutlineButton import org.thoughtcrime.securesms.onboarding.ui.ContinuePrimaryOutlineButton
import org.thoughtcrime.securesms.ui.LocalDimensions import org.thoughtcrime.securesms.ui.LocalDimensions
import org.thoughtcrime.securesms.ui.PreviewTheme import org.thoughtcrime.securesms.ui.PreviewTheme
@ -24,14 +25,23 @@ import org.thoughtcrime.securesms.ui.h4
@Preview @Preview
@Composable @Composable
private fun PreviewDisplayName() { private fun PreviewPickDisplayName() {
PreviewTheme { PreviewTheme {
DisplayName(State()) PickDisplayName(State())
} }
} }
@Composable @Composable
internal fun DisplayName(state: State, onChange: (String) -> Unit = {}, onContinue: () -> Unit = {}) { internal fun PickDisplayName(
state: State,
onChange: (String) -> Unit = {},
onContinue: () -> Unit = {},
dismissDialog: () -> Unit = {},
quit: () -> Unit = {}
) {
if (state.showDialog) OnboardingBackPressAlertDialog(dismissDialog, quit)
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()

View File

@ -53,8 +53,19 @@ class PickDisplayNameActivity : BaseActionBarActivity() {
@Composable @Composable
private fun DisplayNameScreen(viewModel: PickDisplayNameViewModel) { private fun DisplayNameScreen(viewModel: PickDisplayNameViewModel) {
val state = viewModel.states.collectAsState() PickDisplayName(
DisplayName(state.value, viewModel::onChange) { viewModel.onContinue() } viewModel.states.collectAsState().value,
viewModel::onChange,
viewModel::onContinue,
viewModel::dismissDialog
) { viewModel.dismissDialog(); finish() }
}
override fun onBackPressed() {
if (viewModel.onBackPressed()) return
@Suppress("DEPRECATION")
super.onBackPressed()
} }
} }

View File

@ -16,13 +16,17 @@ import kotlinx.coroutines.launch
import network.loki.messenger.R import network.loki.messenger.R
import org.session.libsession.utilities.SSKEnvironment.ProfileManagerProtocol.Companion.NAME_PADDED_LENGTH import org.session.libsession.utilities.SSKEnvironment.ProfileManagerProtocol.Companion.NAME_PADDED_LENGTH
import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.TextSecurePreferences
import org.thoughtcrime.securesms.ApplicationContext
import org.thoughtcrime.securesms.dependencies.ConfigFactory import org.thoughtcrime.securesms.dependencies.ConfigFactory
import org.thoughtcrime.securesms.onboarding.messagenotifications.MessageNotificationsViewModel
internal class PickDisplayNameViewModel( internal class PickDisplayNameViewModel(
private val loadFailed: Boolean, private val loadFailed: Boolean,
private val prefs: TextSecurePreferences, private val prefs: TextSecurePreferences,
private val configFactory: ConfigFactory private val configFactory: ConfigFactory
): ViewModel() { ): ViewModel() {
private val isCreateAccount = !loadFailed
private val _states = MutableStateFlow(if (loadFailed) pickNewNameState() else State()) private val _states = MutableStateFlow(if (loadFailed) pickNewNameState() else State())
val states = _states.asStateFlow() val states = _states.asStateFlow()
@ -63,6 +67,17 @@ internal class PickDisplayNameViewModel(
} }
} }
/**
* @return [true] if the back press was handled.
*/
fun onBackPressed(): Boolean = isCreateAccount.also {
if (it) _states.update { it.copy(showDialog = true) }
}
fun dismissDialog() {
_states.update { it.copy(showDialog = false) }
}
@dagger.assisted.AssistedFactory @dagger.assisted.AssistedFactory
interface AssistedFactory { interface AssistedFactory {
fun create(loadFailed: Boolean): Factory fun create(loadFailed: Boolean): Factory
@ -84,6 +99,7 @@ internal class PickDisplayNameViewModel(
data class State( data class State(
@StringRes val title: Int = R.string.displayNamePick, @StringRes val title: Int = R.string.displayNamePick,
@StringRes val description: Int = R.string.displayNameDescription, @StringRes val description: Int = R.string.displayNameDescription,
val showDialog: Boolean = false,
val isTextErrorColor: Boolean = false, val isTextErrorColor: Boolean = false,
@StringRes val error: Int? = null, @StringRes val error: Int? = null,
val displayName: String = "" val displayName: String = ""