tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit f7a39edacec0c0da47b30e17afb635751d8d7faa
parent f807aa2cb094a24f3874150396c15fcdeacd7345
Author: Jeff Boek <j@jboek.com>
Date:   Wed, 29 Oct 2025 00:07:27 +0000

Bug 1977447 - Gate the address feature based on just the country r=android-reviewers,matt-tighe

Differential Revision: https://phabricator.services.mozilla.com/D270431

Diffstat:
Amobile/android/fenix/app/src/main/java/org/mozilla/fenix/autofill/address/AddressFeatureGate.kt | 43+++++++++++++++++++++++++++++++++++++++++++
Dmobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/addresses/AddressesDebugLocalesRepository.kt | 86-------------------------------------------------------------------------------
Amobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/addresses/AddressesDebugRegionRepository.kt | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/addresses/AddressesTools.kt | 66+++++++++++++++++++++++++++++++++---------------------------------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/addresses/FakeCreditCardsAddressesStorage.kt | 7+++----
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/navigation/DebugDrawerRoute.kt | 8++++----
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/ui/FenixOverlay.kt | 18+++++++++---------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt | 22+++++++++-------------
Amobile/android/fenix/app/src/test/java/org/mozilla/fenix/autofill/address/RegionAddressFeatureGateTest.kt | 49+++++++++++++++++++++++++++++++++++++++++++++++++
9 files changed, 249 insertions(+), 149 deletions(-)

diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/autofill/address/AddressFeatureGate.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/autofill/address/AddressFeatureGate.kt @@ -0,0 +1,43 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.autofill.address + +import org.mozilla.fenix.debugsettings.addresses.AddressesDebugRegionRepository +import java.util.Locale + +/** + * An interface to access whether or not the address feature is enabled. + */ +fun interface AddressFeatureGate { + /** + * @return a [Boolean] indicating if the address feature is enabled. + */ + fun isAddressFeatureEnabled(): Boolean +} + +/** + * An implementation of [AddressFeatureGate] that uses the users [Locale] and any enabled regions + * within a [AddressesDebugRegionRepository]. + * + * @param locale the [Locale] to check against. + * @param debugRepository a [AddressesDebugRegionRepository] to query any extra regions to test against. + */ +class RegionAddressFeatureGate( + private val locale: Locale, + private val debugRepository: AddressesDebugRegionRepository, +) : AddressFeatureGate { + override fun isAddressFeatureEnabled(): Boolean { + val country = locale.country + return SUPPORTED_REGIONS.contains(country) || debugRepository.isCountryEnabled(country) + } + + companion object { + private val SUPPORTED_REGIONS = setOf("US", "CA") + } +} + +private fun AddressesDebugRegionRepository.isCountryEnabled(country: String): Boolean = getAllEnabledRegions() + .map { it.country } + .contains(country) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/addresses/AddressesDebugLocalesRepository.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/addresses/AddressesDebugLocalesRepository.kt @@ -1,86 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.debugsettings.addresses - -import android.content.Context -import android.content.Context.MODE_PRIVATE -import android.content.SharedPreferences -import androidx.core.content.edit - -private const val SHARED_PREFS_FILENAME = "ADDRESSES_DEBUG_LOCALES" - -/** - * List of locales that can be enabled for debuging purposes only. - */ -// Lang tags found at https://gist.github.com/typpo/b2b828a35e683b9bf8db91b5404f1bd1 -enum class DebugLocale(val langTag: String) { - DE("de-DE"), - FR("fr-FR"), - AU("en-AU"), - GB("en-GB"), - JP("ja"), -} - -/** - * Type declaring methods for interacting with a storage layer relating to debug locales. - */ -interface AddressesDebugLocalesRepository { - /** - * Get all the enabled debug locale. - */ - fun getAllEnabledLocales(): List<DebugLocale> - - /** - * Check whether a debug locale is enabled. - */ - fun isLocaleEnabled(locale: DebugLocale): Boolean - - /** - * Set whether a debug locale is enabled. - */ - fun setLocaleEnabled(locale: DebugLocale, enabled: Boolean) -} - -/** - * A [AddressesDebugLocalesRepository] that uses shared prefs as its storage mechanism. This was chosen - * for easy interop with utils/Settings.kt but could be updated to DataStore down the road. - */ -class SharedPrefsAddressesDebugLocalesRepository( - context: Context, -) : AddressesDebugLocalesRepository { - - private val prefs: SharedPreferences = context.getSharedPreferences(SHARED_PREFS_FILENAME, MODE_PRIVATE) - - override fun getAllEnabledLocales(): List<DebugLocale> = - DebugLocale.entries.filter { locale -> - prefs.getBoolean(locale.name, false) - } - - override fun isLocaleEnabled(locale: DebugLocale): Boolean = - prefs.getBoolean(locale.name, false) - - override fun setLocaleEnabled(locale: DebugLocale, enabled: Boolean) = - prefs.edit { putBoolean(locale.name, enabled) } -} - -/** - * A fake [AddressesDebugLocalesRepository]. - */ -class FakeAddressesDebugLocalesRepository : AddressesDebugLocalesRepository { - private val debugLocales = DebugLocale.entries.associateWith { - false - }.toMutableMap() - - override fun getAllEnabledLocales(): List<DebugLocale> { - return debugLocales.filter { it.value }.keys.toList() - } - - override fun isLocaleEnabled(locale: DebugLocale): Boolean = - debugLocales[locale] ?: false - - override fun setLocaleEnabled(locale: DebugLocale, enabled: Boolean) { - debugLocales[locale] = enabled - } -} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/addresses/AddressesDebugRegionRepository.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/addresses/AddressesDebugRegionRepository.kt @@ -0,0 +1,99 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.debugsettings.addresses + +import android.content.Context +import android.content.Context.MODE_PRIVATE +import android.content.SharedPreferences +import androidx.core.content.edit + +private const val SHARED_PREFS_FILENAME = "ADDRESSES_DEBUG_REGION" + +/** + * List of regions that can be enabled for debugging purposes only. + */ +enum class DebugRegion(val country: String) { + DE("DE"), + FR("FR"), + AU("AU"), + GB("GB"), + JP("JP"), +} + +/** + * Type declaring methods for interacting with a storage layer relating to debug regions. + */ +interface AddressesDebugRegionRepository { + /** + * Get all the enabled debug region. + */ + fun getAllEnabledRegions(): List<DebugRegion> + + /** + * Check whether a debug region is enabled. + */ + fun isRegionEnabled(region: DebugRegion): Boolean + + /** + * Set whether a debug region is enabled. + */ + fun setRegionEnabled(region: DebugRegion, enabled: Boolean) +} + +/** + * A [AddressesDebugRegionRepository] that uses shared prefs as its storage mechanism. This was chosen + * for easy interop with utils/Settings.kt but could be updated to DataStore down the road. + */ +class SharedPrefsAddressesDebugRegionRepository( + context: Context, +) : AddressesDebugRegionRepository { + + private val prefs: SharedPreferences = context.getSharedPreferences(SHARED_PREFS_FILENAME, MODE_PRIVATE) + + override fun getAllEnabledRegions(): List<DebugRegion> = + DebugRegion.entries.filter { region -> + prefs.getBoolean(region.country, false) + } + + override fun isRegionEnabled(region: DebugRegion): Boolean = + prefs.getBoolean(region.country, false) + + override fun setRegionEnabled(region: DebugRegion, enabled: Boolean) = + prefs.edit { putBoolean(region.country, enabled) } +} + +/** + * An empty [AddressesDebugRegionRepository] that is a no-op for release. + */ +class EmptyAddressesDebugRegionRepository : AddressesDebugRegionRepository { + override fun getAllEnabledRegions() = listOf<DebugRegion>() + + override fun isRegionEnabled(region: DebugRegion) = false + + override fun setRegionEnabled( + region: DebugRegion, + enabled: Boolean, + ) { /* noop */ } +} + +/** + * A fake [AddressesDebugRegionRepository]. + */ +class FakeAddressesDebugRegionRepository : AddressesDebugRegionRepository { + private val debugRegions = DebugRegion.entries.associateWith { + false + }.toMutableMap() + + override fun getAllEnabledRegions(): List<DebugRegion> { + return debugRegions.filter { it.value }.keys.toList() + } + + override fun isRegionEnabled(region: DebugRegion): Boolean = + debugRegions[region] ?: false + + override fun setRegionEnabled(region: DebugRegion, enabled: Boolean) { + debugRegions[region] = enabled + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/addresses/AddressesTools.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/addresses/AddressesTools.kt @@ -41,15 +41,15 @@ import org.mozilla.fenix.theme.FirefoxTheme */ @Composable fun AddressesTools( - debugLocalesRepository: AddressesDebugLocalesRepository, + debugRegionRepository: AddressesDebugRegionRepository, creditCardsAddressesStorage: CreditCardsAddressesStorage, ) { - var possibleDebugLocales by remember { - mutableStateOf(debugLocalesRepository.initialEnabledState()) + var possibleDebugRegions by remember { + mutableStateOf(debugRegionRepository.initialEnabledState()) } - val onLocaleToggled = { locale: DebugLocale, isEnabled: Boolean -> - debugLocalesRepository.setLocaleEnabled(locale, isEnabled) - possibleDebugLocales = possibleDebugLocales.updateLocaleEnabled(locale, isEnabled) + val onRegionToggled = { region: DebugRegion, isEnabled: Boolean -> + debugRegionRepository.setRegionEnabled(region, isEnabled) + possibleDebugRegions = possibleDebugRegions.updateRegionEnabled(region, isEnabled) } val scope = rememberCoroutineScope() @@ -79,8 +79,8 @@ fun AddressesTools( } AddressesContent( - debugLocaleStates = possibleDebugLocales, - onLocaleToggled = onLocaleToggled, + debugRegionStates = possibleDebugRegions, + onRegionToggled = onRegionToggled, addresses = addresses, onAddAddressClick = onAddAddress, onDeleteAddressClick = onDeleteAddress, @@ -90,10 +90,10 @@ fun AddressesTools( @Composable private fun AddressesContent( - debugLocaleStates: List<DebugLocaleEnabledState>, - onLocaleToggled: (DebugLocale, Boolean) -> Unit, + debugRegionStates: List<DebugRegionEnabledState>, + onRegionToggled: (DebugRegion, Boolean) -> Unit, addresses: List<Address>, - onAddAddressClick: (locale: String) -> Unit, + onAddAddressClick: (region: String) -> Unit, onDeleteAddressClick: (Address) -> Unit, onDeleteAllAddressesClick: () -> Unit, ) { @@ -110,9 +110,9 @@ private fun AddressesContent( Spacer(Modifier.height(16.dp)) - DebugLocalesToEnableSection( - debugLocaleStates = debugLocaleStates, - onLocaleToggled = onLocaleToggled, + DebugRegionsToEnableSection( + debugRegionStates = debugRegionStates, + onRegionToggled = onRegionToggled, ) Spacer(Modifier.height(16.dp)) @@ -127,9 +127,9 @@ private fun AddressesContent( } @Composable -private fun DebugLocalesToEnableSection( - debugLocaleStates: List<DebugLocaleEnabledState>, - onLocaleToggled: (DebugLocale, Boolean) -> Unit, +private fun DebugRegionsToEnableSection( + debugRegionStates: List<DebugRegionEnabledState>, + onRegionToggled: (DebugRegion, Boolean) -> Unit, ) { Text( text = stringResource(R.string.debug_drawer_addresses_debug_locales_header), @@ -138,11 +138,11 @@ private fun DebugLocalesToEnableSection( ) Column { - debugLocaleStates.forEach { debugLocaleState -> + debugRegionStates.forEach { debugLocaleState -> SwitchWithLabel( - label = debugLocaleState.locale.name, + label = debugLocaleState.region.name, checked = debugLocaleState.enabled, - onCheckedChange = { onLocaleToggled(debugLocaleState.locale, it) }, + onCheckedChange = { onRegionToggled(debugLocaleState.region, it) }, ) } } @@ -204,25 +204,25 @@ private fun AddressesManagementSection( } } -private data class DebugLocaleEnabledState( - val locale: DebugLocale, +private data class DebugRegionEnabledState( + val region: DebugRegion, val enabled: Boolean, ) -private fun AddressesDebugLocalesRepository.initialEnabledState(): List<DebugLocaleEnabledState> = - DebugLocale.entries.map { debugLocale -> - DebugLocaleEnabledState( - locale = debugLocale, - enabled = isLocaleEnabled(debugLocale), +private fun AddressesDebugRegionRepository.initialEnabledState(): List<DebugRegionEnabledState> = + DebugRegion.entries.map { debugRegion -> + DebugRegionEnabledState( + region = debugRegion, + enabled = isRegionEnabled(debugRegion), ) } -private fun List<DebugLocaleEnabledState>.updateLocaleEnabled(localeToUpdate: DebugLocale, isEnabled: Boolean) = - this.map { localeState -> - if (localeState.locale == localeToUpdate) { - localeState.copy(enabled = isEnabled) +private fun List<DebugRegionEnabledState>.updateRegionEnabled(regionToUpdate: DebugRegion, isEnabled: Boolean) = + this.map { regionState -> + if (regionState.region == regionToUpdate) { + regionState.copy(enabled = isEnabled) } else { - localeState + regionState } } @@ -234,7 +234,7 @@ private fun AddressesScreenPreview() { modifier = Modifier.background(color = FirefoxTheme.colors.layer1), ) { AddressesTools( - debugLocalesRepository = FakeAddressesDebugLocalesRepository(), + debugRegionRepository = FakeAddressesDebugRegionRepository(), creditCardsAddressesStorage = FakeCreditCardsAddressesStorage(), ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/addresses/FakeCreditCardsAddressesStorage.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/addresses/FakeCreditCardsAddressesStorage.kt @@ -177,10 +177,9 @@ internal class FakeCreditCardsAddressesStorage : CreditCardsAddressesStorage { companion object { fun getAllPossibleLocaleLangTags(): List<String> = listOf( - "en-US", - "en-CA", - "fr-CA", - ) + DebugLocale.entries.map { it.langTag } + "US", + "CA", + ) + DebugRegion.entries.map { it.country } private val randomNames = listOf("John Doe", "Jane Doe", "Bob Smith", "Alice Johnson") private val randomCardNumbers = listOf( diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/navigation/DebugDrawerRoute.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/navigation/DebugDrawerRoute.kt @@ -12,7 +12,7 @@ import mozilla.components.concept.storage.CreditCardsAddressesStorage import mozilla.components.concept.storage.LoginsStorage import org.mozilla.fenix.R import org.mozilla.fenix.debugsettings.addons.ui.AddonsDebugToolsScreen -import org.mozilla.fenix.debugsettings.addresses.AddressesDebugLocalesRepository +import org.mozilla.fenix.debugsettings.addresses.AddressesDebugRegionRepository import org.mozilla.fenix.debugsettings.addresses.AddressesTools import org.mozilla.fenix.debugsettings.cfrs.CfrToolsState import org.mozilla.fenix.debugsettings.cfrs.CfrToolsStore @@ -85,7 +85,7 @@ enum class DebugDrawerRoute(val route: String, @param:StringRes val title: Int) * @param cfrToolsStore [CfrToolsStore] used to access [CfrToolsState]. * @param gleanDebugToolsStore [GleanDebugToolsStore] used to dispatch glean debug tools actions. * @param loginsStorage [LoginsStorage] used to access logins for [LoginsScreen]. - * @param addressesDebugLocalesRepository used to control storage for [AddressesTools]. + * @param addressesDebugRegionRepository used to control storage for [AddressesTools]. * @param creditCardsAddressesStorage used to access addresses for [AddressesTools]. * @param inactiveTabsEnabled Whether the inactive tabs feature is enabled. */ @@ -96,7 +96,7 @@ enum class DebugDrawerRoute(val route: String, @param:StringRes val title: Int) cfrToolsStore: CfrToolsStore, gleanDebugToolsStore: GleanDebugToolsStore, loginsStorage: LoginsStorage, - addressesDebugLocalesRepository: AddressesDebugLocalesRepository, + addressesDebugRegionRepository: AddressesDebugRegionRepository, creditCardsAddressesStorage: CreditCardsAddressesStorage, inactiveTabsEnabled: Boolean, ): List<DebugDrawerDestination> = @@ -134,7 +134,7 @@ enum class DebugDrawerRoute(val route: String, @param:StringRes val title: Int) } content = { AddressesTools( - debugLocalesRepository = addressesDebugLocalesRepository, + debugRegionRepository = addressesDebugRegionRepository, creditCardsAddressesStorage = creditCardsAddressesStorage, ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/ui/FenixOverlay.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/ui/FenixOverlay.kt @@ -26,11 +26,11 @@ import mozilla.components.concept.storage.LoginsStorage import mozilla.components.lib.state.ext.observeAsState import mozilla.telemetry.glean.Glean import org.mozilla.fenix.R -import org.mozilla.fenix.debugsettings.addresses.AddressesDebugLocalesRepository +import org.mozilla.fenix.debugsettings.addresses.AddressesDebugRegionRepository import org.mozilla.fenix.debugsettings.addresses.AddressesTools -import org.mozilla.fenix.debugsettings.addresses.FakeAddressesDebugLocalesRepository +import org.mozilla.fenix.debugsettings.addresses.FakeAddressesDebugRegionRepository import org.mozilla.fenix.debugsettings.addresses.FakeCreditCardsAddressesStorage -import org.mozilla.fenix.debugsettings.addresses.SharedPrefsAddressesDebugLocalesRepository +import org.mozilla.fenix.debugsettings.addresses.SharedPrefsAddressesDebugRegionRepository import org.mozilla.fenix.debugsettings.cfrs.CfrToolsPreferencesMiddleware import org.mozilla.fenix.debugsettings.cfrs.CfrToolsState import org.mozilla.fenix.debugsettings.cfrs.CfrToolsStore @@ -103,9 +103,9 @@ fun FenixOverlay( ), ), loginsStorage = loginsStorage, - addressesDebugLocalesRepository = + addressesDebugRegionRepository = context.components.strictMode.allowViolation(StrictMode::allowThreadDiskReads) { - SharedPrefsAddressesDebugLocalesRepository(context) + SharedPrefsAddressesDebugRegionRepository(context) }, creditCardsAddressesStorage = context.components.core.autofillStorage, inactiveTabsEnabled = inactiveTabsEnabled, @@ -119,7 +119,7 @@ fun FenixOverlay( * @param cfrToolsStore [CfrToolsStore] used to access [CfrToolsState]. * @param gleanDebugToolsStore [GleanDebugToolsStore] used to access [GleanDebugToolsState]. * @param loginsStorage [LoginsStorage] used to access logins for [LoginsTools]. - * @param addressesDebugLocalesRepository used to control storage for [AddressesTools]. + * @param addressesDebugRegionRepository used to control storage for [AddressesTools]. * @param creditCardsAddressesStorage used to access addresses for [AddressesTools]. * @param inactiveTabsEnabled Whether the inactive tabs feature is enabled. */ @@ -129,7 +129,7 @@ private fun FenixOverlay( cfrToolsStore: CfrToolsStore, gleanDebugToolsStore: GleanDebugToolsStore, loginsStorage: LoginsStorage, - addressesDebugLocalesRepository: AddressesDebugLocalesRepository, + addressesDebugRegionRepository: AddressesDebugRegionRepository, creditCardsAddressesStorage: CreditCardsAddressesStorage, inactiveTabsEnabled: Boolean, ) { @@ -155,7 +155,7 @@ private fun FenixOverlay( gleanDebugToolsStore = gleanDebugToolsStore, inactiveTabsEnabled = inactiveTabsEnabled, loginsStorage = loginsStorage, - addressesDebugLocalesRepository = addressesDebugLocalesRepository, + addressesDebugRegionRepository = addressesDebugRegionRepository, creditCardsAddressesStorage = creditCardsAddressesStorage, ) } @@ -204,7 +204,7 @@ private fun FenixOverlayPreview() { ), inactiveTabsEnabled = true, loginsStorage = FakeLoginsStorage(), - addressesDebugLocalesRepository = FakeAddressesDebugLocalesRepository(), + addressesDebugRegionRepository = FakeAddressesDebugRegionRepository(), creditCardsAddressesStorage = FakeCreditCardsAddressesStorage(), ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -40,12 +40,14 @@ import org.mozilla.fenix.Config import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.GleanMetrics.TopSites import org.mozilla.fenix.R +import org.mozilla.fenix.autofill.address.RegionAddressFeatureGate import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.components.settings.counterPreference import org.mozilla.fenix.components.settings.featureFlagPreference import org.mozilla.fenix.components.settings.lazyFeatureFlagPreference import org.mozilla.fenix.components.toolbar.ToolbarPosition -import org.mozilla.fenix.debugsettings.addresses.SharedPrefsAddressesDebugLocalesRepository +import org.mozilla.fenix.debugsettings.addresses.EmptyAddressesDebugRegionRepository +import org.mozilla.fenix.debugsettings.addresses.SharedPrefsAddressesDebugRegionRepository import org.mozilla.fenix.ext.TALL_SCREEN_HEIGHT_DP import org.mozilla.fenix.ext.WIDE_SCREEN_WIDTH_DP import org.mozilla.fenix.ext.components @@ -1944,21 +1946,15 @@ class Settings(private val appContext: Context) : PreferencesHolder { * Show the Addresses autofill feature. */ private fun isAddressFeatureEnabled(context: Context): Boolean { - val releaseEnabledLanguages = listOf( - "en-US", - "en-CA", - "fr-CA", - ) - val currentlyEnabledLanguages = if (Config.channel.isNightlyOrDebug) { - releaseEnabledLanguages + SharedPrefsAddressesDebugLocalesRepository(context) - .getAllEnabledLocales().map { it.langTag } + val locale = LocaleManager.getCurrentLocale(context) ?: LocaleManager.getSystemDefault() + val debugRepository = if (Config.channel.isNightlyOrDebug) { + SharedPrefsAddressesDebugRegionRepository(context) } else { - releaseEnabledLanguages + EmptyAddressesDebugRegionRepository() } - val userLangTag = LocaleManager.getCurrentLocale(context) - ?.toLanguageTag() ?: LocaleManager.getSystemDefault().toLanguageTag() - return currentlyEnabledLanguages.contains(userLangTag) + val featureGate = RegionAddressFeatureGate(locale, debugRepository) + return featureGate.isAddressFeatureEnabled() } private val mr2022Sections: Map<Mr2022Section, Boolean> diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/autofill/address/RegionAddressFeatureGateTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/autofill/address/RegionAddressFeatureGateTest.kt @@ -0,0 +1,49 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.autofill.address + +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test +import org.mozilla.fenix.debugsettings.addresses.DebugRegion +import org.mozilla.fenix.debugsettings.addresses.EmptyAddressesDebugRegionRepository +import org.mozilla.fenix.debugsettings.addresses.FakeAddressesDebugRegionRepository +import java.util.Locale + +class RegionAddressFeatureGateTest { + @Test + fun `GIVEN an enabled region WHEN calling isAddressFeatureEnabled THEN return true`() { + listOf(Locale.US, Locale.CANADA).forEach { + val featureGate = RegionAddressFeatureGate(it, EmptyAddressesDebugRegionRepository()) + assertTrue(featureGate.isAddressFeatureEnabled()) + } + } + + @Test + fun `GIVEN an unavailable region WHEN calling isAddressFeatureEnabled THEN return false`() { + listOf( + Locale.GERMANY, + Locale.JAPAN, + Locale.UK, + Locale.FRANCE, + Locale.forLanguageTag("pt-BR"), + Locale.forLanguageTag("es-ES"), + Locale.forLanguageTag("ja-JP"), + ).forEach { + val featureGate = RegionAddressFeatureGate(it, EmptyAddressesDebugRegionRepository()) + assertFalse(featureGate.isAddressFeatureEnabled()) + } + } + + @Test + fun `GIVEN a region enabled in the AddressDebugRegionRepository WHEN calling isAddressFeatureEnabled THEN return true`() { + val repository = FakeAddressesDebugRegionRepository().also { + it.setRegionEnabled(DebugRegion.JP, true) + } + + val featureGate = RegionAddressFeatureGate(Locale.JAPAN, repository) + assertTrue(featureGate.isAddressFeatureEnabled()) + } +}