commit 68e6ac1494fc82ddec5d460db2e37fcd6428f9a0 parent 0bc96d4778b3b5382d0b41adf73a0602de5ec5a3 Author: Alex Catarineu <acat@torproject.org> Date: Sun, 18 Oct 2020 23:09:12 +0200 TB 40087 [android]: Implement a switch for spoof English. Originally, fenix#40087 and android-components#40019. Diffstat:
8 files changed, 60 insertions(+), 4 deletions(-)
diff --git a/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt b/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt @@ -1626,6 +1626,15 @@ class GeckoEngine( value?.let { runtime.settings.setBaselineFingerprintingProtectionOverrides(it) } } + override var spoofEnglish: Boolean + get() = runtime.settings.spoofEnglish + set(value) { + value.let { + runtime.settings.spoofEnglish = it + localeUpdater.updateValue() + } + } + override var webContentIsolationStrategy: WebContentIsolationStrategy? get() = runtime.settings.webContentIsolationStrategy?.intoWebContentIsolationStrategy() set(value) { @@ -1720,6 +1729,7 @@ class GeckoEngine( this.userCharacteristicPingCurrentVersion = it.userCharacteristicPingCurrentVersion this.baselineFingerprintingProtection = it.baselineFingerprintingProtection this.baselineFingerprintingProtectionOverrides = it.baselineFingerprintingProtectionOverrides + this.spoofEnglish = it.spoofEnglish this.webContentIsolationStrategy = it.webContentIsolationStrategy this.fetchPriorityEnabled = it.fetchPriorityEnabled this.parallelMarkingEnabled = it.parallelMarkingEnabled diff --git a/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/Settings.kt b/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/Settings.kt @@ -300,6 +300,8 @@ abstract class Settings { */ open var userCharacteristicPingCurrentVersion: Int by UnsupportedSetting() + open var spoofEnglish: Boolean by UnsupportedSetting() + /** * Setting to control whether privacy.baselineFingerprintingProtection is enabled. * This is enabled by default in all modes. @@ -449,6 +451,7 @@ data class DefaultSettings( override var queryParameterStrippingStripList: String = "", override var emailTrackerBlockingPrivateBrowsing: Boolean = false, override var userCharacteristicPingCurrentVersion: Int = 0, + override var spoofEnglish: Boolean = false, override var webContentIsolationStrategy: WebContentIsolationStrategy? = WebContentIsolationStrategy.ISOLATE_HIGH_VALUE, override var fetchPriorityEnabled: Boolean = true, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Core.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -183,6 +183,7 @@ class Core( cookieBannerHandlingGlobalRulesSubFrames = context.settings().shouldEnableCookieBannerGlobalRulesSubFrame, emailTrackerBlockingPrivateBrowsing = false, userCharacteristicPingCurrentVersion = FxNimbus.features.userCharacteristics.value().currentVersion, + spoofEnglish = context.settings().spoofEnglish, getDesktopMode = { store.state.desktopMode }, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/advanced/DefaultLocaleSettingsController.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/advanced/DefaultLocaleSettingsController.kt @@ -13,6 +13,7 @@ import mozilla.components.browser.state.store.BrowserStore import mozilla.components.support.locale.LocaleManager import mozilla.components.support.locale.LocaleUseCases import org.mozilla.fenix.nimbus.FxNimbus +import org.mozilla.fenix.ext.components import java.util.Locale /** @@ -141,5 +142,9 @@ class DefaultLocaleSettingsController( config.setLocale(locale) config.setLayoutDirection(locale) resources.updateConfiguration(config, resources.displayMetrics) + // A slightly hacky way of triggering a `runtime.settings.locales` update, + // so that the locales are updated in GeckoView. + val spoofEnglish = context.components.core.engine.settings.spoofEnglish + context.components.core.engine.settings.spoofEnglish = spoofEnglish } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/advanced/LocaleSettingsFragment.kt @@ -23,6 +23,8 @@ import mozilla.components.support.locale.LocaleUseCases import org.mozilla.fenix.R import org.mozilla.fenix.databinding.FragmentLocaleSettingsBinding import org.mozilla.fenix.ext.components +import org.mozilla.fenix.ext.requireComponents +import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar class LocaleSettingsFragment : Fragment(), MenuProvider { @@ -46,6 +48,8 @@ class LocaleSettingsFragment : Fragment(), MenuProvider { _binding = FragmentLocaleSettingsBinding.inflate(inflater, container, false) val view = binding.root + bindEnableSwitch() + val browserStore = requireContext().components.core.store val localeUseCase = LocaleUseCases(browserStore) @@ -60,10 +64,19 @@ class LocaleSettingsFragment : Fragment(), MenuProvider { localeUseCase = localeUseCase, ), ) - localeView = LocaleSettingsView(binding.root, interactor) + localeView = LocaleSettingsView(binding.localeContainer, interactor) return view } + private fun bindEnableSwitch() { + val switch = binding.enableSwitch + switch.isChecked = requireComponents.core.engine.settings.spoofEnglish + switch.setOnCheckedChangeListener { _, isChecked -> + context?.settings()?.spoofEnglish = isChecked + requireComponents.core.engine.settings.spoofEnglish = isChecked + } + } + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { inflater.inflate(R.menu.languages_list, menu) val searchItem = menu.findItem(R.id.search) 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 @@ -525,6 +525,11 @@ class Settings( default = { FxNimbus.features.menuRedesign.value().menuBanner }, ) + var spoofEnglish by booleanPreference( + appContext.getPreferenceKey(R.string.pref_key_spoof_english), + default = false, + ) + var defaultSearchEngineName by stringPreference( appContext.getPreferenceKey(R.string.pref_key_search_engine), default = "", diff --git a/mobile/android/fenix/app/src/main/res/layout/fragment_locale_settings.xml b/mobile/android/fenix/app/src/main/res/layout/fragment_locale_settings.xml @@ -7,13 +7,30 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <FrameLayout + <com.google.android.material.switchmaterial.SwitchMaterial + android:id="@+id/enable_switch" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical|end" + android:background="?android:attr/selectableItemBackground" + android:checked="true" + android:clickable="true" + android:focusable="true" + android:layout_marginStart="54dp" + android:padding="16dp" + android:text="@string/tor_spoof_english" + android:textColor="?textPrimary" + android:textSize="16sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/locale_container" android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toBottomOf="@id/enable_switch" /> </androidx.constraintlayout.widget.ConstraintLayout> diff --git a/mobile/android/fenix/app/src/main/res/values/preference_keys.xml b/mobile/android/fenix/app/src/main/res/values/preference_keys.xml @@ -528,4 +528,6 @@ <string name="pref_key_extensions_version" translatable="false">pref_key_extensions_version</string> <string name="pref_key_https_everywhere_removed" translatable="false">pref_key_https_everywhere_removed</string> + + <string name="pref_key_spoof_english" translatable="false">pref_key_spoof_english</string> </resources>