From afbca463bdc928f48bcb2c5d66e9c37e26b6a516 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 11 Sep 2026 15:50:03 -0400 Subject: [PATCH] Ensure code entry actions are drained, even when not used. --- .../account/authenticator/TotpCodeEntryViewModel.kt | 12 ++++++++++++ .../appsettings/totpcodeentry/TotpCodeEntryEvent.kt | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/account/authenticator/TotpCodeEntryViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/account/authenticator/TotpCodeEntryViewModel.kt index 10738357e3..9bcab7a5d5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/account/authenticator/TotpCodeEntryViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/account/authenticator/TotpCodeEntryViewModel.kt @@ -21,6 +21,7 @@ import org.signal.appsettings.totpcodeentry.TotpCodeEntryState import org.signal.appsettings.totpcodeentry.TotpCodeEntryState.Error import org.signal.core.ui.compose.EventDrivenViewModel import org.signal.core.util.logging.Log +import org.signal.uicomponents.codeentryfield.CodeEntryFieldAction import org.signal.uicomponents.codeentryfield.CodeEntryFieldPresenter /** @@ -48,6 +49,11 @@ class TotpCodeEntryViewModel( .state .onEach { onEvent(TotpCodeEntryEvent.CodeEntryStateChanged(it)) } .launchIn(viewModelScope) + + codeEntryPresenter + .actions + .onEach { onEvent(TotpCodeEntryEvent.CodeEntryAction(it)) } + .launchIn(viewModelScope) } override suspend fun processEvent(event: TotpCodeEntryEvent) { @@ -62,6 +68,12 @@ class TotpCodeEntryViewModel( is TotpCodeEntryEvent.CodeEntryStateChanged -> { _state.update { it.copy(codeEntry = event.codeEntryState) } } + is TotpCodeEntryEvent.CodeEntryAction -> { + when (event.action) { + // The user submits with the Next button, so a finished code doesn't need anything done with it here. + is CodeEntryFieldAction.CodeEntered -> Unit + } + } TotpCodeEntryEvent.NextClicked -> { if (!_state.value.canSubmit) { return diff --git a/feature/app-settings/src/main/java/org/signal/appsettings/totpcodeentry/TotpCodeEntryEvent.kt b/feature/app-settings/src/main/java/org/signal/appsettings/totpcodeentry/TotpCodeEntryEvent.kt index 96c00c9dd7..c3260b1473 100644 --- a/feature/app-settings/src/main/java/org/signal/appsettings/totpcodeentry/TotpCodeEntryEvent.kt +++ b/feature/app-settings/src/main/java/org/signal/appsettings/totpcodeentry/TotpCodeEntryEvent.kt @@ -5,6 +5,7 @@ package org.signal.appsettings.totpcodeentry +import org.signal.uicomponents.codeentryfield.CodeEntryFieldAction import org.signal.uicomponents.codeentryfield.CodeEntryFieldEvents import org.signal.uicomponents.codeentryfield.CodeEntryFieldState @@ -22,6 +23,9 @@ sealed interface TotpCodeEntryEvent { /** The code field's presenter emitted new state for us to mirror. */ data class CodeEntryStateChanged(val codeEntryState: CodeEntryFieldState) : TotpCodeEntryEvent + /** The code field's presenter emitted an action for us to carry out. */ + data class CodeEntryAction(val action: CodeEntryFieldAction) : TotpCodeEntryEvent + /** The user submitted the code they entered. */ data object NextClicked : TotpCodeEntryEvent }