diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/MainActivity.kt b/app/src/main/kotlin/com/x8bit/bitwarden/MainActivity.kt index 433d7de40a..2d2ae7d38e 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/MainActivity.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/MainActivity.kt @@ -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), diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/MainViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/MainViewModel.kt index 7e8b6d2f93..04935c3953 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/MainViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/MainViewModel.kt @@ -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( 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. */ diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/MainViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/MainViewModelTest.kt index ed4d34e4aa..0aa4a00dfb 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/MainViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/MainViewModelTest.kt @@ -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(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, ) }