diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundFragment.kt index 506edd4e8d..a92d407f96 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundFragment.kt @@ -55,12 +55,14 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController +import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.signal.core.ui.Buttons import org.signal.core.ui.Dividers import org.signal.core.ui.Snackbars @@ -121,6 +123,7 @@ class InternalBackupPlaygroundFragment : ComposeFragment() { @Composable override fun FragmentContent() { + val context = LocalContext.current val state by viewModel.state val mediaState by viewModel.mediaState @@ -172,7 +175,13 @@ class InternalBackupPlaygroundFragment : ComposeFragment() { validateFileLauncher.launch(intent) }, onTriggerBackupJobClicked = { viewModel.triggerBackupJob() }, - onRestoreFromRemoteClicked = { viewModel.restoreFromRemote() } + onWipeDataAndRestoreClicked = { + MaterialAlertDialogBuilder(context) + .setTitle("Are you sure?") + .setMessage("This will delete all of your chats! Make sure you've finished a backup first, we don't check for you. Only do this on a test device!") + .setPositiveButton("Wipe and restore") { _, _ -> viewModel.wipeAllDataAndRestoreFromRemote() } + .show() + } ) }, mediaContent = { snackbarHostState -> @@ -265,7 +274,7 @@ fun Screen( onUploadToRemoteClicked: () -> Unit = {}, onCheckRemoteBackupStateClicked: () -> Unit = {}, onTriggerBackupJobClicked: () -> Unit = {}, - onRestoreFromRemoteClicked: () -> Unit = {} + onWipeDataAndRestoreClicked: () -> Unit = {} ) { val scrollState = rememberScrollState() @@ -278,6 +287,20 @@ fun Screen( .verticalScroll(scrollState) .padding(16.dp) ) { + Buttons.LargePrimary( + onClick = onTriggerBackupJobClicked + ) { + Text("Enqueue remote backup") + } + + Buttons.LargeTonal( + onClick = onWipeDataAndRestoreClicked + ) { + Text("Wipe data and restore") + } + + Dividers.Default() + Row( verticalAlignment = Alignment.CenterVertically ) { @@ -305,13 +328,6 @@ fun Screen( Text("Export to backup directory") } - Buttons.LargePrimary( - onClick = onTriggerBackupJobClicked, - enabled = !state.backupState.inProgress - ) { - Text("Trigger Backup Job") - } - Dividers.Default() Buttons.LargeTonal( @@ -407,10 +423,6 @@ fun Screen( Spacer(modifier = Modifier.height(8.dp)) - Buttons.LargePrimary(onClick = onRestoreFromRemoteClicked) { - Text("Restore from remote") - } - when (state.uploadState) { BackupUploadState.NONE -> { StateLabel("") diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundViewModel.kt index 882c595dd1..09f71c6b28 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/backup/InternalBackupPlaygroundViewModel.kt @@ -18,6 +18,7 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.kotlin.subscribeBy import io.reactivex.rxjava3.schedulers.Schedulers +import org.signal.core.util.concurrent.SignalExecutors import org.signal.libsignal.zkgroup.profiles.ProfileKey import org.thoughtcrime.securesms.attachments.AttachmentId import org.thoughtcrime.securesms.attachments.DatabaseAttachment @@ -208,7 +209,15 @@ class InternalBackupPlaygroundViewModel : ViewModel() { } } - fun restoreFromRemote() { + fun wipeAllDataAndRestoreFromRemote() { + SignalExecutors.BOUNDED_IO.execute { + SignalDatabase.threads.deleteAllConversations() + AppDependencies.messageNotifier.updateNotification(AppDependencies.application) + restoreFromRemote() + } + } + + private fun restoreFromRemote() { _state.value = _state.value.copy(backupState = BackupState.IMPORT_IN_PROGRESS) disposables += Single.fromCallable {