Add edit proxy ability to quick restore flow.

This commit is contained in:
Cody Henthorne
2025-09-15 14:57:24 -04:00
committed by Greyson Parrelli
parent b1b99855b2
commit 901a81fb74
4 changed files with 58 additions and 5 deletions

View File

@@ -291,6 +291,7 @@ private fun BackupAvailableContent(
}
RegistrationScreen(
menu = null,
topContent = {
if (state.backupTier != null) {
RegistrationScreenTitleSubtitle(

View File

@@ -28,19 +28,23 @@ import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.fragment.app.activityViewModels
@@ -59,6 +63,7 @@ import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.launch
import org.signal.core.ui.compose.Buttons
import org.signal.core.ui.compose.Dialogs
import org.signal.core.ui.compose.DropdownMenus
import org.signal.core.ui.compose.Previews
import org.signal.core.ui.compose.SignalPreview
import org.signal.core.ui.compose.horizontalGutters
@@ -71,6 +76,7 @@ import org.thoughtcrime.securesms.compose.ComposeFragment
import org.thoughtcrime.securesms.registration.data.network.RegisterAccountResult
import org.thoughtcrime.securesms.registrationv3.ui.RegistrationViewModel
import org.thoughtcrime.securesms.registrationv3.ui.shared.RegistrationScreen
import org.thoughtcrime.securesms.registrationv3.ui.shared.RegistrationScreenTitleSubtitle
import org.thoughtcrime.securesms.util.navigation.safeNavigate
/**
@@ -122,6 +128,7 @@ class RestoreViaQrFragment : ComposeFragment() {
is RegisterAccountResult.AttemptsExhausted -> {
findNavController().safeNavigate(RestoreViaQrFragmentDirections.goToAccountLocked())
}
else -> Unit
}
}
@@ -150,7 +157,8 @@ class RestoreViaQrFragment : ComposeFragment() {
state = state,
onRetryQrCode = viewModel::restart,
onRegistrationErrorDismiss = viewModel::clearRegistrationError,
onCancel = { findNavController().popBackStack() }
onCancel = { findNavController().popBackStack() },
onUseProxy = { findNavController().safeNavigate(RestoreViaQrFragmentDirections.goToEditProxy()) }
)
}
}
@@ -161,11 +169,38 @@ private fun RestoreViaQrScreen(
state: RestoreViaQrViewModel.RestoreViaQrState,
onRetryQrCode: () -> Unit = {},
onRegistrationErrorDismiss: () -> Unit = {},
onCancel: () -> Unit = {}
onCancel: () -> Unit = {},
onUseProxy: () -> Unit = {}
) {
RegistrationScreen(
title = stringResource(R.string.RestoreViaQr_title),
subtitle = null,
menu = {
Box(modifier = Modifier.align(Alignment.End)) {
val controller = remember { DropdownMenus.MenuController() }
IconButton(onClick = { controller.toggle() }) {
Icon(
imageVector = ImageVector.vectorResource(R.drawable.symbol_more_vertical_24),
contentDescription = null
)
}
DropdownMenus.Menu(controller = controller) {
DropdownMenus.Item(
text = { Text(stringResource(R.string.preferences_use_proxy)) },
onClick = {
controller.hide()
onUseProxy()
}
)
}
}
},
topContent = {
RegistrationScreenTitleSubtitle(
title = stringResource(R.string.RestoreViaQr_title),
subtitle = null
)
},
bottomContent = {
TextButton(
onClick = onCancel,

View File

@@ -67,6 +67,7 @@ fun RegistrationScreen(
mainContent: @Composable ColumnScope.() -> Unit
) {
RegistrationScreen(
menu = null,
topContent = { RegistrationScreenTitleSubtitle(title, subtitle) },
bottomContent = bottomContent,
mainContent = mainContent
@@ -101,6 +102,7 @@ fun RegistrationScreenTitleSubtitle(
*/
@Composable
fun RegistrationScreen(
menu: @Composable (ColumnScope.() -> Unit)?,
topContent: @Composable ColumnScope.() -> Unit,
bottomContent: @Composable BoxScope.() -> Unit,
mainContent: @Composable ColumnScope.() -> Unit
@@ -121,9 +123,15 @@ fun RegistrationScreen(
modifier = Modifier
.verticalScroll(scrollState)
.weight(weight = 1f, fill = false)
.padding(top = 40.dp, bottom = 16.dp)
.padding(bottom = 16.dp)
.horizontalGutters()
) {
if (menu != null) {
menu()
} else {
Spacer(Modifier.height(40.dp))
}
Column(
modifier = Modifier
.fillMaxWidth()
@@ -186,6 +194,7 @@ private fun RegistrationScreenPreview() {
private fun RegistrationScreenNoTitlePreview() {
Previews.Preview {
RegistrationScreen(
menu = null,
topContent = { Text("Top content") },
bottomContent = {
TextButton(onClick = {}) {