PM-18877 Respect system app specific language selection on Android 13 and up. (#4849)

This commit is contained in:
Dave Severns
2025-03-13 13:14:41 +00:00
committed by GitHub
parent da63c9e36b
commit ca64ce2176
7 changed files with 161 additions and 28 deletions
@@ -97,6 +97,7 @@ class MainViewModelTest : BaseViewModelTest() {
every { isScreenCaptureAllowed } returns true
every { isScreenCaptureAllowedStateFlow } returns mutableScreenCaptureAllowedFlow
every { storeUserHasLoggedInValue(any()) } just runs
every { appLanguage = any() } just runs
}
private val authRepository = mockk<AuthRepository> {
every { activeUserId } returns DEFAULT_USER_STATE.activeUserId
@@ -1090,6 +1091,15 @@ class MainViewModelTest : BaseViewModelTest() {
verify { appResumeManager.setResumeScreen(AppResumeScreenData.GeneratorScreen) }
}
@Suppress("MaxLineLength")
@Test
fun `on AppSpecificLanguageUpdate, the repository value should be updated with the specified value`() {
val viewModel = createViewModel()
viewModel.trySendAction(MainAction.AppSpecificLanguageUpdate(AppLanguage.SPANISH))
verify { settingsRepository.appLanguage = AppLanguage.SPANISH }
}
private fun createViewModel(
initialSpecialCircumstance: SpecialCircumstance? = null,
) = MainViewModel(
@@ -11,11 +11,14 @@ import io.mockk.just
import io.mockk.mockk
import io.mockk.runs
import io.mockk.verify
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
class AppearanceViewModelTest : BaseViewModelTest() {
private val mutableAppLanguageStateFlow = MutableStateFlow(AppLanguage.DEFAULT)
private val mockSettingsRepository = mockk<SettingsRepository> {
every { appLanguage } returns AppLanguage.DEFAULT
every { appTheme } returns AppTheme.DEFAULT
@@ -23,6 +26,7 @@ class AppearanceViewModelTest : BaseViewModelTest() {
every { isIconLoadingDisabled } returns false
every { isIconLoadingDisabled = true } just runs
every { appTheme = AppTheme.DARK } just runs
every { appLanguageStateFlow } returns mutableAppLanguageStateFlow
}
@Test
@@ -48,30 +52,32 @@ class AppearanceViewModelTest : BaseViewModelTest() {
}
@Test
fun `on LanguageChange should update state and store language`() = runTest {
val viewModel = createViewModel(
settingsRepository = mockSettingsRepository,
)
viewModel.stateFlow.test {
assertEquals(
DEFAULT_STATE,
awaitItem(),
)
viewModel.trySendAction(AppearanceAction.LanguageChange(AppLanguage.ENGLISH))
assertEquals(
DEFAULT_STATE.copy(
language = AppLanguage.ENGLISH,
),
awaitItem(),
)
}
fun `on LanguageChange should store updated language in repository`() {
val viewModel = createViewModel()
viewModel.trySendAction(AppearanceAction.LanguageChange(AppLanguage.ENGLISH))
verify {
mockSettingsRepository.appLanguage
mockSettingsRepository.appLanguage = AppLanguage.ENGLISH
}
verify { mockSettingsRepository.appLanguage = AppLanguage.ENGLISH }
}
@Test
fun `on AppLanguageStateFlow value updated, view model language state should change`() =
runTest {
val viewModel = createViewModel()
viewModel.stateFlow.test {
assertEquals(
DEFAULT_STATE,
awaitItem(),
)
mutableAppLanguageStateFlow.update { AppLanguage.AFRIKAANS }
assertEquals(
DEFAULT_STATE.copy(
language = AppLanguage.AFRIKAANS,
),
awaitItem(),
)
}
}
@Test
fun `on ShowWebsiteIconsToggle should update state and store the value`() = runTest {
val viewModel = createViewModel()
@@ -0,0 +1,34 @@
package com.x8bit.bitwarden.ui.platform.util
import com.x8bit.bitwarden.ui.platform.feature.settings.appearance.model.AppLanguage
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNull
import java.util.Locale
class LocaleExtensionsTest {
@Test
fun `locale with Espanol language returns AppLanguage SPANISH`() {
val locale = Locale("es")
assertEquals(
AppLanguage.SPANISH,
locale.appLanguage,
)
}
@Test
fun `locale with GB english returns AppLanguage ENGLISH_BRITISH`() {
val locale = Locale("en-GB")
assertEquals(
AppLanguage.ENGLISH_BRITISH,
locale.appLanguage,
)
}
@Test
fun `locale with non existent app language returns null`() {
val locale = Locale("😅😅😅")
assertNull(locale.appLanguage)
}
}