diff --git a/app/src/main/java/org/mozilla/fenix/components/Core.kt b/app/src/main/java/org/mozilla/fenix/components/Core.kt index 9a0f0d9d6835deb99300cb5aa59efdddc3a3a9d4..ff1c306f9104998fbc03c865310e78d9e182ee2a 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Core.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -103,7 +103,8 @@ class Core( fontInflationEnabled = context.settings().shouldUseAutoSize, suspendMediaWhenInactive = false, forceUserScalableContent = context.settings().forceEnableZoom, - loginAutofillEnabled = context.settings().shouldAutofillLogins + loginAutofillEnabled = context.settings().shouldAutofillLogins, + torSecurityLevel = context.settings().torSecurityLevel().intRepresentation ) GeckoEngine( diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt index ad7cebade85fcd8be3c555313801c93a197da8d4..91714d68d98939be5979d8e1ce12d7cc5cb66ccd 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt @@ -370,6 +370,8 @@ class DefaultSessionControlController( } override fun handleOpenSecurityLevelSettingsClicked() { + val directions = HomeFragmentDirections.actionGlobalTorSecurityLevelFragment() + navController.nav(R.id.homeFragment, directions) } override fun handleWhatsNewGetAnswersClicked() { diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/TorOnboardingSecurityLevelViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/TorOnboardingSecurityLevelViewHolder.kt index dbfc21b56b53a7ee19b304e14b4ebc0d966dd9b4..7e0b756d88ea10da330586e206bc781d8560edf2 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/TorOnboardingSecurityLevelViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/TorOnboardingSecurityLevelViewHolder.kt @@ -11,6 +11,8 @@ import org.mozilla.fenix.R import org.mozilla.fenix.ext.components import org.mozilla.fenix.home.sessioncontrol.OnboardingInteractor import org.mozilla.fenix.onboarding.OnboardingRadioButton +import org.mozilla.fenix.tor.SecurityLevel +import org.mozilla.fenix.tor.SecurityLevelUtil import org.mozilla.fenix.utils.view.addToRadioGroup class TorOnboardingSecurityLevelViewHolder( @@ -57,19 +59,33 @@ class TorOnboardingSecurityLevelViewHolder( saferSecurityLevel.isChecked = securityLevel == SecurityLevel.SAFER standardSecurityLevel.onClickListener { - updateSecurityLevel() + updateSecurityLevel(SecurityLevel.STANDARD) } saferSecurityLevel.onClickListener { - updateSecurityLevel() + updateSecurityLevel(SecurityLevel.SAFER) } safestSecurityLevel.onClickListener { - updateSecurityLevel() + updateSecurityLevel(SecurityLevel.SAFEST) } + + updateSecurityLevel(securityLevel) } - private fun updateSecurityLevel() { + private fun updateSecurityLevel(newLevel: SecurityLevel) { + val resources = itemView.context.resources + val securityLevel = when (newLevel) { + SecurityLevel.STANDARD -> resources.getString(R.string.tor_security_level_standard_option) + SecurityLevel.SAFER -> resources.getString(R.string.tor_security_level_safer_option) + SecurityLevel.SAFEST -> resources.getString(R.string.tor_security_level_safest_option) + } + itemView.current_level.text = resources.getString( + R.string.tor_onboarding_chosen_security_level_label, securityLevel + ) + itemView.context.components.let { + it.core.engine.settings.torSecurityLevel = newLevel.intRepresentation + } } companion object { diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index 1af0d69f266a18c2c2182c049079a1c0b5eb54b8..888a791348d9be35000010536f98c50100fdac19 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -224,6 +224,9 @@ class SettingsFragment : PreferenceFragmentCompat() { resources.getString(R.string.pref_key_tor_network_settings) -> { SettingsFragmentDirections.actionSettingsFragmentToTorNetworkSettingsFragment() } + resources.getString(R.string.pref_key_tor_security_level_settings) -> { + SettingsFragmentDirections.actionSettingsFragmentToTorSecurityLevelFragment() + } resources.getString(R.string.pref_key_tracking_protection_settings) -> { requireContext().metrics.track(Event.TrackingProtectionSettings) SettingsFragmentDirections.actionSettingsFragmentToTrackingProtectionFragment() diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 6bd9ab7fdd27381cc209610e76f59ba96b5da0f8..e5f723ad37a6a487dbf2b15c29b2fcc4f8e28029 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -40,6 +40,7 @@ import org.mozilla.fenix.settings.deletebrowsingdata.DeleteBrowsingDataOnQuitTyp import org.mozilla.fenix.settings.logins.SavedLoginsSortingStrategyMenu import org.mozilla.fenix.settings.logins.SortingStrategy import org.mozilla.fenix.settings.registerOnSharedPreferenceChangeListener +import org.mozilla.fenix.tor.SecurityLevel import java.security.InvalidParameterException private const val AUTOPLAY_USER_SETTING = "AUTOPLAY_USER_SETTING" @@ -186,6 +187,33 @@ class Settings(private val appContext: Context) : PreferencesHolder { false ) + var standardSecurityLevel by booleanPreference( + appContext.getPreferenceKey(SecurityLevel.STANDARD.preferenceKey), + default = true + ) + + var saferSecurityLevel by booleanPreference( + appContext.getPreferenceKey(SecurityLevel.SAFER.preferenceKey), + default = false + ) + + var safestSecurityLevel by booleanPreference( + appContext.getPreferenceKey(SecurityLevel.SAFEST.preferenceKey), + default = false + ) + + // torSecurityLevel is defined as the first |true| preference, + // beginning at the safest level. + // If multiple preferences are true, then that is a bug and the + // highest |true| security level is chosen. + // Standard is the default level. + fun torSecurityLevel(): SecurityLevel = when { + safestSecurityLevel -> SecurityLevel.SAFEST + saferSecurityLevel -> SecurityLevel.SAFER + standardSecurityLevel -> SecurityLevel.STANDARD + else -> SecurityLevel.STANDARD + } + // If any of the prefs have been modified, quit displaying the fenix moved tip fun shouldDisplayFenixMovingTip(): Boolean = preferences.getBoolean( diff --git a/app/src/main/res/layout/tor_onboarding_security_level.xml b/app/src/main/res/layout/tor_onboarding_security_level.xml index a87c6be4fe832d6f541e0f8c09c97dae58da9c7e..853225c7622087a9ba50bd9f0e72b060dd45db52 100644 --- a/app/src/main/res/layout/tor_onboarding_security_level.xml +++ b/app/src/main/res/layout/tor_onboarding_security_level.xml @@ -32,9 +32,18 @@ android:textAppearance="@style/Body14TextStyle" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/header_text" + app:layout_constraintTop_toBottomOf="@id/current_level" tools:text="@string/tor_onboarding_security_level_description" /> + + @@ -473,6 +476,13 @@ app:exitAnim="@anim/slide_out_left" app:popEnterAnim="@anim/slide_in_left" app:popExitAnim="@anim/slide_out_right" /> + Set your Security Level Disable certain web features that can be used to attack you, and harm your security, anonymity, and privacy. + Current Security Level: %s Open Security Settings Donate and keep Tor safe Tor is free to use because of donations from people like you. @@ -54,6 +55,10 @@ Restarting Bridges are enabled: %s + + Security Settings + Security Level + Standard All Tor Browser and website features are enabled. @@ -62,7 +67,4 @@ Safest Only allow website features required for static sites and basic services. These changes affect images, media, and scripts. - - Security Settings - Security Level diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index a31e1484d93b0fdfc4ccffdc05fb4887e6bcb873..9ca4c3d194c341929d62c3f2d74967fac8570213 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -90,6 +90,11 @@ app:iconSpaceReserved="false" android:layout="@layout/preference_category_main_style"> + +