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