Pier Angelo Vendrame pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android
Commits:
-
48593938
by clairehurst at 2023-12-21T14:48:46-07:00
13 changed files:
- android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt
- android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/Settings.kt
- fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt
- fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
- fenix/app/src/main/java/org/mozilla/fenix/components/Core.kt
- fenix/app/src/main/java/org/mozilla/fenix/settings/TorNetworkSettingsFragment.kt
- + fenix/app/src/main/java/org/mozilla/fenix/tor/TorBetaConnectionFeaturesFragment.kt
- fenix/app/src/main/java/org/mozilla/fenix/tor/TorBootstrapFragment.kt
- fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
- + fenix/app/src/main/res/layout/tor_network_settings_beta_connection_features.xml
- fenix/app/src/main/res/navigation/nav_graph.xml
- fenix/app/src/main/res/values/preference_keys.xml
- fenix/app/src/main/res/xml/tor_network_settings_preferences.xml
Changes:
| ... | ... | @@ -799,6 +799,11 @@ class GeckoEngine( |
| 799 | 799 | override var prioritizeOnions: Boolean
|
| 800 | 800 | get() = runtime.settings.prioritizeOnions
|
| 801 | 801 | set(value) { runtime.settings.prioritizeOnions = value }
|
| 802 | + override var useNewBootstrap: Boolean
|
|
| 803 | + get() = runtime.settings.useNewBootstrap
|
|
| 804 | + set(value) {
|
|
| 805 | + runtime.settings.useNewBootstrap = value
|
|
| 806 | + }
|
|
| 802 | 807 | }.apply {
|
| 803 | 808 | defaultSettings?.let {
|
| 804 | 809 | this._javascript_Enabled = it._javascript_Enabled
|
| ... | ... | @@ -824,6 +829,7 @@ class GeckoEngine( |
| 824 | 829 | this.torSecurityLevel = it.torSecurityLevel
|
| 825 | 830 | this.spoofEnglish = it.spoofEnglish
|
| 826 | 831 | this.prioritizeOnions = it.prioritizeOnions
|
| 832 | + this.useNewBootstrap = it.useNewBootstrap
|
|
| 827 | 833 | }
|
| 828 | 834 | }
|
| 829 | 835 | |
| ... | ... | @@ -929,6 +935,8 @@ class GeckoEngine( |
| 929 | 935 | unBlockedBySmartBlock = this.blockingData.any { it.unBlockedBySmartBlock() },
|
| 930 | 936 | )
|
| 931 | 937 | }
|
| 938 | + |
|
| 939 | + fun getTorIntegrationController() = runtime.getTorIntegrationController()
|
|
| 932 | 940 | }
|
| 933 | 941 | |
| 934 | 942 | internal fun ContentBlockingController.LogEntry.BlockingData.hasBlockedCookies(): Boolean {
|
| ... | ... | @@ -214,6 +214,8 @@ abstract class Settings { |
| 214 | 214 | open var spoofEnglish: Boolean by UnsupportedSetting()
|
| 215 | 215 | |
| 216 | 216 | open var prioritizeOnions: Boolean by UnsupportedSetting()
|
| 217 | + |
|
| 218 | + open var useNewBootstrap: Boolean by UnsupportedSetting()
|
|
| 217 | 219 | }
|
| 218 | 220 | |
| 219 | 221 | /**
|
| ... | ... | @@ -259,6 +261,7 @@ data class DefaultSettings( |
| 259 | 261 | override var torSecurityLevel: Int = 4,
|
| 260 | 262 | override var spoofEnglish: Boolean = false,
|
| 261 | 263 | override var prioritizeOnions: Boolean = false,
|
| 264 | + override var useNewBootstrap: Boolean = false,
|
|
| 262 | 265 | ) : Settings()
|
| 263 | 266 | |
| 264 | 267 | class UnsupportedSetting<T> {
|
| ... | ... | @@ -164,6 +164,11 @@ import org.mozilla.fenix.utils.Settings |
| 164 | 164 | import java.lang.ref.WeakReference
|
| 165 | 165 | import java.util.Locale
|
| 166 | 166 | |
| 167 | +import androidx.navigation.fragment.findNavController
|
|
| 168 | +import mozilla.components.browser.engine.gecko.GeckoEngine
|
|
| 169 | +import mozilla.components.browser.state.selector.findCustomTab
|
|
| 170 | +import org.mozilla.geckoview.TorIntegrationAndroid
|
|
| 171 | + |
|
| 167 | 172 | /**
|
| 168 | 173 | * The main activity of the application. The application is primarily a single Activity (this one)
|
| 169 | 174 | * with fragments switching out to display different views. The most important views shown here are the:
|
| ... | ... | @@ -171,7 +176,7 @@ import java.util.Locale |
| 171 | 176 | * - browser screen
|
| 172 | 177 | */
|
| 173 | 178 | @SuppressWarnings("TooManyFunctions", "LargeClass", "LongParameterList", "LongMethod")
|
| 174 | -open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
|
|
| 179 | +open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity, TorIntegrationAndroid.BootstrapStateChangeListener {
|
|
| 175 | 180 | // DO NOT MOVE ANYTHING ABOVE THIS, GETTING INIT TIME IS CRITICAL
|
| 176 | 181 | // we need to store startup timestamp for warm startup. we cant directly store
|
| 177 | 182 | // inside AppStartupTelemetry since that class lives inside components and
|
| ... | ... | @@ -201,7 +206,7 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { |
| 201 | 206 | |
| 202 | 207 | private var inflater: LayoutInflater? = null
|
| 203 | 208 | |
| 204 | - private val navHost by lazy {
|
|
| 209 | + val navHost by lazy {
|
|
| 205 | 210 | supportFragmentManager.findFragmentById(R.id.container) as NavHostFragment
|
| 206 | 211 | }
|
| 207 | 212 | |
| ... | ... | @@ -396,6 +401,12 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { |
| 396 | 401 | |
| 397 | 402 | components.notificationsDelegate.bindToActivity(this)
|
| 398 | 403 | |
| 404 | + val engine = components.core.engine
|
|
| 405 | + if (engine is GeckoEngine) {
|
|
| 406 | + val torIntegration = engine.getTorIntegrationController()
|
|
| 407 | + torIntegration.registerBootstrapStateChangeListener(this)
|
|
| 408 | + }
|
|
| 409 | + |
|
| 399 | 410 | StartupTimeline.onActivityCreateEndHome(this) // DO NOT MOVE ANYTHING BELOW HERE.
|
| 400 | 411 | }
|
| 401 | 412 | |
| ... | ... | @@ -609,6 +620,12 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { |
| 609 | 620 | // underlying Application, as well.
|
| 610 | 621 | (application as FenixApplication).terminate()
|
| 611 | 622 | }
|
| 623 | + |
|
| 624 | + val engine = components.core.engine
|
|
| 625 | + if (engine is GeckoEngine) {
|
|
| 626 | + val torIntegration = engine.getTorIntegrationController()
|
|
| 627 | + torIntegration.unregisterBootstrapStateChangeListener(this)
|
|
| 628 | + }
|
|
| 612 | 629 | }
|
| 613 | 630 | |
| 614 | 631 | override fun onConfigurationChanged(newConfig: Configuration) {
|
| ... | ... | @@ -1163,7 +1180,20 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { |
| 1163 | 1180 | }
|
| 1164 | 1181 | |
| 1165 | 1182 | open fun navigateToHome() {
|
| 1166 | - navHost.navController.navigate(NavGraphDirections.actionStartupTorbootstrap())
|
|
| 1183 | + if (settings().useNewBootstrap) {
|
|
| 1184 | + if (settings().useNewBootstrapNativeUi) {
|
|
| 1185 | + navHost.navController.navigate(NavGraphDirections.actionStartupTorConnectionAssist())
|
|
| 1186 | + } else {
|
|
| 1187 | + navHost.navController.navigate(NavGraphDirections.actionStartupHome())
|
|
| 1188 | + openToBrowserAndLoad(
|
|
| 1189 | + searchTermOrURL = "about:torconnect",
|
|
| 1190 | + newTab = true,
|
|
| 1191 | + from = BrowserDirection.FromHome,
|
|
| 1192 | + )
|
|
| 1193 | + }
|
|
| 1194 | + } else {
|
|
| 1195 | + navHost.navController.navigate(NavGraphDirections.actionStartupTorbootstrap())
|
|
| 1196 | + }
|
|
| 1167 | 1197 | }
|
| 1168 | 1198 | |
| 1169 | 1199 | override fun attachBaseContext(base: Context) {
|
| ... | ... | @@ -1341,4 +1371,15 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { |
| 1341 | 1371 | // telemetry purposes.
|
| 1342 | 1372 | const val PWA_RECENTLY_USED_THRESHOLD = DateUtils.DAY_IN_MILLIS * 30L
|
| 1343 | 1373 | }
|
| 1374 | + |
|
| 1375 | + override fun onBootstrapStateChange(state: String) = Unit
|
|
| 1376 | + override fun onBootstrapProgress(progress: Double, status: String, hasWarnings: Boolean) = Unit
|
|
| 1377 | + override fun onBootstrapComplete() {
|
|
| 1378 | + components.useCases.tabsUseCases.removeAllTabs()
|
|
| 1379 | + navHost.navController.navigate(NavGraphDirections.actionStartupHome())
|
|
| 1380 | + }
|
|
| 1381 | + override fun onBootstrapError(message: String, details: String) = Unit
|
|
| 1382 | + override fun onSettingsRequested() {
|
|
| 1383 | + navHost.navController.navigate(NavGraphDirections.actionGlobalSettingsFragment())
|
|
| 1384 | + }
|
|
| 1344 | 1385 | } |
| ... | ... | @@ -1189,6 +1189,9 @@ abstract class BaseBrowserFragment : |
| 1189 | 1189 | val context = requireContext()
|
| 1190 | 1190 | resumeDownloadDialogState(selectedTab.id, context.components.core.store, context, toolbarHeight)
|
| 1191 | 1191 | it.announceForAccessibility(selectedTab.toDisplayTitle())
|
| 1192 | + if (getCurrentTab()?.content?.url == "about:torconnect") {
|
|
| 1193 | + browserToolbarView.view.visibility = View.GONE
|
|
| 1194 | + }
|
|
| 1192 | 1195 | }
|
| 1193 | 1196 | } else {
|
| 1194 | 1197 | view?.let { view -> initializeUI(view) }
|
| ... | ... | @@ -1206,6 +1209,24 @@ abstract class BaseBrowserFragment : |
| 1206 | 1209 | components.useCases.sessionUseCases.reload()
|
| 1207 | 1210 | }
|
| 1208 | 1211 | hideToolbar()
|
| 1212 | + handleBetaHtmlTorConnect()
|
|
| 1213 | + }
|
|
| 1214 | + |
|
| 1215 | + private fun handleBetaHtmlTorConnect() {
|
|
| 1216 | + if (getCurrentTab()?.content?.url == "about:torconnect") {
|
|
| 1217 | + if (!requireActivity().settings().useNewBootstrap) {
|
|
| 1218 | + requireContext().components.useCases.tabsUseCases.removeAllTabs()
|
|
| 1219 | + (requireActivity() as HomeActivity).navHost.navController.navigate(
|
|
| 1220 | + NavGraphDirections.actionStartupTorbootstrap(),
|
|
| 1221 | + )
|
|
| 1222 | + } else if (!requireActivity().settings().useNewBootstrapHtmlUi) {
|
|
| 1223 | + requireContext().components.useCases.tabsUseCases.removeAllTabs()
|
|
| 1224 | + (requireActivity() as HomeActivity).navigateToHome()
|
|
| 1225 | + } else {
|
|
| 1226 | + // This just makes it not flash (be visible for a split second) before handleTabSelected() hides it again
|
|
| 1227 | + browserToolbarView.view.visibility = View.GONE
|
|
| 1228 | + }
|
|
| 1229 | + }
|
|
| 1209 | 1230 | }
|
| 1210 | 1231 | |
| 1211 | 1232 | @CallSuper
|
| ... | ... | @@ -146,6 +146,7 @@ class Core( |
| 146 | 146 | torSecurityLevel = context.settings().torSecurityLevel().intRepresentation,
|
| 147 | 147 | spoofEnglish = context.settings().spoofEnglish,
|
| 148 | 148 | prioritizeOnions = context.settings().prioritizeOnions,
|
| 149 | + useNewBootstrap = context.settings().useNewBootstrap,
|
|
| 149 | 150 | )
|
| 150 | 151 | |
| 151 | 152 | GeckoEngine(
|
| ... | ... | @@ -76,6 +76,15 @@ class TorNetworkSettingsFragment : PreferenceFragmentCompat(), TorEvents { |
| 76 | 76 | }
|
| 77 | 77 | }
|
| 78 | 78 | |
| 79 | + requirePreference<Preference>(R.string.pref_key_use_new_bootstrap).apply {
|
|
| 80 | + setOnPreferenceClickListener {
|
|
| 81 | + val directions =
|
|
| 82 | + TorNetworkSettingsFragmentDirections.actionTorNetworkSettingsFragmentToBetaConnectionFeaturesFragment()
|
|
| 83 | + requireView().findNavController().navigate(directions)
|
|
| 84 | + true
|
|
| 85 | + }
|
|
| 86 | + }
|
|
| 87 | + |
|
| 79 | 88 | setStatus()
|
| 80 | 89 | }
|
| 81 | 90 |
| 1 | +/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
| 2 | + * License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
| 3 | + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
| 4 | + |
|
| 5 | +package org.mozilla.fenix.tor
|
|
| 6 | + |
|
| 7 | +import android.os.Bundle
|
|
| 8 | +import android.view.LayoutInflater
|
|
| 9 | +import android.view.View
|
|
| 10 | +import android.view.ViewGroup
|
|
| 11 | +import androidx.core.view.children
|
|
| 12 | +import androidx.fragment.app.Fragment
|
|
| 13 | +import org.mozilla.fenix.databinding.TorNetworkSettingsBetaConnectionFeaturesBinding
|
|
| 14 | +import org.mozilla.fenix.ext.components
|
|
| 15 | +import org.mozilla.fenix.ext.settings
|
|
| 16 | + |
|
| 17 | +/**
|
|
| 18 | + * Lets the user customize beta connection features mode.
|
|
| 19 | + */
|
|
| 20 | +class TorBetaConnectionFeaturesFragment : Fragment() {
|
|
| 21 | + override fun onCreateView(
|
|
| 22 | + inflater: LayoutInflater,
|
|
| 23 | + container: ViewGroup?,
|
|
| 24 | + savedInstanceState: Bundle?,
|
|
| 25 | + ): View {
|
|
| 26 | + val binding = TorNetworkSettingsBetaConnectionFeaturesBinding.inflate(inflater)
|
|
| 27 | + |
|
| 28 | + binding.enableBetaConnectionFeaturesSwitch.run {
|
|
| 29 | + isChecked = context.settings().useNewBootstrap
|
|
| 30 | + setConnectionAssistUI(binding, isChecked)
|
|
| 31 | + |
|
| 32 | + setOnCheckedChangeListener { _, isConnectionAssistEnabled ->
|
|
| 33 | + context.settings().useNewBootstrap = isConnectionAssistEnabled
|
|
| 34 | + setConnectionAssistUI(binding, isConnectionAssistEnabled)
|
|
| 35 | + updateEngineConnectionAssistMode()
|
|
| 36 | + }
|
|
| 37 | + }
|
|
| 38 | + |
|
| 39 | + // Since the beta connection features modes are in a RadioGroup we only need one listener to know of all their changes.
|
|
| 40 | + binding.useNewBootstrapWithNativeUiRadioButton.setOnCheckedChangeListener { _, _ ->
|
|
| 41 | + updateEngineConnectionAssistMode()
|
|
| 42 | + }
|
|
| 43 | + |
|
| 44 | + return binding.root
|
|
| 45 | + }
|
|
| 46 | + |
|
| 47 | + private fun setConnectionAssistUI(
|
|
| 48 | + binding: TorNetworkSettingsBetaConnectionFeaturesBinding,
|
|
| 49 | + isBetaConnectionAssistEnabled: Boolean,
|
|
| 50 | + ) {
|
|
| 51 | + if (!isBetaConnectionAssistEnabled) {
|
|
| 52 | + binding.enableBetaConnectionFeaturesModes.apply {
|
|
| 53 | + clearCheck()
|
|
| 54 | + children.forEach { it.isEnabled = false }
|
|
| 55 | + }
|
|
| 56 | + } else {
|
|
| 57 | + // Do not enable the native UI until it is actually available.
|
|
| 58 | + // binding.enableBetaConnectionFeaturesModes.children.forEach { it.isEnabled = true }
|
|
| 59 | + binding.useNewBootstrapWithHtmlUiRadioButton.isEnabled = true
|
|
| 60 | + binding.useNewBootstrapWithNativeUiRadioButton.isEnabled = false
|
|
| 61 | + }
|
|
| 62 | + }
|
|
| 63 | + |
|
| 64 | + private fun updateEngineConnectionAssistMode() {
|
|
| 65 | + requireContext().components.core.engine.settings.useNewBootstrap =
|
|
| 66 | + requireContext().settings().useNewBootstrap
|
|
| 67 | + }
|
|
| 68 | + |
|
| 69 | +} |
| ... | ... | @@ -20,8 +20,10 @@ import org.mozilla.fenix.tor.interactor.DefaultTorBootstrapInteractor |
| 20 | 20 | import org.mozilla.fenix.tor.interactor.TorBootstrapInteractor
|
| 21 | 21 | import androidx.navigation.fragment.findNavController
|
| 22 | 22 | import com.google.android.material.appbar.AppBarLayout
|
| 23 | +import org.mozilla.fenix.HomeActivity
|
|
| 23 | 24 | import org.mozilla.fenix.ext.components
|
| 24 | 25 | import org.mozilla.fenix.ext.hideToolbar
|
| 26 | +import org.mozilla.fenix.ext.settings
|
|
| 25 | 27 | import org.mozilla.fenix.tor.controller.DefaultTorBootstrapController
|
| 26 | 28 | import org.mozilla.fenix.tor.view.TorBootstrapView
|
| 27 | 29 | |
| ... | ... | @@ -169,6 +171,9 @@ class TorBootstrapFragment : Fragment() { |
| 169 | 171 | // triggered to cause an automatic update on warm start (no tab selection occurs). So we
|
| 170 | 172 | // update it manually here.
|
| 171 | 173 | requireComponents.useCases.sessionUseCases.updateLastAccess()
|
| 174 | + if (requireContext().settings().useNewBootstrap){
|
|
| 175 | + (requireActivity() as HomeActivity).navigateToHome()
|
|
| 176 | + }
|
|
| 172 | 177 | }
|
| 173 | 178 | |
| 174 | 179 | private fun handleTorBootstrapConnect() {
|
| ... | ... | @@ -1859,4 +1859,19 @@ class Settings(private val appContext: Context) : PreferencesHolder { |
| 1859 | 1859 | * Indicates if the new Search settings UI is enabled.
|
| 1860 | 1860 | */
|
| 1861 | 1861 | var enableUnifiedSearchSettingsUI: Boolean = showUnifiedSearchFeature && FeatureFlags.unifiedSearchSettings
|
| 1862 | + |
|
| 1863 | + var useNewBootstrap by booleanPreference(
|
|
| 1864 | + appContext.getPreferenceKey(R.string.pref_key_use_new_bootstrap),
|
|
| 1865 | + default = false,
|
|
| 1866 | + )
|
|
| 1867 | + |
|
| 1868 | + var useNewBootstrapNativeUi by booleanPreference(
|
|
| 1869 | + appContext.getPreferenceKey(R.string.pref_key_use_new_bootstrap_with_android_native),
|
|
| 1870 | + default = false,
|
|
| 1871 | + )
|
|
| 1872 | + |
|
| 1873 | + var useNewBootstrapHtmlUi by booleanPreference(
|
|
| 1874 | + appContext.getPreferenceKey(R.string.pref_key_use_new_bootstrap_with_html),
|
|
| 1875 | + default = true
|
|
| 1876 | + )
|
|
| 1862 | 1877 | } |
| 1 | +<?xml version="1.0" encoding="utf-8"?><!-- This Source Code Form is subject to the terms of the Mozilla Public
|
|
| 2 | + - License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
| 3 | + - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
|
| 4 | +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
| 5 | + xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
| 6 | + android:layout_width="match_parent"
|
|
| 7 | + android:layout_height="wrap_content">
|
|
| 8 | + |
|
| 9 | + <TextView
|
|
| 10 | + android:id="@+id/enable_beta_connection_features_title"
|
|
| 11 | + android:layout_width="0dp"
|
|
| 12 | + android:layout_height="wrap_content"
|
|
| 13 | + android:layout_marginStart="16dp"
|
|
| 14 | + android:layout_marginTop="16dp"
|
|
| 15 | + android:layout_marginBottom="2dp"
|
|
| 16 | + android:clickable="false"
|
|
| 17 | + android:text="Enable beta connection features"
|
|
| 18 | + android:textAppearance="@style/ListItemTextStyle"
|
|
| 19 | + android:textSize="16sp"
|
|
| 20 | + app:layout_constraintBottom_toTopOf="@id/enable_beta_connection_features_summary"
|
|
| 21 | + app:layout_constraintEnd_toStartOf="@id/enable_beta_connection_features_switch"
|
|
| 22 | + app:layout_constraintStart_toStartOf="parent"
|
|
| 23 | + app:layout_constraintTop_toTopOf="parent"
|
|
| 24 | + app:lineHeight="24.sp" />
|
|
| 25 | + |
|
| 26 | + <TextView
|
|
| 27 | + android:id="@+id/enable_beta_connection_features_summary"
|
|
| 28 | + android:layout_width="0dp"
|
|
| 29 | + android:layout_height="wrap_content"
|
|
| 30 | + android:text="Help us test our new connection assist features which focuses on a streamlined connection with better integration with bridges"
|
|
| 31 | + android:textColor="?attr/textSecondary"
|
|
| 32 | + android:textColorLink="?attr/textSecondary"
|
|
| 33 | + android:textSize="12sp"
|
|
| 34 | + app:layout_constraintBottom_toTopOf="@id/enable_beta_connection_features_modes"
|
|
| 35 | + app:layout_constraintEnd_toEndOf="@id/enable_beta_connection_features_title"
|
|
| 36 | + app:layout_constraintStart_toStartOf="@id/enable_beta_connection_features_title"
|
|
| 37 | + app:layout_constraintTop_toBottomOf="@id/enable_beta_connection_features_title"
|
|
| 38 | + app:lineHeight="16.sp" />
|
|
| 39 | + |
|
| 40 | + <androidx.appcompat.widget.SwitchCompat
|
|
| 41 | + android:id="@+id/enable_beta_connection_features_switch"
|
|
| 42 | + android:layout_width="wrap_content"
|
|
| 43 | + android:layout_height="wrap_content"
|
|
| 44 | + android:minHeight="48dp"
|
|
| 45 | + android:paddingStart="18dp"
|
|
| 46 | + android:paddingEnd="18dp"
|
|
| 47 | + android:textColor="@color/state_list_text_color"
|
|
| 48 | + android:textOff="@string/studies_off"
|
|
| 49 | + android:textOn="@string/studies_on"
|
|
| 50 | + app:layout_constraintEnd_toEndOf="parent"
|
|
| 51 | + app:layout_constraintTop_toTopOf="@id/enable_beta_connection_features_title" />
|
|
| 52 | + |
|
| 53 | + <RadioGroup
|
|
| 54 | + android:id="@+id/enable_beta_connection_features_modes"
|
|
| 55 | + android:layout_width="match_parent"
|
|
| 56 | + android:layout_height="wrap_content"
|
|
| 57 | + android:layout_marginTop="10dp"
|
|
| 58 | + app:layout_constraintEnd_toEndOf="parent"
|
|
| 59 | + app:layout_constraintStart_toStartOf="parent"
|
|
| 60 | + app:layout_constraintTop_toBottomOf="@id/enable_beta_connection_features_summary">
|
|
| 61 | + |
|
| 62 | + <org.mozilla.fenix.settings.PreferenceBackedRadioButton
|
|
| 63 | + android:id="@+id/use_new_bootstrap_with_html_ui_radio_button"
|
|
| 64 | + android:layout_width="match_parent"
|
|
| 65 | + android:layout_height="wrap_content"
|
|
| 66 | + android:background="">"?android:attr/selectableItemBackground"
|
|
| 67 | + android:button="@null"
|
|
| 68 | + android:drawablePadding="@dimen/radio_button_preference_drawable_padding"
|
|
| 69 | + android:paddingStart="@dimen/radio_button_preference_horizontal"
|
|
| 70 | + android:paddingTop="@dimen/radio_button_preference_vertical"
|
|
| 71 | + android:paddingEnd="@dimen/radio_button_preference_horizontal"
|
|
| 72 | + android:paddingBottom="@dimen/radio_button_preference_vertical"
|
|
| 73 | + android:text="HTML UI"
|
|
| 74 | + android:textAppearance="?android:attr/textAppearanceListItem"
|
|
| 75 | + android:textSize="16sp"
|
|
| 76 | + app:drawableStartCompat="?android:attr/listChoiceIndicatorSingle"
|
|
| 77 | + app:preferenceKey="@string/pref_key_use_new_bootstrap_with_html"
|
|
| 78 | + app:preferenceKeyDefaultValue="true" />
|
|
| 79 | + |
|
| 80 | + <org.mozilla.fenix.settings.PreferenceBackedRadioButton
|
|
| 81 | + android:id="@+id/use_new_bootstrap_with_native_ui_radio_button"
|
|
| 82 | + android:layout_width="match_parent"
|
|
| 83 | + android:layout_height="48dp"
|
|
| 84 | + android:background="">"?android:attr/selectableItemBackground"
|
|
| 85 | + android:button="@null"
|
|
| 86 | + android:drawablePadding="@dimen/radio_button_preference_drawable_padding"
|
|
| 87 | + android:enabled="false"
|
|
| 88 | + android:paddingStart="@dimen/radio_button_preference_horizontal"
|
|
| 89 | + android:paddingTop="@dimen/radio_button_preference_vertical"
|
|
| 90 | + android:paddingEnd="@dimen/radio_button_preference_horizontal"
|
|
| 91 | + android:paddingBottom="@dimen/radio_button_preference_vertical"
|
|
| 92 | + android:text="Native Android UI"
|
|
| 93 | + android:textAppearance="?android:attr/textAppearanceListItem"
|
|
| 94 | + android:textSize="16sp"
|
|
| 95 | + app:drawableStartCompat="?android:attr/listChoiceIndicatorSingle"
|
|
| 96 | + app:preferenceKey="@string/pref_key_use_new_bootstrap_with_android_native"
|
|
| 97 | + app:preferenceKeyDefaultValue="false" />
|
|
| 98 | + </RadioGroup>
|
|
| 99 | + |
|
| 100 | +</androidx.constraintlayout.widget.ConstraintLayout> |
| ... | ... | @@ -27,6 +27,12 @@ |
| 27 | 27 | app:popUpTo="@id/startupFragment"
|
| 28 | 28 | app:popUpToInclusive="true" />
|
| 29 | 29 | |
| 30 | + <action
|
|
| 31 | + android:id="@+id/action_startup_tor_connection_assist"
|
|
| 32 | + app:destination="@+id/torConnectionAssistFragment"
|
|
| 33 | + app:popUpTo="@id/startupFragment"
|
|
| 34 | + app:popUpToInclusive="true" />
|
|
| 35 | + |
|
| 30 | 36 | <action
|
| 31 | 37 | android:id="@+id/action_global_home"
|
| 32 | 38 | app:destination="@id/homeFragment"
|
| ... | ... | @@ -941,12 +947,25 @@ |
| 941 | 947 | app:exitAnim="@anim/slide_out_left"
|
| 942 | 948 | app:popEnterAnim="@anim/slide_in_left"
|
| 943 | 949 | app:popExitAnim="@anim/slide_out_right" />
|
| 950 | + <action
|
|
| 951 | + android:id="@+id/action_torNetworkSettingsFragment_to_BetaConnectionFeaturesFragment"
|
|
| 952 | + app:destination="@+id/torBetaConnectionFeaturesFragment"
|
|
| 953 | + app:enterAnim="@anim/slide_in_right"
|
|
| 954 | + app:exitAnim="@anim/slide_out_left"
|
|
| 955 | + app:popEnterAnim="@anim/slide_in_left"
|
|
| 956 | + app:popExitAnim="@anim/slide_out_right" />
|
|
| 944 | 957 | </fragment>
|
| 945 | 958 | <fragment
|
| 946 | 959 | android:id="@+id/torBridgeConfigFragment"
|
| 947 | 960 | android:name="org.mozilla.fenix.settings.TorBridgeConfigFragment"
|
| 948 | 961 | android:label="@string/preferences_tor_network_settings_bridge_config"
|
| 949 | 962 | tools:layout="@layout/fragment_tor_bridge_config" />
|
| 963 | + <fragment
|
|
| 964 | + android:id="@+id/torBetaConnectionFeaturesFragment"
|
|
| 965 | + android:name="org.mozilla.fenix.tor.TorBetaConnectionFeaturesFragment"
|
|
| 966 | + android:label="Enable beta connection features"
|
|
| 967 | + tools:layout="@layout/tor_network_settings_beta_connection_features" />
|
|
| 968 | + |
|
| 950 | 969 | <fragment
|
| 951 | 970 | android:id="@+id/trackingProtectionFragment"
|
| 952 | 971 | android:name="org.mozilla.fenix.settings.TrackingProtectionFragment">
|
| ... | ... | @@ -376,6 +376,9 @@ |
| 376 | 376 | <string name="pref_key_tor_network_settings" translatable="false">pref_key_tor_network_settings</string>
|
| 377 | 377 | <string name="pref_key_tor_network_settings_explanation" translatable="false">pref_key_tor_network_settings_explanation</string>
|
| 378 | 378 | <string name="pref_key_tor_network_settings_bridge_config" translatable="false">pref_key_tor_network_settings_bridge_config</string>
|
| 379 | + <string name="pref_key_use_new_bootstrap" translatable="false">pref_key_use_new_bootstrap</string>
|
|
| 380 | + <string name="pref_key_use_new_bootstrap_with_android_native" translatable="false">pref_key_use_new_bootstrap_with_android_native</string>
|
|
| 381 | + <string name="pref_key_use_new_bootstrap_with_html" translatable="false">pref_key_use_new_bootstrap_with_html</string>
|
|
| 379 | 382 | <string name="pref_key_tor_network_settings_bridge_config_explanation" translatable="false">pref_key_tor_network_settings_bridge_config_explanation</string>
|
| 380 | 383 | <string name="pref_key_tor_network_settings_bridge_config_toggle" translatable="false">pref_key_tor_network_settings_bridge_config_toggle</string>
|
| 381 | 384 | <string name="pref_key_tor_network_settings_bridge_config_builtin_bridge_obfs4" translatable="false">pref_key_tor_network_settings_bridge_config_builtin_bridge_obfs4</string>
|
| ... | ... | @@ -27,4 +27,9 @@ |
| 27 | 27 | android:title="@string/preferences_tor_network_settings_bridge_config"
|
| 28 | 28 | android:summary="@string/preferences_tor_network_settings_bridge_config_description"
|
| 29 | 29 | app:allowDividerAbove="true" />
|
| 30 | + <Preference
|
|
| 31 | + android:key="@string/pref_key_use_new_bootstrap"
|
|
| 32 | + android:title="Enable beta connection features"
|
|
| 33 | + app:allowDividerAbove="true" />
|
|
| 34 | + |
|
| 30 | 35 | </androidx.preference.PreferenceScreen> |