diff --git a/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/restore/RemoteRestoreActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/restore/RemoteRestoreActivity.kt index 5429fa68c6..7b41602e9a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/restore/RemoteRestoreActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/restore/RemoteRestoreActivity.kt @@ -291,6 +291,7 @@ private fun BackupAvailableContent( } RegistrationScreen( + menu = null, topContent = { if (state.backupTier != null) { RegistrationScreenTitleSubtitle( diff --git a/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/restore/RestoreViaQrFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/restore/RestoreViaQrFragment.kt index de6d151282..43d30b8a90 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/restore/RestoreViaQrFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/restore/RestoreViaQrFragment.kt @@ -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, diff --git a/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/shared/RegistrationScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/shared/RegistrationScreen.kt index 17b950abf5..ed27eb7aeb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/shared/RegistrationScreen.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/shared/RegistrationScreen.kt @@ -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 = {}) { diff --git a/app/src/main/res/navigation/registration_v3.xml b/app/src/main/res/navigation/registration_v3.xml index e1c35d940e..412970726c 100644 --- a/app/src/main/res/navigation/registration_v3.xml +++ b/app/src/main/res/navigation/registration_v3.xml @@ -87,6 +87,14 @@ app:popExitAnim="@anim/nav_default_pop_exit_anim" app:popUpTo="@+id/welcomeFragment" app:popUpToInclusive="true" /> + +