From 8eac4d3a5761688621dc347209e4a42fac954008 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 18 Jun 2026 12:43:29 -0400 Subject: [PATCH] Improve regV5 logging. --- .../securesms/pin/SvrRepository.kt | 2 +- .../registration/RegistrationFlowEvent.kt | 24 +++++++++++++------ .../registration/RegistrationFlowState.kt | 5 ++-- .../screens/EventDrivenViewModel.kt | 3 +-- .../AccountLockedScreenEvents.kt | 4 +--- .../accountlocked/AccountLockedState.kt | 4 +--- .../screens/aepentry/EnterAepEvents.kt | 8 ++++--- .../screens/aepentry/EnterAepState.kt | 6 +++-- .../screens/captcha/CaptchaScreenEvents.kt | 7 ++---- .../screens/captcha/CaptchaState.kt | 8 ++++--- .../CountryCodePickerScreenEvents.kt | 4 +--- .../screens/countrycode/CountryCodeState.kt | 4 +--- .../CreateProfileScreenEvents.kt | 14 ++++++----- .../createprofile/CreateProfileState.kt | 13 ++++------ .../DeviceTransferCompleteScreenEvents.kt | 4 +--- .../complete/DeviceTransferCompleteState.kt | 7 ++---- .../DeviceTransferInstructionsScreenEvents.kt | 4 +--- .../DeviceTransferInstructionsState.kt | 7 ++---- .../DeviceTransferProgressScreenEvents.kt | 4 +--- .../progress/DeviceTransferProgressState.kt | 7 ++---- .../setup/DeviceTransferSetupScreenEvents.kt | 4 +--- .../setup/DeviceTransferSetupState.kt | 9 ++++--- .../PhoneNumberDiscoverabilityScreenEvents.kt | 4 +--- .../PhoneNumberDiscoverabilityState.kt | 4 +--- .../linkaccount/LinkAccountScreenEvent.kt | 4 +--- .../linkaccount/LinkAccountScreenState.kt | 3 +-- .../LocalBackupRestoreEvents.kt | 8 ++++--- .../LocalBackupRestoreState.kt | 6 +++-- .../messagesync/MessageSyncScreenEvent.kt | 4 +--- .../messagesync/MessageSyncScreenState.kt | 3 +-- .../PhoneNumberEntryScreenEvents.kt | 12 +++++----- .../phonenumber/PhoneNumberEntryState.kt | 8 +++---- .../pincreation/PinCreationScreenEvents.kt | 8 +++---- .../screens/pincreation/PinCreationState.kt | 8 +++++-- .../screens/pinentry/PinEntryScreenEvents.kt | 8 +++---- .../screens/pinentry/PinEntryState.kt | 6 ++--- .../quickrestore/QuickRestoreQrEvents.kt | 4 +--- .../quickrestore/QuickRestoreQrState.kt | 9 +++---- .../RemoteBackupRestoreScreenEvents.kt | 7 +++--- .../RemoteBackupRestoreState.kt | 17 +++++++++---- .../ArchiveRestoreSelectionScreenEvents.kt | 7 +++--- .../ArchiveRestoreSelectionState.kt | 6 +++-- .../VerificationCodeScreenEvents.kt | 13 +++++++--- .../verificationcode/VerificationCodeState.kt | 16 +++++++++---- .../screens/welcome/WelcomeScreenEvents.kt | 8 ++++--- .../signal/registration/util/DebugLoggable.kt | 14 ----------- .../registration/util/DebugLoggableModel.kt | 18 -------------- 47 files changed, 162 insertions(+), 195 deletions(-) delete mode 100644 feature/registration/src/main/java/org/signal/registration/util/DebugLoggable.kt delete mode 100644 feature/registration/src/main/java/org/signal/registration/util/DebugLoggableModel.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/pin/SvrRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/pin/SvrRepository.kt index 7bb3ad30f7..29d414ba9d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/pin/SvrRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/pin/SvrRepository.kt @@ -313,7 +313,7 @@ object SvrRepository { Log.i(TAG, "[onRegistrationComplete] Starting", true) operationLock.withLock { if (masterKey == null && userPin != null) { - error("If masterKey is present, pin must also be present!") + error("If PIN is present, MasterKey must also be present!") } if (masterKey != null && userPin != null) { diff --git a/feature/registration/src/main/java/org/signal/registration/RegistrationFlowEvent.kt b/feature/registration/src/main/java/org/signal/registration/RegistrationFlowEvent.kt index 8ae94cd4a7..e99ebec16d 100644 --- a/feature/registration/src/main/java/org/signal/registration/RegistrationFlowEvent.kt +++ b/feature/registration/src/main/java/org/signal/registration/RegistrationFlowEvent.kt @@ -7,9 +7,9 @@ package org.signal.registration import org.signal.core.models.AccountEntropyPool import org.signal.core.models.MasterKey -import org.signal.registration.util.DebugLoggable +import org.signal.core.util.censor -sealed interface RegistrationFlowEvent : DebugLoggable { +sealed interface RegistrationFlowEvent { /** Navigate to a specific screen. */ data class NavigateToScreen(val route: RegistrationRoute) : RegistrationFlowEvent @@ -26,10 +26,14 @@ sealed interface RegistrationFlowEvent : DebugLoggable { data class E164Chosen(val e164: String) : RegistrationFlowEvent /** The user has successfully registered. */ - data class Registered(val accountEntropyPool: AccountEntropyPool) : RegistrationFlowEvent + data class Registered(val accountEntropyPool: AccountEntropyPool) : RegistrationFlowEvent { + override fun toString(): String = "Registered(accountEntropyPool=${accountEntropyPool.displayValue.censor()})" + } /** The master key has been restored from SVR. */ - data class MasterKeyRestoredFromSvr(val masterKey: MasterKey) : RegistrationFlowEvent + data class MasterKeyRestoredFromSvr(val masterKey: MasterKey) : RegistrationFlowEvent { + override fun toString(): String = "MasterKeyRestoredFromSvr(masterKey=${masterKey.toString().censor()})" + } /** We've discovered that RRP-based registration is not possible for this account. */ data object RecoveryPasswordInvalid : RegistrationFlowEvent @@ -38,13 +42,19 @@ sealed interface RegistrationFlowEvent : DebugLoggable { data class PendingRestoreOptionSelected(val option: PendingRestoreOption?) : RegistrationFlowEvent /** Provisioning data was received from the old device. Carries the token used to notify it of our restore-method choice. */ - data class RestoreMethodTokenReceived(val token: String) : RegistrationFlowEvent + data class RestoreMethodTokenReceived(val token: String) : RegistrationFlowEvent { + override fun toString(): String = "RestoreMethodTokenReceived(token=${token.censor()})" + } /** An AEP was manually input by the user. It has not yet been verified against the server. */ - data class UserSuppliedAepSubmitted(val aep: AccountEntropyPool) : RegistrationFlowEvent + data class UserSuppliedAepSubmitted(val aep: AccountEntropyPool) : RegistrationFlowEvent { + override fun toString(): String = "UserSuppliedAepSubmitted(aep=${aep.displayValue.censor()})" + } /** An AEP that was previously manually input by the user (see [UserSuppliedAepSubmitted]) has been validated. We should use it as the canonical AEP. */ - data class UserSuppliedAepVerified(val aep: AccountEntropyPool) : RegistrationFlowEvent + data class UserSuppliedAepVerified(val aep: AccountEntropyPool) : RegistrationFlowEvent { + override fun toString(): String = "UserSuppliedAepVerified(aep=${aep.displayValue.censor()})" + } /** Registration has been completed. Will finalize any pending state, then navigate to flow's conclusion. */ data object RegistrationComplete : RegistrationFlowEvent diff --git a/feature/registration/src/main/java/org/signal/registration/RegistrationFlowState.kt b/feature/registration/src/main/java/org/signal/registration/RegistrationFlowState.kt index eae3ed2d6b..6981a2a9d4 100644 --- a/feature/registration/src/main/java/org/signal/registration/RegistrationFlowState.kt +++ b/feature/registration/src/main/java/org/signal/registration/RegistrationFlowState.kt @@ -12,7 +12,6 @@ import org.signal.core.models.AccountEntropyPool import org.signal.core.models.MasterKey import org.signal.core.util.censor import org.signal.registration.util.AccountEntropyPoolParceler -import org.signal.registration.util.DebugLoggableModel import org.signal.registration.util.MasterKeyParceler @Parcelize @@ -54,8 +53,8 @@ data class RegistrationFlowState( /** If true, the ViewModel is still deciding whether to restore a previous flow or start fresh. */ val isRestoringNavigationState: Boolean = true -) : Parcelable, DebugLoggableModel() { - override fun toSafeString(): String { +) : Parcelable { + override fun toString(): String { return "RegistrationFlowState(backStack=${backStack.joinToString()}, sessionMetadata=${sessionMetadata.let { "present" }}, sessionE164=$sessionE164, accountEntropyPool=${accountEntropyPool?.displayValue?.censor()}, temporaryMasterKey=${temporaryMasterKey?.toString()?.censor()}, preExistingRegistrationData=${preExistingRegistrationData?.let { "present" }}, doNotAttemptRecoveryPassword=$doNotAttemptRecoveryPassword, pendingRestoreOption=$pendingRestoreOption, unverifiedRestoredAep=${unverifiedRestoredAep?.displayValue?.censor()}, restoreMethodToken=${restoreMethodToken?.censor()}, isRestoringNavigation=$isRestoringNavigationState)" } } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/EventDrivenViewModel.kt b/feature/registration/src/main/java/org/signal/registration/screens/EventDrivenViewModel.kt index 7dea861736..f02fa01f5e 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/EventDrivenViewModel.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/EventDrivenViewModel.kt @@ -10,14 +10,13 @@ import androidx.lifecycle.viewModelScope import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.launch import org.signal.core.util.logging.Log -import org.signal.registration.util.DebugLoggable /** * Base view model that helps one implement an Elm-like architecture, where events are processed and * new models are emitted. In particular, this base class exists to setup the core event channel * to avoid gotcha's around threading and race conditions. */ -abstract class EventDrivenViewModel( +abstract class EventDrivenViewModel( private val tag: String ) : ViewModel() { diff --git a/feature/registration/src/main/java/org/signal/registration/screens/accountlocked/AccountLockedScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/accountlocked/AccountLockedScreenEvents.kt index 7c19757dfd..3be0b6b690 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/accountlocked/AccountLockedScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/accountlocked/AccountLockedScreenEvents.kt @@ -5,9 +5,7 @@ package org.signal.registration.screens.accountlocked -import org.signal.registration.util.DebugLoggableModel - -sealed class AccountLockedScreenEvents : DebugLoggableModel() { +sealed class AccountLockedScreenEvents { data object Next : AccountLockedScreenEvents() data object LearnMore : AccountLockedScreenEvents() } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/accountlocked/AccountLockedState.kt b/feature/registration/src/main/java/org/signal/registration/screens/accountlocked/AccountLockedState.kt index 01492e73d1..adfcd66d7b 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/accountlocked/AccountLockedState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/accountlocked/AccountLockedState.kt @@ -5,8 +5,6 @@ package org.signal.registration.screens.accountlocked -import org.signal.registration.util.DebugLoggableModel - data class AccountLockedState( val daysRemaining: Int = 10 -) : DebugLoggableModel() +) diff --git a/feature/registration/src/main/java/org/signal/registration/screens/aepentry/EnterAepEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/aepentry/EnterAepEvents.kt index ca81987b5b..422c8206fb 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/aepentry/EnterAepEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/aepentry/EnterAepEvents.kt @@ -5,11 +5,13 @@ package org.signal.registration.screens.aepentry -import org.signal.registration.util.DebugLoggableModel +import org.signal.core.util.censor -sealed class EnterAepEvents : DebugLoggableModel() { +sealed class EnterAepEvents { /** User changed the backup key text. */ - data class BackupKeyChanged(val value: String) : EnterAepEvents() + data class BackupKeyChanged(val value: String) : EnterAepEvents() { + override fun toString(): String = "BackupKeyChanged(value=${value.censor()})" + } /** User submitted the backup key. */ data object Submit : EnterAepEvents() diff --git a/feature/registration/src/main/java/org/signal/registration/screens/aepentry/EnterAepState.kt b/feature/registration/src/main/java/org/signal/registration/screens/aepentry/EnterAepState.kt index f5912b64e7..d322090ce3 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/aepentry/EnterAepState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/aepentry/EnterAepState.kt @@ -5,7 +5,7 @@ package org.signal.registration.screens.aepentry -import org.signal.registration.util.DebugLoggableModel +import org.signal.core.util.censor data class EnterAepState( /** The user's typed text, preserved verbatim (illegal chars stripped). Bound to the TextField so #/= stay visible as the user types them. */ @@ -17,7 +17,9 @@ data class EnterAepState( val chunkLength: Int = 4, val isRegistering: Boolean = false, val registrationError: RegistrationError? = null -) : DebugLoggableModel() +) { + override fun toString(): String = "EnterAepState(enteredText=${enteredText.censor()}, backupKey=${backupKey.censor()}, isBackupKeyValid=$isBackupKeyValid, aepValidationError=$aepValidationError, chunkLength=$chunkLength, isRegistering=$isRegistering, registrationError=$registrationError)" +} sealed interface AepValidationError { data class TooLong(val count: Int, val max: Int) : AepValidationError diff --git a/feature/registration/src/main/java/org/signal/registration/screens/captcha/CaptchaScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/captcha/CaptchaScreenEvents.kt index 9c82f53d44..c366fa20ef 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/captcha/CaptchaScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/captcha/CaptchaScreenEvents.kt @@ -6,13 +6,10 @@ package org.signal.registration.screens.captcha import org.signal.core.util.censor -import org.signal.registration.util.DebugLoggableModel -sealed class CaptchaScreenEvents : DebugLoggableModel() { +sealed class CaptchaScreenEvents { data class CaptchaCompleted(val token: String) : CaptchaScreenEvents() { - override fun toSafeString(): String { - return "CaptchaCompleted(token=${token.censor()})" - } + override fun toString(): String = "CaptchaCompleted(token=${token.censor()})" } data object Cancel : CaptchaScreenEvents() } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/captcha/CaptchaState.kt b/feature/registration/src/main/java/org/signal/registration/screens/captcha/CaptchaState.kt index 6969a781c0..b7d05f0988 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/captcha/CaptchaState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/captcha/CaptchaState.kt @@ -5,9 +5,9 @@ package org.signal.registration.screens.captcha -import org.signal.registration.util.DebugLoggableModel +import org.signal.core.util.censor -sealed class CaptchaLoadState : DebugLoggableModel() { +sealed class CaptchaLoadState { data object Loading : CaptchaLoadState() data object Loaded : CaptchaLoadState() data object Error : CaptchaLoadState() @@ -17,4 +17,6 @@ data class CaptchaState( val captchaUrl: String, val captchaScheme: String = "signalcaptcha://", val loadState: CaptchaLoadState = CaptchaLoadState.Loading -) : DebugLoggableModel() +) { + override fun toString(): String = "CaptchaState(captchaUrl=${captchaUrl.censor()}, captchaScheme=$captchaScheme, loadState=$loadState)" +} diff --git a/feature/registration/src/main/java/org/signal/registration/screens/countrycode/CountryCodePickerScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/countrycode/CountryCodePickerScreenEvents.kt index 634572edb5..75f7dfa2ed 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/countrycode/CountryCodePickerScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/countrycode/CountryCodePickerScreenEvents.kt @@ -5,9 +5,7 @@ package org.signal.registration.screens.countrycode -import org.signal.registration.util.DebugLoggableModel - -sealed class CountryCodePickerScreenEvents : DebugLoggableModel() { +sealed class CountryCodePickerScreenEvents { data class Search(val query: String) : CountryCodePickerScreenEvents() data class CountrySelected(val country: Country) : CountryCodePickerScreenEvents() data object Dismissed : CountryCodePickerScreenEvents() diff --git a/feature/registration/src/main/java/org/signal/registration/screens/countrycode/CountryCodeState.kt b/feature/registration/src/main/java/org/signal/registration/screens/countrycode/CountryCodeState.kt index 033161daa1..8063dbb26f 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/countrycode/CountryCodeState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/countrycode/CountryCodeState.kt @@ -5,8 +5,6 @@ package org.signal.registration.screens.countrycode -import org.signal.registration.util.DebugLoggableModel - /** * State managed by [CountryCodePickerViewModel]. Includes country list and allows for searching */ @@ -16,4 +14,4 @@ data class CountryCodeState( val commonCountryList: List = emptyList(), val filteredList: List = emptyList(), val startingIndex: Int = 0 -) : DebugLoggableModel() +) diff --git a/feature/registration/src/main/java/org/signal/registration/screens/createprofile/CreateProfileScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/createprofile/CreateProfileScreenEvents.kt index 13bb7f5e44..121f3b6aeb 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/createprofile/CreateProfileScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/createprofile/CreateProfileScreenEvents.kt @@ -5,13 +5,15 @@ package org.signal.registration.screens.createprofile -import org.signal.registration.util.DebugLoggableModel - -sealed class CreateProfileScreenEvents : DebugLoggableModel() { - data class GivenNameChanged(val value: String) : CreateProfileScreenEvents() - data class FamilyNameChanged(val value: String) : CreateProfileScreenEvents() +sealed class CreateProfileScreenEvents { + data class GivenNameChanged(val value: String) : CreateProfileScreenEvents() { + override fun toString(): String = "GivenNameChanged(value=${value.length} chars)" + } + data class FamilyNameChanged(val value: String) : CreateProfileScreenEvents() { + override fun toString(): String = "FamilyNameChanged(value=${value.length} chars)" + } data class AvatarSelected(val bytes: ByteArray) : CreateProfileScreenEvents() { - override fun toSafeString(): String = "AvatarSelected(${bytes.size} bytes)" + override fun toString(): String = "AvatarSelected(${bytes.size} bytes)" override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is AvatarSelected) return false diff --git a/feature/registration/src/main/java/org/signal/registration/screens/createprofile/CreateProfileState.kt b/feature/registration/src/main/java/org/signal/registration/screens/createprofile/CreateProfileState.kt index 2f0157755c..1fd249f979 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/createprofile/CreateProfileState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/createprofile/CreateProfileState.kt @@ -5,9 +5,6 @@ package org.signal.registration.screens.createprofile -import org.signal.registration.util.DebugLoggable -import org.signal.registration.util.DebugLoggableModel - data class CreateProfileState( val givenName: String = "", val familyName: String = "", @@ -16,12 +13,12 @@ data class CreateProfileState( val isLoading: Boolean = true, val isSubmitting: Boolean = false, val oneTimeEvent: OneTimeEvent? = null -) : DebugLoggableModel() { +) { val isFormValid: Boolean get() = givenName.trim().isNotEmpty() - override fun toSafeString(): String { + override fun toString(): String { return "CreateProfileState(givenName=${givenName.length} chars, familyName=${familyName.length} chars, avatar=${avatar?.size ?: 0} bytes, discoverableByPhoneNumber=$discoverableByPhoneNumber, isLoading=$isLoading, isSubmitting=$isSubmitting, oneTimeEvent=$oneTimeEvent)" } @@ -54,9 +51,7 @@ data class CreateProfileState( return result } - sealed interface OneTimeEvent : DebugLoggable { - data object UploadFailed : OneTimeEvent { - override fun toString(): String = "UploadFailed" - } + sealed interface OneTimeEvent { + data object UploadFailed : OneTimeEvent } } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/complete/DeviceTransferCompleteScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/complete/DeviceTransferCompleteScreenEvents.kt index 7b42e385c8..9725236173 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/complete/DeviceTransferCompleteScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/complete/DeviceTransferCompleteScreenEvents.kt @@ -5,9 +5,7 @@ package org.signal.registration.screens.devicetransfer.complete -import org.signal.registration.util.DebugLoggableModel - -sealed class DeviceTransferCompleteScreenEvents : DebugLoggableModel() { +sealed class DeviceTransferCompleteScreenEvents { data object ContinueClicked : DeviceTransferCompleteScreenEvents() data object ConsumeOneTimeEvent : DeviceTransferCompleteScreenEvents() } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/complete/DeviceTransferCompleteState.kt b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/complete/DeviceTransferCompleteState.kt index facb46ca1e..fb4cb46d59 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/complete/DeviceTransferCompleteState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/complete/DeviceTransferCompleteState.kt @@ -5,11 +5,8 @@ package org.signal.registration.screens.devicetransfer.complete -import org.signal.registration.util.DebugLoggable -import org.signal.registration.util.DebugLoggableModel - data class DeviceTransferCompleteState( val oneTimeEvent: OneTimeEvent? = null -) : DebugLoggableModel() { - sealed interface OneTimeEvent : DebugLoggable +) { + sealed interface OneTimeEvent } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/instructions/DeviceTransferInstructionsScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/instructions/DeviceTransferInstructionsScreenEvents.kt index cc68d509fc..234eb66473 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/instructions/DeviceTransferInstructionsScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/instructions/DeviceTransferInstructionsScreenEvents.kt @@ -5,9 +5,7 @@ package org.signal.registration.screens.devicetransfer.instructions -import org.signal.registration.util.DebugLoggableModel - -sealed class DeviceTransferInstructionsScreenEvents : DebugLoggableModel() { +sealed class DeviceTransferInstructionsScreenEvents { data object ContinueClicked : DeviceTransferInstructionsScreenEvents() data object BackClicked : DeviceTransferInstructionsScreenEvents() data object ConsumeOneTimeEvent : DeviceTransferInstructionsScreenEvents() diff --git a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/instructions/DeviceTransferInstructionsState.kt b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/instructions/DeviceTransferInstructionsState.kt index 52b5a81aad..302bc87404 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/instructions/DeviceTransferInstructionsState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/instructions/DeviceTransferInstructionsState.kt @@ -5,11 +5,8 @@ package org.signal.registration.screens.devicetransfer.instructions -import org.signal.registration.util.DebugLoggable -import org.signal.registration.util.DebugLoggableModel - data class DeviceTransferInstructionsState( val oneTimeEvent: OneTimeEvent? = null -) : DebugLoggableModel() { - sealed interface OneTimeEvent : DebugLoggable +) { + sealed interface OneTimeEvent } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/progress/DeviceTransferProgressScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/progress/DeviceTransferProgressScreenEvents.kt index 0e0e87e7b3..da1cae4fb7 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/progress/DeviceTransferProgressScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/progress/DeviceTransferProgressScreenEvents.kt @@ -5,9 +5,7 @@ package org.signal.registration.screens.devicetransfer.progress -import org.signal.registration.util.DebugLoggableModel - -sealed class DeviceTransferProgressScreenEvents : DebugLoggableModel() { +sealed class DeviceTransferProgressScreenEvents { data object CancelClicked : DeviceTransferProgressScreenEvents() data object CancelConfirmed : DeviceTransferProgressScreenEvents() data object CancelDismissed : DeviceTransferProgressScreenEvents() diff --git a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/progress/DeviceTransferProgressState.kt b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/progress/DeviceTransferProgressState.kt index 1941209e77..ebc825119a 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/progress/DeviceTransferProgressState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/progress/DeviceTransferProgressState.kt @@ -5,15 +5,12 @@ package org.signal.registration.screens.devicetransfer.progress -import org.signal.registration.util.DebugLoggable -import org.signal.registration.util.DebugLoggableModel - data class DeviceTransferProgressState( val messageCount: Long = 0, val status: Status = Status.RECEIVING, val errorReason: ErrorReason? = null, val oneTimeEvent: OneTimeEvent? = null -) : DebugLoggableModel() { +) { enum class Status { RECEIVING, @@ -28,7 +25,7 @@ data class DeviceTransferProgressState( UNKNOWN } - sealed interface OneTimeEvent : DebugLoggable { + sealed interface OneTimeEvent { data object TransferCanceled : OneTimeEvent } } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/setup/DeviceTransferSetupScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/setup/DeviceTransferSetupScreenEvents.kt index 5eeb47a251..41e4a49e38 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/setup/DeviceTransferSetupScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/setup/DeviceTransferSetupScreenEvents.kt @@ -5,9 +5,7 @@ package org.signal.registration.screens.devicetransfer.setup -import org.signal.registration.util.DebugLoggableModel - -sealed class DeviceTransferSetupScreenEvents : DebugLoggableModel() { +sealed class DeviceTransferSetupScreenEvents { /** Kick off the full check-and-start sequence. Emitted once on initial composition and on retries. */ data object CheckPermissions : DeviceTransferSetupScreenEvents() diff --git a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/setup/DeviceTransferSetupState.kt b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/setup/DeviceTransferSetupState.kt index 68a0f4d418..426dc4a344 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/setup/DeviceTransferSetupState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/devicetransfer/setup/DeviceTransferSetupState.kt @@ -5,9 +5,6 @@ package org.signal.registration.screens.devicetransfer.setup -import org.signal.registration.util.DebugLoggable -import org.signal.registration.util.DebugLoggableModel - data class DeviceTransferSetupState( val step: SetupStep = SetupStep.INITIAL, val authenticationCode: Int? = null, @@ -15,9 +12,11 @@ data class DeviceTransferSetupState( val showVerifyRejectDialog: Boolean = false, val showErrorDialog: Boolean = false, val oneTimeEvent: OneTimeEvent? = null -) : DebugLoggableModel() { +) { - sealed interface OneTimeEvent : DebugLoggable { + override fun toString(): String = "DeviceTransferSetupState(step=$step, authenticationCode=${authenticationCode?.let { "present" }}, takingTooLong=$takingTooLong, showVerifyRejectDialog=$showVerifyRejectDialog, showErrorDialog=$showErrorDialog, oneTimeEvent=$oneTimeEvent)" + + sealed interface OneTimeEvent { /** The screen should launch a runtime permission request. */ data object RequestLocationPermission : OneTimeEvent diff --git a/feature/registration/src/main/java/org/signal/registration/screens/discoverability/PhoneNumberDiscoverabilityScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/discoverability/PhoneNumberDiscoverabilityScreenEvents.kt index 3bcdad87b4..fc951c7cc7 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/discoverability/PhoneNumberDiscoverabilityScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/discoverability/PhoneNumberDiscoverabilityScreenEvents.kt @@ -5,9 +5,7 @@ package org.signal.registration.screens.discoverability -import org.signal.registration.util.DebugLoggableModel - -sealed class PhoneNumberDiscoverabilityScreenEvents : DebugLoggableModel() { +sealed class PhoneNumberDiscoverabilityScreenEvents { data object EveryoneSelected : PhoneNumberDiscoverabilityScreenEvents() data object NobodySelected : PhoneNumberDiscoverabilityScreenEvents() data object NobodyConfirmed : PhoneNumberDiscoverabilityScreenEvents() diff --git a/feature/registration/src/main/java/org/signal/registration/screens/discoverability/PhoneNumberDiscoverabilityState.kt b/feature/registration/src/main/java/org/signal/registration/screens/discoverability/PhoneNumberDiscoverabilityState.kt index 88496b4526..5da2333c1a 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/discoverability/PhoneNumberDiscoverabilityState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/discoverability/PhoneNumberDiscoverabilityState.kt @@ -5,9 +5,7 @@ package org.signal.registration.screens.discoverability -import org.signal.registration.util.DebugLoggableModel - data class PhoneNumberDiscoverabilityState( val discoverable: Boolean = true, val showNobodyConfirmation: Boolean = false -) : DebugLoggableModel() +) diff --git a/feature/registration/src/main/java/org/signal/registration/screens/linkaccount/LinkAccountScreenEvent.kt b/feature/registration/src/main/java/org/signal/registration/screens/linkaccount/LinkAccountScreenEvent.kt index 450d7aff23..3a050d9cfb 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/linkaccount/LinkAccountScreenEvent.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/linkaccount/LinkAccountScreenEvent.kt @@ -5,9 +5,7 @@ package org.signal.registration.screens.linkaccount -import org.signal.registration.util.DebugLoggableModel - -sealed class LinkAccountScreenEvent : DebugLoggableModel() { +sealed class LinkAccountScreenEvent { data object GetHelpClick : LinkAccountScreenEvent() data object CreateAccountClick : LinkAccountScreenEvent() data object DisplayOverlayClick : LinkAccountScreenEvent() diff --git a/feature/registration/src/main/java/org/signal/registration/screens/linkaccount/LinkAccountScreenState.kt b/feature/registration/src/main/java/org/signal/registration/screens/linkaccount/LinkAccountScreenState.kt index 8c3e10877e..b5928b1e5e 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/linkaccount/LinkAccountScreenState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/linkaccount/LinkAccountScreenState.kt @@ -6,9 +6,8 @@ package org.signal.registration.screens.linkaccount import org.signal.registration.screens.quickrestore.QrState -import org.signal.registration.util.DebugLoggableModel data class LinkAccountScreenState( val qrCodeState: QrState = QrState.Loading, val displayQrOverlay: Boolean = false -) : DebugLoggableModel() +) diff --git a/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreEvents.kt index 6453b2a792..0839ace1e2 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreEvents.kt @@ -6,9 +6,9 @@ package org.signal.registration.screens.localbackuprestore import android.net.Uri -import org.signal.registration.util.DebugLoggableModel +import org.signal.core.util.censor -sealed class LocalBackupRestoreEvents : DebugLoggableModel() { +sealed class LocalBackupRestoreEvents { /** User tapped the button to pick a backup folder. */ data object PickBackupFolder : LocalBackupRestoreEvents() @@ -25,7 +25,9 @@ sealed class LocalBackupRestoreEvents : DebugLoggableModel() { data class BackupSelected(val backup: LocalBackupInfo) : LocalBackupRestoreEvents() /** A credential (passphrase or AEP) was received from the credential entry screen. */ - data class PassphraseSubmitted(val credential: String) : LocalBackupRestoreEvents() + data class PassphraseSubmitted(val credential: String) : LocalBackupRestoreEvents() { + override fun toString(): String = "PassphraseSubmitted(credential=${credential.censor()})" + } /** The folder picker was dismissed without selecting a folder. */ data object FolderPickerDismissed : LocalBackupRestoreEvents() diff --git a/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreState.kt b/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreState.kt index 33f01b5b41..c7126b97ee 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/localbackuprestore/LocalBackupRestoreState.kt @@ -7,7 +7,7 @@ package org.signal.registration.screens.localbackuprestore import android.net.Uri import org.signal.core.models.AccountEntropyPool -import org.signal.registration.util.DebugLoggableModel +import org.signal.core.util.censor data class LocalBackupRestoreState( val restorePhase: RestorePhase = RestorePhase.SelectFolder, @@ -19,7 +19,9 @@ data class LocalBackupRestoreState( val launchFolderPicker: Boolean = false, val aep: AccountEntropyPool? = null, val v1Passphrase: String? = null -) : DebugLoggableModel() { +) { + + override fun toString(): String = "LocalBackupRestoreState(restorePhase=$restorePhase, backupInfo=$backupInfo, allBackups=$allBackups, selectedFolderUri=$selectedFolderUri, progressFraction=$progressFraction, errorMessage=$errorMessage, launchFolderPicker=$launchFolderPicker, aep=${aep?.displayValue?.censor()}, v1Passphrase=${v1Passphrase?.censor()})" enum class RestorePhase { /** Waiting for user to select a backup folder. */ diff --git a/feature/registration/src/main/java/org/signal/registration/screens/messagesync/MessageSyncScreenEvent.kt b/feature/registration/src/main/java/org/signal/registration/screens/messagesync/MessageSyncScreenEvent.kt index 16726a13ce..4d660ddf08 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/messagesync/MessageSyncScreenEvent.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/messagesync/MessageSyncScreenEvent.kt @@ -5,9 +5,7 @@ package org.signal.registration.screens.messagesync -import org.signal.registration.util.DebugLoggableModel - -sealed class MessageSyncScreenEvent : DebugLoggableModel() { +sealed class MessageSyncScreenEvent { data object LearnMoreClick : MessageSyncScreenEvent() data object CancelClick : MessageSyncScreenEvent() } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/messagesync/MessageSyncScreenState.kt b/feature/registration/src/main/java/org/signal/registration/screens/messagesync/MessageSyncScreenState.kt index 2edb160c69..58877271a2 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/messagesync/MessageSyncScreenState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/messagesync/MessageSyncScreenState.kt @@ -7,9 +7,8 @@ package org.signal.registration.screens.messagesync import org.signal.core.util.ByteSize import org.signal.core.util.bytes -import org.signal.registration.util.DebugLoggableModel data class MessageSyncScreenState( val downloadedBytes: ByteSize = 0.bytes, val totalBytes: ByteSize = 0.bytes -) : DebugLoggableModel() +) diff --git a/feature/registration/src/main/java/org/signal/registration/screens/phonenumber/PhoneNumberEntryScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/phonenumber/PhoneNumberEntryScreenEvents.kt index 66a063ad5f..9f828db911 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/phonenumber/PhoneNumberEntryScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/phonenumber/PhoneNumberEntryScreenEvents.kt @@ -5,10 +5,10 @@ package org.signal.registration.screens.phonenumber +import org.signal.core.util.censor import org.signal.registration.screens.localbackuprestore.LocalBackupRestoreResult -import org.signal.registration.util.DebugLoggableModel -sealed class PhoneNumberEntryScreenEvents : DebugLoggableModel() { +sealed class PhoneNumberEntryScreenEvents { data class CountryCodeChanged(val value: String) : PhoneNumberEntryScreenEvents() data class PhoneNumberChanged(val value: String) : PhoneNumberEntryScreenEvents() data class CountrySelected(val countryCode: Int, val regionCode: String, val countryName: String, val countryEmoji: String) : PhoneNumberEntryScreenEvents() @@ -17,12 +17,12 @@ sealed class PhoneNumberEntryScreenEvents : DebugLoggableModel() { data object PhoneNumberSubmitted : PhoneNumberEntryScreenEvents() data object CountryPicker : PhoneNumberEntryScreenEvents() data class CaptchaCompleted(val token: String) : PhoneNumberEntryScreenEvents() { - override fun toSafeString(): String { - return "CaptchaCompleted(token=***)" - } + override fun toString(): String = "CaptchaCompleted(token=${token.censor()})" } /** The pre-registration local backup restore flow returned a result. */ - data class LocalBackupRestoreCompleted(val result: LocalBackupRestoreResult) : PhoneNumberEntryScreenEvents() + data class LocalBackupRestoreCompleted(val result: LocalBackupRestoreResult) : PhoneNumberEntryScreenEvents() { + override fun toString(): String = "LocalBackupRestoreCompleted(result=***)" + } data object ConsumeOneTimeEvent : PhoneNumberEntryScreenEvents() } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/phonenumber/PhoneNumberEntryState.kt b/feature/registration/src/main/java/org/signal/registration/screens/phonenumber/PhoneNumberEntryState.kt index 3b339c6a4d..7bbfc5c9ac 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/phonenumber/PhoneNumberEntryState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/phonenumber/PhoneNumberEntryState.kt @@ -11,8 +11,6 @@ import org.signal.registration.NetworkController import org.signal.registration.NetworkController.SessionMetadata import org.signal.registration.PendingRestoreOption import org.signal.registration.PreExistingRegistrationData -import org.signal.registration.util.DebugLoggable -import org.signal.registration.util.DebugLoggableModel import kotlin.time.Duration data class PhoneNumberEntryState( @@ -30,8 +28,10 @@ data class PhoneNumberEntryState( val preExistingRegistrationData: PreExistingRegistrationData? = null, val restoredSvrCredentials: List = emptyList(), val pendingRestoreOption: PendingRestoreOption? = null -) : DebugLoggableModel() { - sealed interface OneTimeEvent : DebugLoggable { +) { + override fun toString(): String = "PhoneNumberEntryState(regionCode=$regionCode, countryCode=$countryCode, countryName=$countryName, countryEmoji=$countryEmoji, nationalNumber=$nationalNumber, formattedNumber=$formattedNumber, sessionE164=$sessionE164, sessionMetadata=${sessionMetadata?.let { "present" }}, showSpinner=$showSpinner, showDialog=$showDialog, oneTimeEvent=$oneTimeEvent, preExistingRegistrationData=${preExistingRegistrationData?.let { "present" }}, restoredSvrCredentials=${restoredSvrCredentials.size} items, pendingRestoreOption=$pendingRestoreOption)" + + sealed interface OneTimeEvent { data object NetworkError : OneTimeEvent data object UnknownError : OneTimeEvent data class RateLimited(val retryAfter: Duration) : OneTimeEvent diff --git a/feature/registration/src/main/java/org/signal/registration/screens/pincreation/PinCreationScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/pincreation/PinCreationScreenEvents.kt index c8667e40e8..ae42f12daf 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/pincreation/PinCreationScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/pincreation/PinCreationScreenEvents.kt @@ -5,10 +5,10 @@ package org.signal.registration.screens.pincreation -import org.signal.registration.util.DebugLoggableModel - -sealed class PinCreationScreenEvents : DebugLoggableModel() { - data class PinSubmitted(val pin: String) : PinCreationScreenEvents() +sealed class PinCreationScreenEvents { + data class PinSubmitted(val pin: String) : PinCreationScreenEvents() { + override fun toString(): String = "PinSubmitted(pin=${pin.length} chars)" + } data object ToggleKeyboard : PinCreationScreenEvents() data object LearnMore : PinCreationScreenEvents() data object OptOut : PinCreationScreenEvents() diff --git a/feature/registration/src/main/java/org/signal/registration/screens/pincreation/PinCreationState.kt b/feature/registration/src/main/java/org/signal/registration/screens/pincreation/PinCreationState.kt index 1e866bcfbe..899bb84848 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/pincreation/PinCreationState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/pincreation/PinCreationState.kt @@ -6,10 +6,14 @@ package org.signal.registration.screens.pincreation import org.signal.core.models.AccountEntropyPool -import org.signal.registration.util.DebugLoggableModel +import org.signal.core.util.censor data class PinCreationState( val isAlphanumericKeyboard: Boolean = false, val isConfirmEnabled: Boolean = false, val accountEntropyPool: AccountEntropyPool? = null -) : DebugLoggableModel() +) { + override fun toString(): String { + return "PinCreationState(isAlphanumericKeyboard=$isAlphanumericKeyboard, isConfirmEnabled=$isConfirmEnabled, accountEntropyPool=${accountEntropyPool?.displayValue?.censor()})" + } +} diff --git a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreenEvents.kt index b2ef3a3fb6..ffa42f11a2 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryScreenEvents.kt @@ -5,10 +5,10 @@ package org.signal.registration.screens.pinentry -import org.signal.registration.util.DebugLoggableModel - -sealed class PinEntryScreenEvents : DebugLoggableModel() { - data class PinEntered(val pin: String) : PinEntryScreenEvents() +sealed class PinEntryScreenEvents { + data class PinEntered(val pin: String) : PinEntryScreenEvents() { + override fun toString(): String = "PinEntered(pin=${pin.length} chars)" + } data object ToggleKeyboard : PinEntryScreenEvents() data object NeedHelp : PinEntryScreenEvents() data object Skip : PinEntryScreenEvents() diff --git a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryState.kt b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryState.kt index da00cf3528..5a7d9ab027 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/pinentry/PinEntryState.kt @@ -5,8 +5,6 @@ package org.signal.registration.screens.pinentry -import org.signal.registration.util.DebugLoggable -import org.signal.registration.util.DebugLoggableModel import kotlin.time.Duration data class PinEntryState( @@ -17,14 +15,14 @@ data class PinEntryState( val mode: Mode = Mode.SvrRestore, val oneTimeEvent: OneTimeEvent? = null, val e164: String? = null -) : DebugLoggableModel() { +) { enum class Mode { RegistrationLock, SmsBypass, SvrRestore } - sealed interface OneTimeEvent : DebugLoggable { + sealed interface OneTimeEvent { data object NetworkError : OneTimeEvent data class RateLimited(val retryAfter: Duration) : OneTimeEvent data object SvrDataMissing : OneTimeEvent diff --git a/feature/registration/src/main/java/org/signal/registration/screens/quickrestore/QuickRestoreQrEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/quickrestore/QuickRestoreQrEvents.kt index 5cd90b39c6..4054607879 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/quickrestore/QuickRestoreQrEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/quickrestore/QuickRestoreQrEvents.kt @@ -5,9 +5,7 @@ package org.signal.registration.screens.quickrestore -import org.signal.registration.util.DebugLoggableModel - -sealed class QuickRestoreQrEvents : DebugLoggableModel() { +sealed class QuickRestoreQrEvents { data object RetryQrCode : QuickRestoreQrEvents() data object Cancel : QuickRestoreQrEvents() data object UseProxy : QuickRestoreQrEvents() diff --git a/feature/registration/src/main/java/org/signal/registration/screens/quickrestore/QuickRestoreQrState.kt b/feature/registration/src/main/java/org/signal/registration/screens/quickrestore/QuickRestoreQrState.kt index 486cf7f8ba..c7de9fe9d3 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/quickrestore/QuickRestoreQrState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/quickrestore/QuickRestoreQrState.kt @@ -6,21 +6,18 @@ package org.signal.registration.screens.quickrestore import org.signal.core.ui.compose.QrCodeData -import org.signal.registration.util.DebugLoggableModel data class QuickRestoreQrState( val qrState: QrState = QrState.Loading, val isRegistering: Boolean = false, val showRegistrationError: Boolean = false, val errorMessage: String? = null -) : DebugLoggableModel() +) -sealed class QrState : DebugLoggableModel() { +sealed class QrState { data object Loading : QrState() data class Loaded(val qrCodeData: QrCodeData) : QrState() { - override fun toSafeString(): String { - return "Loaded(qrCodeData=***)" - } + override fun toString(): String = "Loaded(qrCodeData=***)" } data object Scanned : QrState() data object Failed : QrState() diff --git a/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreScreenEvents.kt index 50a18a8b92..ea762522ed 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreScreenEvents.kt @@ -5,11 +5,12 @@ package org.signal.registration.screens.remotebackuprestore -import org.signal.registration.util.DebugLoggableModel - -sealed class RemoteBackupRestoreScreenEvents : DebugLoggableModel() { +sealed class RemoteBackupRestoreScreenEvents { data object BackupRestoreBackup : RemoteBackupRestoreScreenEvents() + data object Retry : RemoteBackupRestoreScreenEvents() + data object Cancel : RemoteBackupRestoreScreenEvents() + data object DismissError : RemoteBackupRestoreScreenEvents() } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreState.kt b/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreState.kt index b3830bd469..26fdf33ccb 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/remotebackuprestore/RemoteBackupRestoreState.kt @@ -6,8 +6,7 @@ package org.signal.registration.screens.remotebackuprestore import org.signal.core.models.AccountEntropyPool -import org.signal.registration.util.DebugLoggable -import org.signal.registration.util.DebugLoggableModel +import org.signal.core.util.censor data class RemoteBackupRestoreState( val aep: AccountEntropyPool, @@ -17,7 +16,9 @@ data class RemoteBackupRestoreState( val restoreState: RestoreState = RestoreState.None, val restoreProgress: RestoreProgress? = null, val loadAttempts: Int = 0 -) : DebugLoggableModel() { +) { + + override fun toString(): String = "RemoteBackupRestoreState(aep=${aep.displayValue.censor()}, loadState=$loadState, backupTime=$backupTime, backupSize=$backupSize, restoreState=$restoreState, restoreProgress=$restoreProgress, loadAttempts=$loadAttempts)" enum class LoadState { Loading, @@ -26,13 +27,19 @@ data class RemoteBackupRestoreState( Failure } - sealed interface RestoreState : DebugLoggable { + sealed interface RestoreState { data object None : RestoreState + data object InProgress : RestoreState + data object Restored : RestoreState + data object NetworkFailure : RestoreState + data object InvalidBackupVersion : RestoreState + data object PermanentSvrBFailure : RestoreState + data object Failed : RestoreState } @@ -40,7 +47,7 @@ data class RemoteBackupRestoreState( val phase: Phase, val bytesCompleted: Long, val totalBytes: Long - ) : DebugLoggableModel() { + ) { val progress: Float get() = if (totalBytes > 0) bytesCompleted.toFloat() / totalBytes.toFloat() else 0f diff --git a/feature/registration/src/main/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionScreenEvents.kt index cf120ebb08..49069f523b 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionScreenEvents.kt @@ -5,11 +5,12 @@ package org.signal.registration.screens.restoreselection -import org.signal.registration.util.DebugLoggableModel - -sealed class ArchiveRestoreSelectionScreenEvents : DebugLoggableModel() { +sealed class ArchiveRestoreSelectionScreenEvents { data class RestoreOptionSelected(val option: ArchiveRestoreOption) : ArchiveRestoreSelectionScreenEvents() + data object Skip : ArchiveRestoreSelectionScreenEvents() + data object ConfirmSkip : ArchiveRestoreSelectionScreenEvents() + data object DismissSkipWarning : ArchiveRestoreSelectionScreenEvents() } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionState.kt b/feature/registration/src/main/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionState.kt index aaa9abbd38..d1d15b26e5 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/restoreselection/ArchiveRestoreSelectionState.kt @@ -5,13 +5,15 @@ package org.signal.registration.screens.restoreselection -import org.signal.registration.util.DebugLoggableModel +import org.signal.core.util.censor data class ArchiveRestoreSelectionState( val restoreOptions: List = emptyList(), val showSkipWarningDialog: Boolean = false, /** Token that, if present, indicates that the user did a quick restore, and we should hit a network endpoint to indicate our restore selection. */ val restoreMethodToken: String? = null -) : DebugLoggableModel() { +) { + override fun toString(): String = "ArchiveRestoreSelectionState(restoreOptions=$restoreOptions, showSkipWarningDialog=$showSkipWarningDialog, restoreMethodToken=${restoreMethodToken?.censor()})" + val showSkipButton: Boolean get() = ArchiveRestoreOption.None !in restoreOptions } diff --git a/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeScreenEvents.kt index 7449596ebc..864b96673f 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeScreenEvents.kt @@ -5,14 +5,21 @@ package org.signal.registration.screens.verificationcode -import org.signal.registration.util.DebugLoggableModel +import org.signal.core.util.censor + +sealed class VerificationCodeScreenEvents { + data class CodeEntered(val code: String) : VerificationCodeScreenEvents() { + override fun toString(): String = "CodeEntered(code=${code.censor()})" + } -sealed class VerificationCodeScreenEvents : DebugLoggableModel() { - data class CodeEntered(val code: String) : VerificationCodeScreenEvents() data object WrongNumber : VerificationCodeScreenEvents() + data object ResendSms : VerificationCodeScreenEvents() + data object CallMe : VerificationCodeScreenEvents() + data object HavingTrouble : VerificationCodeScreenEvents() + data object ConsumeInnerOneTimeEvent : VerificationCodeScreenEvents() /** diff --git a/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeState.kt b/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeState.kt index 933526485c..9a3e7fb342 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeState.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/verificationcode/VerificationCodeState.kt @@ -6,8 +6,6 @@ package org.signal.registration.screens.verificationcode import org.signal.registration.NetworkController.SessionMetadata -import org.signal.registration.util.DebugLoggable -import org.signal.registration.util.DebugLoggableModel import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds @@ -18,14 +16,22 @@ data class VerificationCodeState( val rateLimits: SmsAndCallRateLimits = SmsAndCallRateLimits(), val incorrectCodeAttempts: Int = 0, val oneTimeEvent: OneTimeEvent? = null -) : DebugLoggableModel() { - sealed interface OneTimeEvent : DebugLoggable { +) { + override fun toString(): String = "VerificationCodeState(sessionMetadata=${sessionMetadata?.let { "present" }}, e164=$e164, isSubmittingCode=$isSubmittingCode, rateLimits=$rateLimits, incorrectCodeAttempts=$incorrectCodeAttempts, oneTimeEvent=$oneTimeEvent)" + + sealed interface OneTimeEvent { data object NetworkError : OneTimeEvent + data object UnknownError : OneTimeEvent + data class RateLimited(val retryAfter: Duration) : OneTimeEvent + data object UnableToSendSms : OneTimeEvent + data object CouldNotRequestCodeWithSelectedTransport : OneTimeEvent + data object IncorrectVerificationCode : OneTimeEvent + data object RegistrationError : OneTimeEvent } @@ -52,4 +58,4 @@ data class VerificationCodeState( data class SmsAndCallRateLimits( val smsResendTimeRemaining: Duration = 0.seconds, val callRequestTimeRemaining: Duration = 0.seconds -) : DebugLoggableModel() +) diff --git a/feature/registration/src/main/java/org/signal/registration/screens/welcome/WelcomeScreenEvents.kt b/feature/registration/src/main/java/org/signal/registration/screens/welcome/WelcomeScreenEvents.kt index 6f8108b18d..ffa963151c 100644 --- a/feature/registration/src/main/java/org/signal/registration/screens/welcome/WelcomeScreenEvents.kt +++ b/feature/registration/src/main/java/org/signal/registration/screens/welcome/WelcomeScreenEvents.kt @@ -5,12 +5,14 @@ package org.signal.registration.screens.welcome -import org.signal.registration.util.DebugLoggableModel - -sealed class WelcomeScreenEvents : DebugLoggableModel() { +sealed class WelcomeScreenEvents { data object Continue : WelcomeScreenEvents() + data object LinkDevice : WelcomeScreenEvents() + data object HasOldPhone : WelcomeScreenEvents() + data object DoesNotHaveOldPhone : WelcomeScreenEvents() + data object ViewTermsAndPrivacy : WelcomeScreenEvents() } diff --git a/feature/registration/src/main/java/org/signal/registration/util/DebugLoggable.kt b/feature/registration/src/main/java/org/signal/registration/util/DebugLoggable.kt deleted file mode 100644 index f07f0a9cbd..0000000000 --- a/feature/registration/src/main/java/org/signal/registration/util/DebugLoggable.kt +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright 2025 Signal Messenger, LLC - * SPDX-License-Identifier: AGPL-3.0-only - */ - -package org.signal.registration.util - -/** - * Interface for objects that can provide a debug-friendly string representation. - */ -interface DebugLoggable { - fun toDebugString(): String = toString() - fun toSafeString(): String = toString() -} diff --git a/feature/registration/src/main/java/org/signal/registration/util/DebugLoggableModel.kt b/feature/registration/src/main/java/org/signal/registration/util/DebugLoggableModel.kt deleted file mode 100644 index 6c94ee2e39..0000000000 --- a/feature/registration/src/main/java/org/signal/registration/util/DebugLoggableModel.kt +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2026 Signal Messenger, LLC - * SPDX-License-Identifier: AGPL-3.0-only - */ - -package org.signal.registration.util - -import org.signal.registration.BuildConfig - -open class DebugLoggableModel : DebugLoggable { - override fun toString(): String { - return if (BuildConfig.DEBUG) { - toDebugString() - } else { - toSafeString() - } - } -}