PM-24690: Use ToastManager in MainViewModel (#5685)

This commit is contained in:
David Perez 2025-08-13 10:04:02 -05:00 committed by GitHub
parent 694865c213
commit 1e2bc4aa70
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 24 additions and 45 deletions

View File

@ -7,7 +7,6 @@ import android.os.Bundle
import android.view.KeyEvent import android.view.KeyEvent
import android.view.MotionEvent import android.view.MotionEvent
import android.view.WindowManager import android.view.WindowManager
import android.widget.Toast
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
@ -186,12 +185,6 @@ class MainActivity : AppCompatActivity() {
is MainEvent.CompleteAutofill -> handleCompleteAutofill(event) is MainEvent.CompleteAutofill -> handleCompleteAutofill(event)
MainEvent.Recreate -> handleRecreate() MainEvent.Recreate -> handleRecreate()
MainEvent.NavigateToDebugMenu -> navController.navigateToDebugMenuScreen() MainEvent.NavigateToDebugMenu -> navController.navigateToDebugMenuScreen()
is MainEvent.ShowToast -> {
Toast
.makeText(baseContext, event.message.invoke(resources), Toast.LENGTH_SHORT)
.show()
}
is MainEvent.UpdateAppLocale -> { is MainEvent.UpdateAppLocale -> {
AppCompatDelegate.setApplicationLocales( AppCompatDelegate.setApplicationLocales(
LocaleListCompat.forLanguageTags(event.localeName), LocaleListCompat.forLanguageTags(event.localeName),

View File

@ -4,11 +4,10 @@ import android.content.Intent
import android.os.Parcelable import android.os.Parcelable
import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.bitwarden.core.data.manager.toast.ToastManager
import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.base.BaseViewModel
import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme
import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.util.Text
import com.bitwarden.ui.util.asText
import com.bitwarden.vault.CipherView import com.bitwarden.vault.CipherView
import com.x8bit.bitwarden.data.auth.manager.AddTotpItemFromAuthenticatorManager import com.x8bit.bitwarden.data.auth.manager.AddTotpItemFromAuthenticatorManager
import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.AuthRepository
@ -84,6 +83,7 @@ class MainViewModel @Inject constructor(
private val savedStateHandle: SavedStateHandle, private val savedStateHandle: SavedStateHandle,
private val appResumeManager: AppResumeManager, private val appResumeManager: AppResumeManager,
private val clock: Clock, private val clock: Clock,
private val toastManager: ToastManager,
) : BaseViewModel<MainState, MainEvent, MainAction>( ) : BaseViewModel<MainState, MainEvent, MainAction>(
initialState = MainState( initialState = MainState(
theme = settingsRepository.appTheme, theme = settingsRepository.appTheme,
@ -433,16 +433,15 @@ class MainViewModel @Inject constructor(
) )
when (emailTokenResult) { when (emailTokenResult) {
is EmailTokenResult.Error -> { is EmailTokenResult.Error -> {
sendEvent( emailTokenResult
MainEvent.ShowToast( .message
message = emailTokenResult ?.let { toastManager.show(message = it) }
.message ?: run {
?.asText() toastManager.show(
?: BitwardenString messageId = BitwardenString
.there_was_an_issue_validating_the_registration_token .there_was_an_issue_validating_the_registration_token,
.asText(), )
), }
)
} }
EmailTokenResult.Expired -> { EmailTokenResult.Expired -> {
@ -585,11 +584,6 @@ sealed class MainEvent {
*/ */
data object NavigateToDebugMenu : MainEvent() data object NavigateToDebugMenu : MainEvent()
/**
* Show a toast with the given [message].
*/
data class ShowToast(val message: Text) : MainEvent()
/** /**
* Indicates that the app language has been updated. * Indicates that the app language has been updated.
*/ */

View File

@ -8,13 +8,13 @@ import androidx.credentials.provider.ProviderCreateCredentialRequest
import androidx.credentials.provider.ProviderGetCredentialRequest import androidx.credentials.provider.ProviderGetCredentialRequest
import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.SavedStateHandle
import app.cash.turbine.test import app.cash.turbine.test
import com.bitwarden.core.data.manager.toast.ToastManager
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.data.datasource.disk.base.FakeDispatcherManager import com.bitwarden.data.datasource.disk.base.FakeDispatcherManager
import com.bitwarden.data.repository.model.Environment import com.bitwarden.data.repository.model.Environment
import com.bitwarden.ui.platform.base.BaseViewModelTest import com.bitwarden.ui.platform.base.BaseViewModelTest
import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme
import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.resource.BitwardenString
import com.bitwarden.ui.util.asText
import com.bitwarden.vault.CipherView import com.bitwarden.vault.CipherView
import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus
import com.x8bit.bitwarden.data.auth.manager.AddTotpItemFromAuthenticatorManagerImpl import com.x8bit.bitwarden.data.auth.manager.AddTotpItemFromAuthenticatorManagerImpl
@ -160,6 +160,10 @@ class MainViewModelTest : BaseViewModelTest() {
mockk<GetPublicKeyCredentialOption>(relaxed = true), mockk<GetPublicKeyCredentialOption>(relaxed = true),
) )
} }
private val toastManager: ToastManager = mockk {
every { show(message = any(), duration = any()) } just runs
every { show(messageId = any(), duration = any()) } just runs
}
@BeforeEach @BeforeEach
fun setup() { fun setup() {
@ -592,18 +596,11 @@ class MainViewModelTest : BaseViewModelTest() {
authRepository.validateEmailToken(email = intentEmail, token = token) authRepository.validateEmailToken(email = intentEmail, token = token)
} returns EmailTokenResult.Error(message = null, error = Throwable("Fail!")) } returns EmailTokenResult.Error(message = null, error = Throwable("Fail!"))
viewModel.eventFlow.test { viewModel.trySendAction(MainAction.ReceiveFirstIntent(intent = mockIntent))
// We skip the first 2 events because they are the default appTheme and appLanguage
awaitItem()
awaitItem()
viewModel.trySendAction(MainAction.ReceiveFirstIntent(intent = mockIntent)) verify(exactly = 1) {
assertEquals( toastManager.show(
MainEvent.ShowToast( BitwardenString.there_was_an_issue_validating_the_registration_token,
BitwardenString.there_was_an_issue_validating_the_registration_token
.asText(),
),
awaitItem(),
) )
} }
} }
@ -629,16 +626,10 @@ class MainViewModelTest : BaseViewModelTest() {
authRepository.validateEmailToken(email = intentEmail, token = token) authRepository.validateEmailToken(email = intentEmail, token = token)
} returns EmailTokenResult.Error(message = expectedMessage, error = null) } returns EmailTokenResult.Error(message = expectedMessage, error = null)
viewModel.eventFlow.test { viewModel.trySendAction(MainAction.ReceiveFirstIntent(intent = mockIntent))
// We skip the first 2 events because they are the default appTheme and appLanguage
awaitItem()
awaitItem()
viewModel.trySendAction(MainAction.ReceiveFirstIntent(intent = mockIntent)) verify(exactly = 1) {
assertEquals( toastManager.show(message = expectedMessage)
MainEvent.ShowToast(expectedMessage.asText()),
awaitItem(),
)
} }
} }
@ -1157,6 +1148,7 @@ class MainViewModelTest : BaseViewModelTest() {
set(SPECIAL_CIRCUMSTANCE_KEY, initialSpecialCircumstance) set(SPECIAL_CIRCUMSTANCE_KEY, initialSpecialCircumstance)
}, },
appResumeManager = appResumeManager, appResumeManager = appResumeManager,
toastManager = toastManager,
) )
} }