From e07a3e05bf55407beea2590750fb482dfa855f75 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 25 Jun 2026 16:56:22 -0400 Subject: [PATCH] Store restoreDecision separately in regV5. --- .../v2/AppRegistrationStorageController.kt | 14 +++----------- .../dependencies/DemoStorageController.kt | 6 ++++++ .../sample/screens/main/MainScreen.kt | 4 +++- .../sample/screens/main/MainScreenState.kt | 3 ++- .../sample/screens/main/MainScreenViewModel.kt | 3 ++- .../sample/storage/RegistrationPreferences.kt | 6 ++++++ .../registration/RegistrationRepository.kt | 6 +----- .../org/signal/registration/RestoreDecision.kt | 17 +++++++++++++++++ .../signal/registration/StorageController.kt | 6 ++++++ .../complete/DeviceTransferCompleteViewModel.kt | 2 +- .../LocalBackupRestoreViewModel.kt | 2 +- .../screens/pincreation/PinCreationViewModel.kt | 2 +- .../pinentry/PinEntryForSvrRestoreViewModel.kt | 2 +- .../RemoteBackupRestoreViewModel.kt | 2 +- .../ArchiveRestoreSelectionViewModel.kt | 2 +- .../src/main/protowire/Registration.proto | 14 -------------- .../DeviceTransferCompleteViewModelTest.kt | 2 +- .../LocalBackupRestoreViewModelTest.kt | 2 +- .../pincreation/PinCreationViewModelTest.kt | 2 +- .../PinEntryForSvrRestoreViewModelTest.kt | 2 +- .../RemoteBackupRestoreViewModelTest.kt | 2 +- .../ArchiveRestoreSelectionViewModelTest.kt | 2 +- 22 files changed, 58 insertions(+), 45 deletions(-) create mode 100644 feature/registration/src/main/java/org/signal/registration/RestoreDecision.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/v2/AppRegistrationStorageController.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/v2/AppRegistrationStorageController.kt index 71162968c4..915e0e1a2d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/v2/AppRegistrationStorageController.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/v2/AppRegistrationStorageController.kt @@ -27,10 +27,10 @@ import org.signal.core.util.StreamUtil import org.signal.core.util.crypto.AttachmentSecretProvider import org.signal.core.util.logging.Log import org.signal.registration.PreExistingRegistrationData +import org.signal.registration.RestoreDecision import org.signal.registration.StorageController import org.signal.registration.StoredProfileData import org.signal.registration.proto.RegistrationData -import org.signal.registration.proto.RestoreDecision import org.signal.registration.screens.localbackuprestore.LocalBackupInfo import org.signal.registration.screens.remotebackuprestore.RemoteBackupRestoreProgress import org.thoughtcrime.securesms.backup.FullBackupImporter @@ -244,26 +244,18 @@ class AppRegistrationStorageController(private val context: Context) : StorageCo SignalStore.svr.masterKeyForInitialDataRestore = MasterKey(data.temporaryMasterKey.toByteArray()) } - applyRestoreDecision(data.restoreDecision) - RegistrationUtil.maybeMarkRegistrationComplete() } - /** - * Translates the registration module's [RestoreDecision] into the app's [RestoreDecisionState] so the rest of the app - * knows whether we're a fresh account, skipped a restore, or successfully restored data. Only applied while the - * decision is still pending, since the state machine is otherwise terminal. - */ - private fun applyRestoreDecision(decision: RestoreDecision) { + override suspend fun setRestoreDecision(decision: RestoreDecision) = withContext(Dispatchers.IO) { if (!SignalStore.registration.restoreDecisionState.isDecisionPending) { - return + return@withContext } SignalStore.registration.restoreDecisionState = when (decision) { RestoreDecision.NEW_ACCOUNT -> RestoreDecisionState.NewAccount RestoreDecision.SKIPPED -> RestoreDecisionState.Skipped RestoreDecision.COMPLETED -> RestoreDecisionState.Completed - RestoreDecision.UNSET -> return } } diff --git a/demo/registration/src/main/java/org/signal/registration/sample/dependencies/DemoStorageController.kt b/demo/registration/src/main/java/org/signal/registration/sample/dependencies/DemoStorageController.kt index c0b92285e5..d349fef2b1 100644 --- a/demo/registration/src/main/java/org/signal/registration/sample/dependencies/DemoStorageController.kt +++ b/demo/registration/src/main/java/org/signal/registration/sample/dependencies/DemoStorageController.kt @@ -27,6 +27,7 @@ import org.signal.libsignal.zkgroup.profiles.ProfileKey import org.signal.registration.NetworkController import org.signal.registration.NewRegistrationData import org.signal.registration.PreExistingRegistrationData +import org.signal.registration.RestoreDecision import org.signal.registration.StorageController import org.signal.registration.StoredProfileData import org.signal.registration.proto.ProvisioningData @@ -196,6 +197,11 @@ class DemoStorageController(private val context: Context) : StorageController { Unit } + override suspend fun setRestoreDecision(decision: RestoreDecision) = withContext(Dispatchers.IO) { + Log.i(TAG, "[setRestoreDecision] Recording restore decision: $decision") + RegistrationPreferences.restoreDecision = decision + } + override suspend fun scanLocalBackupFolder(folderUri: Uri): List = withContext(Dispatchers.IO) { val folder = DocumentFile.fromTreeUri(context, folderUri) ?: return@withContext emptyList() val children = folder.listFiles() diff --git a/demo/registration/src/main/java/org/signal/registration/sample/screens/main/MainScreen.kt b/demo/registration/src/main/java/org/signal/registration/sample/screens/main/MainScreen.kt index b90c147bef..2df456de5c 100644 --- a/demo/registration/src/main/java/org/signal/registration/sample/screens/main/MainScreen.kt +++ b/demo/registration/src/main/java/org/signal/registration/sample/screens/main/MainScreen.kt @@ -225,6 +225,7 @@ private fun RegistrationInfo(data: MainScreenState.ExistingRegistrationState) { RegistrationField(label = "PNI", value = data.pni) RegistrationField(label = "AEP", value = data.aep) RegistrationField(label = "Temporary Master Key", value = data.temporaryMasterKey ?: "null") + RegistrationField(label = "Restore Decision", value = data.restoreDecision ?: "(unset)") if (data.pinsOptedOut) { RegistrationField(label = "PINs Opted Out", value = "Yes") } else { @@ -377,7 +378,8 @@ private fun MainScreenWithRegistrationPreview() { pin = "1234", registrationLockEnabled = true, pinsOptedOut = false, - temporaryMasterKey = null + temporaryMasterKey = null, + restoreDecision = "COMPLETED" ), profileState = MainScreenState.ProfileState( givenName = "Ada", diff --git a/demo/registration/src/main/java/org/signal/registration/sample/screens/main/MainScreenState.kt b/demo/registration/src/main/java/org/signal/registration/sample/screens/main/MainScreenState.kt index 9a5d9f25a1..cc55105bdc 100644 --- a/demo/registration/src/main/java/org/signal/registration/sample/screens/main/MainScreenState.kt +++ b/demo/registration/src/main/java/org/signal/registration/sample/screens/main/MainScreenState.kt @@ -27,7 +27,8 @@ data class MainScreenState( val pin: String?, val registrationLockEnabled: Boolean, val pinsOptedOut: Boolean, - val temporaryMasterKey: String? + val temporaryMasterKey: String?, + val restoreDecision: String? ) data class ProfileState( diff --git a/demo/registration/src/main/java/org/signal/registration/sample/screens/main/MainScreenViewModel.kt b/demo/registration/src/main/java/org/signal/registration/sample/screens/main/MainScreenViewModel.kt index 2c0dce8132..078b01aeeb 100644 --- a/demo/registration/src/main/java/org/signal/registration/sample/screens/main/MainScreenViewModel.kt +++ b/demo/registration/src/main/java/org/signal/registration/sample/screens/main/MainScreenViewModel.kt @@ -74,7 +74,8 @@ class MainScreenViewModel( pinsOptedOut = RegistrationPreferences.pinsOptedOut, temporaryMasterKey = RegistrationPreferences.temporaryMasterKey?.let { Base64.encodeWithPadding(it.serialize()) - } + }, + restoreDecision = RegistrationPreferences.restoreDecision?.name ) } else { null diff --git a/demo/registration/src/main/java/org/signal/registration/sample/storage/RegistrationPreferences.kt b/demo/registration/src/main/java/org/signal/registration/sample/storage/RegistrationPreferences.kt index 48d90598a5..52a94f3372 100644 --- a/demo/registration/src/main/java/org/signal/registration/sample/storage/RegistrationPreferences.kt +++ b/demo/registration/src/main/java/org/signal/registration/sample/storage/RegistrationPreferences.kt @@ -19,6 +19,7 @@ import org.signal.libsignal.zkgroup.profiles.ProfileKey import org.signal.registration.NetworkController import org.signal.registration.NewRegistrationData import org.signal.registration.PreExistingRegistrationData +import org.signal.registration.RestoreDecision /** * SharedPreferences-based storage for registration data that doesn't need @@ -58,6 +59,7 @@ object RegistrationPreferences { private const val KEY_PROFILE_FAMILY_NAME = "profile_family_name" private const val KEY_PROFILE_AVATAR = "profile_avatar" private const val KEY_PROFILE_DISCOVERABLE = "profile_discoverable" + private const val KEY_RESTORE_DECISION = "restore_decision" fun init(context: Application) { this.context = context @@ -141,6 +143,10 @@ object RegistrationPreferences { get() = prefs.getBoolean(KEY_FETCHES_MESSAGES, true) set(value) = prefs.edit { putBoolean(KEY_FETCHES_MESSAGES, value) } + var restoreDecision: RestoreDecision? + get() = prefs.getString(KEY_RESTORE_DECISION, null)?.let { runCatching { RestoreDecision.valueOf(it) }.getOrNull() } + set(value) = prefs.edit { putString(KEY_RESTORE_DECISION, value?.name) } + var profileGivenName: String get() = prefs.getString(KEY_PROFILE_GIVEN_NAME, "") ?: "" set(value) = prefs.edit { putString(KEY_PROFILE_GIVEN_NAME, value) } diff --git a/feature/registration/src/main/java/org/signal/registration/RegistrationRepository.kt b/feature/registration/src/main/java/org/signal/registration/RegistrationRepository.kt index 3fc4281228..5a9f62e57a 100644 --- a/feature/registration/src/main/java/org/signal/registration/RegistrationRepository.kt +++ b/feature/registration/src/main/java/org/signal/registration/RegistrationRepository.kt @@ -41,7 +41,6 @@ import org.signal.registration.NetworkController.SessionMetadata import org.signal.registration.NetworkController.SvrCredentials import org.signal.registration.NetworkController.UpdateSessionError import org.signal.registration.proto.ProvisioningData -import org.signal.registration.proto.RestoreDecision import org.signal.registration.proto.SvrCredential import org.signal.registration.screens.localbackuprestore.LocalBackupInfo import org.signal.registration.screens.remotebackuprestore.RemoteBackupRestoreProgress @@ -543,10 +542,7 @@ class RegistrationRepository(val context: Context, val networkController: Networ */ suspend fun setRestoreDecision(decision: RestoreDecision): Unit = withContext(Dispatchers.IO) { Log.i(TAG, "[setRestoreDecision] Recording restore decision: $decision") - storageController.updateInProgressRegistrationData { - this.restoreDecision = decision - } - storageController.commitRegistrationData() + storageController.setRestoreDecision(decision) } suspend fun getPreExistingRegistrationData(): PreExistingRegistrationData? { diff --git a/feature/registration/src/main/java/org/signal/registration/RestoreDecision.kt b/feature/registration/src/main/java/org/signal/registration/RestoreDecision.kt new file mode 100644 index 0000000000..b2b72d6cd7 --- /dev/null +++ b/feature/registration/src/main/java/org/signal/registration/RestoreDecision.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2025 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.signal.registration + +/** + * The terminal restore decision the user reached during registration. Mirrors the terminal states of the app's + * RestoreDecisionState. We intentionally do not model the transient pending states (START / INTEND_TO_RESTORE) + * here, as the registration flow performs any restore inline before completing. + */ +enum class RestoreDecision { + NEW_ACCOUNT, + SKIPPED, + COMPLETED +} diff --git a/feature/registration/src/main/java/org/signal/registration/StorageController.kt b/feature/registration/src/main/java/org/signal/registration/StorageController.kt index 0e4f466de8..382f84684d 100644 --- a/feature/registration/src/main/java/org/signal/registration/StorageController.kt +++ b/feature/registration/src/main/java/org/signal/registration/StorageController.kt @@ -83,6 +83,12 @@ interface StorageController { */ suspend fun commitRegistrationData() + /** + * Persists the terminal [RestoreDecision] the user reached during registration directly to permanent app state, + * so the rest of the app knows whether we're a fresh account, skipped a restore, or successfully restored data. + */ + suspend fun setRestoreDecision(decision: RestoreDecision) + /** * Begins restoring from a V1 (.backup) file identified by the given [uri]. * diff --git a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/complete/DeviceTransferCompleteViewModel.kt b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/complete/DeviceTransferCompleteViewModel.kt index 0224ddf1f4..99c8b2d1cd 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/complete/DeviceTransferCompleteViewModel.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/complete/DeviceTransferCompleteViewModel.kt @@ -13,7 +13,7 @@ import kotlinx.coroutines.flow.StateFlow import org.signal.core.util.logging.Log import org.signal.registration.RegistrationFlowEvent import org.signal.registration.RegistrationRepository -import org.signal.registration.proto.RestoreDecision +import org.signal.registration.RestoreDecision import org.signal.registration.screens.EventDrivenViewModel class DeviceTransferCompleteViewModel( diff --git a/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreViewModel.kt b/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreViewModel.kt index f6bcba65bd..5d587334c9 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreViewModel.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreViewModel.kt @@ -23,7 +23,7 @@ import org.signal.core.util.logging.Log import org.signal.registration.RegistrationFlowEvent import org.signal.registration.RegistrationRepository import org.signal.registration.RegistrationRoute -import org.signal.registration.proto.RestoreDecision +import org.signal.registration.RestoreDecision import org.signal.registration.screens.EventDrivenViewModel import org.signal.registration.screens.util.navigateBack import org.signal.registration.screens.util.navigateTo diff --git a/feature/registration/src/main/java/org/signal/registration/screens/pincreation/PinCreationViewModel.kt b/feature/registration/src/main/java/org/signal/registration/screens/pincreation/PinCreationViewModel.kt index 218c058d5a..be4c7947f9 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/pincreation/PinCreationViewModel.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/pincreation/PinCreationViewModel.kt @@ -21,7 +21,7 @@ import org.signal.registration.NetworkController import org.signal.registration.RegistrationFlowEvent import org.signal.registration.RegistrationFlowState import org.signal.registration.RegistrationRepository -import org.signal.registration.proto.RestoreDecision +import org.signal.registration.RestoreDecision import org.signal.registration.screens.EventDrivenViewModel /** diff --git a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForSvrRestoreViewModel.kt b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForSvrRestoreViewModel.kt index c795d1cb4b..ead0e0a555 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForSvrRestoreViewModel.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryForSvrRestoreViewModel.kt @@ -21,7 +21,7 @@ import org.signal.registration.RegistrationFlowEvent import org.signal.registration.RegistrationFlowState import org.signal.registration.RegistrationRepository import org.signal.registration.RegistrationRoute -import org.signal.registration.proto.RestoreDecision +import org.signal.registration.RestoreDecision import org.signal.registration.screens.EventDrivenViewModel import org.signal.registration.screens.util.navigateTo diff --git a/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreViewModel.kt b/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreViewModel.kt index 2d3f5e0e7c..25acc5806d 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreViewModel.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreViewModel.kt @@ -23,7 +23,7 @@ import org.signal.libsignal.net.RequestResult import org.signal.registration.NetworkController import org.signal.registration.RegistrationFlowEvent import org.signal.registration.RegistrationRepository -import org.signal.registration.proto.RestoreDecision +import org.signal.registration.RestoreDecision import org.signal.registration.screens.EventDrivenViewModel import org.signal.registration.screens.util.navigateBack import kotlin.coroutines.CoroutineContext diff --git a/feature/registration/src/main/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionViewModel.kt b/feature/registration/src/main/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionViewModel.kt index 5c2ecffbd1..c9166c64d7 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionViewModel.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionViewModel.kt @@ -23,7 +23,7 @@ import org.signal.registration.RegistrationFlowEvent import org.signal.registration.RegistrationFlowState import org.signal.registration.RegistrationRepository import org.signal.registration.RegistrationRoute -import org.signal.registration.proto.RestoreDecision +import org.signal.registration.RestoreDecision import org.signal.registration.screens.EventDrivenViewModel import org.signal.registration.screens.util.navigateTo diff --git a/feature/registration/src/main/protowire/Registration.proto b/feature/registration/src/main/protowire/Registration.proto index a1d5702db1..c3db3ef149 100644 --- a/feature/registration/src/main/protowire/Registration.proto +++ b/feature/registration/src/main/protowire/Registration.proto @@ -52,20 +52,6 @@ message RegistrationData { // JSON-serialized flow state snapshot (from saveFlowState/restoreFlowState) string flowStateJson = 21; - - // The terminal restore decision the user reached during this flow. The app translates this into its own - // RestoreDecisionState when committing, so the rest of the app knows whether we're a fresh account, skipped a - // restore, or successfully restored data. - RestoreDecision restoreDecision = 25; -} - -// Mirrors the terminal states of the app's RestoreDecisionState. We intentionally do not model the transient -// pending states (START / INTEND_TO_RESTORE) here, as the new flow performs any restore inline before completing. -enum RestoreDecision { - UNSET = 0; - NEW_ACCOUNT = 1; - SKIPPED = 2; - COMPLETED = 3; } message SvrCredential { diff --git a/feature/registration/src/test/java/org/signal/registration/screens/devicetransfer/complete/DeviceTransferCompleteViewModelTest.kt b/feature/registration/src/test/java/org/signal/registration/screens/devicetransfer/complete/DeviceTransferCompleteViewModelTest.kt index 91ca8036d6..a53918e870 100644 --- a/feature/registration/src/test/java/org/signal/registration/screens/devicetransfer/complete/DeviceTransferCompleteViewModelTest.kt +++ b/feature/registration/src/test/java/org/signal/registration/screens/devicetransfer/complete/DeviceTransferCompleteViewModelTest.kt @@ -18,7 +18,7 @@ import org.junit.Before import org.junit.Test import org.signal.registration.RegistrationFlowEvent import org.signal.registration.RegistrationRepository -import org.signal.registration.proto.RestoreDecision +import org.signal.registration.RestoreDecision @OptIn(ExperimentalCoroutinesApi::class) class DeviceTransferCompleteViewModelTest { diff --git a/feature/registration/src/test/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreViewModelTest.kt b/feature/registration/src/test/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreViewModelTest.kt index 8f1b0ebab8..907bcaa336 100644 --- a/feature/registration/src/test/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreViewModelTest.kt +++ b/feature/registration/src/test/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreViewModelTest.kt @@ -33,7 +33,7 @@ import org.signal.core.ui.navigation.ResultEventBus import org.signal.registration.RegistrationFlowEvent import org.signal.registration.RegistrationRepository import org.signal.registration.RegistrationRoute -import org.signal.registration.proto.RestoreDecision +import org.signal.registration.RestoreDecision import java.time.LocalDateTime @OptIn(ExperimentalCoroutinesApi::class) diff --git a/feature/registration/src/test/java/org/signal/registration/screens/pincreation/PinCreationViewModelTest.kt b/feature/registration/src/test/java/org/signal/registration/screens/pincreation/PinCreationViewModelTest.kt index 320b0daf32..f10ff08c7a 100644 --- a/feature/registration/src/test/java/org/signal/registration/screens/pincreation/PinCreationViewModelTest.kt +++ b/feature/registration/src/test/java/org/signal/registration/screens/pincreation/PinCreationViewModelTest.kt @@ -33,7 +33,7 @@ import org.signal.registration.NetworkController import org.signal.registration.RegistrationFlowEvent import org.signal.registration.RegistrationFlowState import org.signal.registration.RegistrationRepository -import org.signal.registration.proto.RestoreDecision +import org.signal.registration.RestoreDecision @OptIn(ExperimentalCoroutinesApi::class) class PinCreationViewModelTest { diff --git a/feature/registration/src/test/java/org/signal/registration/screens/pinentry/PinEntryForSvrRestoreViewModelTest.kt b/feature/registration/src/test/java/org/signal/registration/screens/pinentry/PinEntryForSvrRestoreViewModelTest.kt index 5547676554..de13176734 100644 --- a/feature/registration/src/test/java/org/signal/registration/screens/pinentry/PinEntryForSvrRestoreViewModelTest.kt +++ b/feature/registration/src/test/java/org/signal/registration/screens/pinentry/PinEntryForSvrRestoreViewModelTest.kt @@ -24,7 +24,7 @@ import org.signal.registration.RegistrationFlowEvent import org.signal.registration.RegistrationFlowState import org.signal.registration.RegistrationRepository import org.signal.registration.RegistrationRoute -import org.signal.registration.proto.RestoreDecision +import org.signal.registration.RestoreDecision class PinEntryForSvrRestoreViewModelTest { diff --git a/feature/registration/src/test/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreViewModelTest.kt b/feature/registration/src/test/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreViewModelTest.kt index ee9bec012a..eff88358fa 100644 --- a/feature/registration/src/test/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreViewModelTest.kt +++ b/feature/registration/src/test/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreViewModelTest.kt @@ -30,7 +30,7 @@ import org.signal.libsignal.net.RequestResult import org.signal.registration.NetworkController import org.signal.registration.RegistrationFlowEvent import org.signal.registration.RegistrationRepository -import org.signal.registration.proto.RestoreDecision +import org.signal.registration.RestoreDecision @OptIn(ExperimentalCoroutinesApi::class) class RemoteBackupRestoreViewModelTest { diff --git a/feature/registration/src/test/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionViewModelTest.kt b/feature/registration/src/test/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionViewModelTest.kt index b47b74b957..125c60ebb3 100644 --- a/feature/registration/src/test/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionViewModelTest.kt +++ b/feature/registration/src/test/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionViewModelTest.kt @@ -23,7 +23,7 @@ import org.signal.registration.RegistrationFlowEvent import org.signal.registration.RegistrationFlowState import org.signal.registration.RegistrationRepository import org.signal.registration.RegistrationRoute -import org.signal.registration.proto.RestoreDecision +import org.signal.registration.RestoreDecision class ArchiveRestoreSelectionViewModelTest {