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">
+
+