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

View File

@ -4,11 +4,10 @@ import android.content.Intent
import android.os.Parcelable
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.bitwarden.core.data.manager.toast.ToastManager
import com.bitwarden.ui.platform.base.BaseViewModel
import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme
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.x8bit.bitwarden.data.auth.manager.AddTotpItemFromAuthenticatorManager
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
@ -84,6 +83,7 @@ class MainViewModel @Inject constructor(
private val savedStateHandle: SavedStateHandle,
private val appResumeManager: AppResumeManager,
private val clock: Clock,
private val toastManager: ToastManager,
) : BaseViewModel<MainState, MainEvent, MainAction>(
initialState = MainState(
theme = settingsRepository.appTheme,
@ -433,16 +433,15 @@ class MainViewModel @Inject constructor(
)
when (emailTokenResult) {
is EmailTokenResult.Error -> {
sendEvent(
MainEvent.ShowToast(
message = emailTokenResult
.message
?.asText()
?: BitwardenString
.there_was_an_issue_validating_the_registration_token
.asText(),
),
)
emailTokenResult
.message
?.let { toastManager.show(message = it) }
?: run {
toastManager.show(
messageId = BitwardenString
.there_was_an_issue_validating_the_registration_token,
)
}
}
EmailTokenResult.Expired -> {
@ -585,11 +584,6 @@ sealed class 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.
*/

View File

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