Show skip restore warning.

This commit is contained in:
Cody Henthorne
2025-10-03 14:13:15 -04:00
parent cf1afb739f
commit 827ceafffb
6 changed files with 111 additions and 29 deletions

View File

@@ -7,8 +7,12 @@ package org.thoughtcrime.securesms.registration.ui.restore
import android.os.Bundle
import android.view.View
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
@@ -80,6 +84,7 @@ class EnterBackupKeyFragment : ComposeFragment() {
val state by viewModel.state.collectAsStateWithLifecycle()
val sharedState by sharedViewModel.state.collectAsStateWithLifecycle()
val contactSupportState: ContactSupportViewModel.ContactSupportState<Unit> by contactSupportViewModel.state.collectAsStateWithLifecycle()
var showSkipRestoreWarning by remember { mutableStateOf(false) }
SendSupportEmailEffect(
contactSupportState = contactSupportState,
@@ -110,10 +115,23 @@ class EnterBackupKeyFragment : ComposeFragment() {
},
onLearnMore = { CommunicationActions.openBrowserLink(requireContext(), LEARN_MORE_URL) },
onSkip = {
sharedViewModel.skipRestore()
findNavController().safeNavigate(EnterBackupKeyFragmentDirections.goToEnterPhoneNumber(EnterPhoneNumberMode.RESTART_AFTER_COLLECTION))
showSkipRestoreWarning = true
},
dialogContent = {
if (showSkipRestoreWarning) {
Dialogs.SimpleAlertDialog(
title = stringResource(R.string.SelectRestoreMethodFragment__skip_restore_title),
body = stringResource(R.string.SelectRestoreMethodFragment__skip_restore_warning),
confirm = stringResource(R.string.SelectRestoreMethodFragment__skip_restore),
dismiss = stringResource(android.R.string.cancel),
onConfirm = {
sharedViewModel.skipRestore()
findNavController().safeNavigate(EnterBackupKeyFragmentDirections.goToEnterPhoneNumber(EnterPhoneNumberMode.RESTART_AFTER_COLLECTION))
},
onDismiss = { showSkipRestoreWarning = false },
confirmColor = MaterialTheme.colorScheme.error
)
}
if (contactSupportState.show) {
ContactSupportDialog(
showInProgress = contactSupportState.showAsProgress,

View File

@@ -32,6 +32,9 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
@@ -150,6 +153,7 @@ class RemoteRestoreActivity : BaseActivity() {
setContent {
val state: RemoteRestoreViewModel.ScreenState by viewModel.state.collectAsStateWithLifecycle()
val contactSupportState: ContactSupportViewModel.ContactSupportState<ContactSupportReason> by contactSupportViewModel.state.collectAsStateWithLifecycle()
var showSkipRestoreWarning by remember { mutableStateOf(false) }
SendSupportEmailEffect(
contactSupportState = contactSupportState,
@@ -178,13 +182,9 @@ class RemoteRestoreActivity : BaseActivity() {
onRetryRestoreTier = { viewModel.reload() },
onContactSupport = { contactSupportViewModel.showContactSupport() },
onCancelClick = {
lifecycleScope.launch {
if (state.isRemoteRestoreOnlyOption) {
viewModel.skipRestore()
viewModel.performStorageServiceAccountRestoreIfNeeded()
startActivity(MainActivity.clearTop(this@RemoteRestoreActivity))
}
if (state.isRemoteRestoreOnlyOption) {
showSkipRestoreWarning = true
} else {
finish()
}
},
@@ -194,6 +194,25 @@ class RemoteRestoreActivity : BaseActivity() {
},
contactSupportCallbacks = contactSupportViewModel
)
if (showSkipRestoreWarning) {
Dialogs.SimpleAlertDialog(
title = stringResource(R.string.SelectRestoreMethodFragment__skip_restore_title),
body = stringResource(R.string.SelectRestoreMethodFragment__skip_restore_warning),
confirm = stringResource(R.string.SelectRestoreMethodFragment__skip_restore),
dismiss = stringResource(android.R.string.cancel),
onConfirm = {
lifecycleScope.launch {
viewModel.skipRestore()
viewModel.performStorageServiceAccountRestoreIfNeeded()
startActivity(MainActivity.clearTop(this@RemoteRestoreActivity))
finish()
}
},
onDismiss = { showSkipRestoreWarning = false },
confirmColor = MaterialTheme.colorScheme.error
)
}
}
}
}

View File

@@ -134,10 +134,6 @@ class RemoteRestoreViewModel(isOnlyRestoreOption: Boolean) : ViewModel() {
store.update { it.copy(restoreProgress = restoreEvent) }
}
fun cancel() {
SignalStore.registration.restoreDecisionState = RestoreDecisionState.Skipped
}
fun clearError() {
store.update { it.copy(importState = ImportState.None, restoreProgress = null) }
}

View File

@@ -8,10 +8,18 @@ package org.thoughtcrime.securesms.registration.ui.restore
import android.app.Activity
import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource
import androidx.fragment.app.activityViewModels
import androidx.navigation.fragment.findNavController
import org.signal.core.ui.compose.Dialogs
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.compose.ComposeFragment
import org.thoughtcrime.securesms.registration.ui.RegistrationViewModel
import org.thoughtcrime.securesms.registration.ui.phonenumber.EnterPhoneNumberMode
@@ -44,14 +52,30 @@ class SelectManualRestoreMethodFragment : ComposeFragment() {
@Composable
override fun FragmentContent() {
var showSkipRestoreWarning by remember { mutableStateOf(false) }
SelectRestoreMethodScreen(
restoreMethods = listOf(RestoreMethod.FROM_SIGNAL_BACKUPS, RestoreMethod.FROM_LOCAL_BACKUP_V1),
onRestoreMethodClicked = this::startRestoreMethod,
onSkip = {
sharedViewModel.skipRestore()
findNavController().safeNavigate(SelectManualRestoreMethodFragmentDirections.goToEnterPhoneNumber(EnterPhoneNumberMode.NORMAL))
showSkipRestoreWarning = true
}
)
) {
if (showSkipRestoreWarning) {
Dialogs.SimpleAlertDialog(
title = stringResource(R.string.SelectRestoreMethodFragment__skip_restore_title),
body = stringResource(R.string.SelectRestoreMethodFragment__skip_restore_warning),
confirm = stringResource(R.string.SelectRestoreMethodFragment__skip_restore),
dismiss = stringResource(android.R.string.cancel),
onConfirm = {
sharedViewModel.skipRestore()
findNavController().safeNavigate(SelectManualRestoreMethodFragmentDirections.goToEnterPhoneNumber(EnterPhoneNumberMode.NORMAL))
},
onDismiss = { showSkipRestoreWarning = false },
confirmColor = MaterialTheme.colorScheme.error
)
}
}
}
private fun startRestoreMethod(method: RestoreMethod) {

View File

@@ -5,7 +5,13 @@
package org.thoughtcrime.securesms.restore.selection
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
@@ -15,6 +21,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.signal.core.ui.compose.Dialogs
import org.thoughtcrime.securesms.MainActivity
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.compose.ComposeFragment
import org.thoughtcrime.securesms.registration.data.QuickRegistrationRepository
import org.thoughtcrime.securesms.registration.ui.restore.RemoteRestoreActivity
@@ -33,25 +40,37 @@ class SelectRestoreMethodFragment : ComposeFragment() {
@Composable
override fun FragmentContent() {
var showSkipRestoreWarning by remember { mutableStateOf(false) }
SelectRestoreMethodScreen(
restoreMethods = viewModel.getAvailableRestoreMethods(),
onRestoreMethodClicked = this::startRestoreMethod,
onSkip = {
viewLifecycleOwner.lifecycleScope.launch {
viewModel.skipRestore()
viewModel.performStorageServiceAccountRestoreIfNeeded()
if (isActive) {
withContext(Dispatchers.Main) {
startActivity(MainActivity.clearTop(requireContext()))
activity?.finish()
}
}
}
}
onSkip = { showSkipRestoreWarning = true }
) {
if (viewModel.showStorageAccountRestoreProgress) {
Dialogs.IndeterminateProgressDialog()
} else if (showSkipRestoreWarning) {
Dialogs.SimpleAlertDialog(
title = stringResource(R.string.SelectRestoreMethodFragment__skip_restore_title),
body = stringResource(R.string.SelectRestoreMethodFragment__skip_restore_warning),
confirm = stringResource(R.string.SelectRestoreMethodFragment__skip_restore),
dismiss = stringResource(android.R.string.cancel),
onConfirm = {
lifecycleScope.launch {
viewModel.skipRestore()
viewModel.performStorageServiceAccountRestoreIfNeeded()
if (isActive) {
withContext(Dispatchers.Main) {
startActivity(MainActivity.clearTop(requireContext()))
activity?.finish()
}
}
}
},
onDismiss = { showSkipRestoreWarning = false },
confirmColor = MaterialTheme.colorScheme.error
)
}
}
}

View File

@@ -8608,6 +8608,12 @@
<string name="SelectRestoreMethodFragment__from_your_old_phone">From your old phone</string>
<!-- Option subtitle for restoring via device transfer -->
<string name="SelectRestoreMethodFragment__transfer_directly_from_old">Transfer directly from your old Android</string>
<!-- Dialog title shown as a warning when skipping restore during registration -->
<string name="SelectRestoreMethodFragment__skip_restore_title">Skip restore?</string>
<!-- Dialog message shown as a warning when skipping restore during registration -->
<string name="SelectRestoreMethodFragment__skip_restore_warning">If you skip restore now you will not be able to restore later. If you re-enable backups after skipping restore, your current backup will be replaced with your new messaging history.</string>
<!-- Dialog confirm text shown as a warning when skipping restore during registration -->
<string name="SelectRestoreMethodFragment__skip_restore">Skip restore</string>
<!-- Screen title for restore via local backup -->
<string name="RestoreLocalBackup_title">Restore local backup</string>