| 
Commits:
13 changed files:
Changes:
fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt
 
| ... | ... | @@ -61,6 +61,8 @@ import org.mozilla.fenix.ext.showToolbar |  
| 61 | 61 |  import org.mozilla.fenix.nimbus.FxNimbus
 |  
| 62 | 62 |  import org.mozilla.fenix.perf.ProfilerViewModel
 |  
| 63 | 63 |  import org.mozilla.fenix.settings.account.AccountUiView
 |  
|  | 64 | +import org.mozilla.fenix.tor.TorBridgeTransportConfig
 |  
|  | 65 | +import org.mozilla.fenix.tor.TorEvents
 |  
| 64 | 66 |  import org.mozilla.fenix.utils.Settings
 |  
| 65 | 67 |  import kotlin.system.exitProcess
 |  
| 66 | 68 |  
 |  
| ... | ... | @@ -155,6 +157,8 @@ class SettingsFragment : PreferenceFragmentCompat() { |  
| 155 | 157 |      }
 |  
| 156 | 158 |  
 |  
| 157 | 159 |      override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
 |  
|  | 160 | +        //setPreferencesFromResource(R.xml.tor_network_settings_preferences, rootKey)
 |  
|  | 161 | +        //setupConnectionPreferences()
 |  
| 158 | 162 |          setPreferencesFromResource(R.xml.preferences, rootKey)
 |  
| 159 | 163 |      }
 |  
| 160 | 164 |  
 |  
| ... | ... | @@ -178,7 +182,10 @@ class SettingsFragment : PreferenceFragmentCompat() { |  
| 178 | 182 |          update(shouldUpdateAccountUIState = !creatingFragment)
 |  
| 179 | 183 |  
 |  
| 180 | 184 |          requireView().findViewById<RecyclerView>(R.id.recycler_view)
 |  
| 181 |  | -            ?.hideInitialScrollBar(viewLifecycleOwner.lifecycleScope)
 |  
|  | 185 | +            .also {
 |  
|  | 186 | +                it?.hideInitialScrollBar(viewLifecycleOwner.lifecycleScope)
 |  
|  | 187 | +                it?.disableHidingAnimation()
 |  
|  | 188 | +            }
 |  
| 182 | 189 |  
 |  
| 183 | 190 |          if (args.preferenceToScrollTo != null) {
 |  
| 184 | 191 |              scrollToPreference(args.preferenceToScrollTo)
 |  
| ... | ... | @@ -277,9 +284,6 @@ class SettingsFragment : PreferenceFragmentCompat() { |  
| 277 | 284 |              resources.getString(R.string.pref_key_search_settings) -> {
 |  
| 278 | 285 |                  SettingsFragmentDirections.actionSettingsFragmentToSearchEngineFragment()
 |  
| 279 | 286 |              }
 |  
| 280 |  | -            resources.getString(R.string.pref_key_tor_network_settings) -> {
 |  
| 281 |  | -                SettingsFragmentDirections.actionSettingsFragmentToTorNetworkSettingsFragment()
 |  
| 282 |  | -            }
 |  
| 283 | 287 |              resources.getString(R.string.pref_key_tor_security_level_settings) -> {
 |  
| 284 | 288 |                  SettingsFragmentDirections.actionSettingsFragmentToTorSecurityLevelFragment()
 |  
| 285 | 289 |              }
 |  
| ... | ... | @@ -523,6 +527,7 @@ class SettingsFragment : PreferenceFragmentCompat() { |  
| 523 | 527 |              preferenceStartProfiler?.isVisible = showSecretDebugMenuThisSession &&
 |  
| 524 | 528 |                  (requireContext().components.core.engine.profiler?.isProfilerActive() != null)
 |  
| 525 | 529 |          }
 |  
|  | 530 | +
 |  
| 526 | 531 |          setupCookieBannerPreference()
 |  
| 527 | 532 |          setupAmoCollectionOverridePreference(requireContext().settings())
 |  
| 528 | 533 |          setupGeckoLogsPreference(requireContext().settings())
 |  
| ... | ... | @@ -532,6 +537,7 @@ class SettingsFragment : PreferenceFragmentCompat() { |  
| 532 | 537 |          setupSearchPreference()
 |  
| 533 | 538 |          setupHomepagePreference()
 |  
| 534 | 539 |          setupTrackingProtectionPreference()
 |  
|  | 540 | +        setupConnectionPreferences()
 |  
| 535 | 541 |      }
 |  
| 536 | 542 |  
 |  
| 537 | 543 |      /**
 |  
| ... | ... | @@ -566,6 +572,10 @@ class SettingsFragment : PreferenceFragmentCompat() { |  
| 566 | 572 |          }
 |  
| 567 | 573 |      }
 |  
| 568 | 574 |  
 |  
|  | 575 | +    private fun RecyclerView.disableHidingAnimation() {
 |  
|  | 576 | +        this.setItemAnimator(null)
 |  
|  | 577 | +        this.setLayoutAnimation(null)
 |  
|  | 578 | +    }
 |  
| 569 | 579 |      private fun updateFxAAllowDomesticChinaServerMenu() {
 |  
| 570 | 580 |          val settings = requireContext().settings()
 |  
| 571 | 581 |          val preferenceAllowDomesticChinaServer =
 |  
| ... | ... | @@ -705,6 +715,39 @@ class SettingsFragment : PreferenceFragmentCompat() { |  
| 705 | 715 |          }
 |  
| 706 | 716 |      }
 |  
| 707 | 717 |  
 |  
|  | 718 | +    internal fun setupConnectionPreferences() {
 |  
|  | 719 | +        // will be needed for phase2
 |  
|  | 720 | +        //val torController = requireContext().components.torController
 |  
|  | 721 | +
 |  
|  | 722 | +        requirePreference<Preference>(R.string.pref_key_tor_network_settings_bridge_config).apply {
 |  
|  | 723 | +            setOnPreferenceClickListener {
 |  
|  | 724 | +                val directions =
 |  
|  | 725 | +                    SettingsFragmentDirections
 |  
|  | 726 | +                        .actionSettingsFragmentToTorBridgeConfigFragment()
 |  
|  | 727 | +                requireView().findNavController().navigate(directions)
 |  
|  | 728 | +                true
 |  
|  | 729 | +            }
 |  
|  | 730 | +        }
 |  
|  | 731 | +
 |  
|  | 732 | +        requirePreference<Preference>(R.string.pref_key_use_new_bootstrap).apply {
 |  
|  | 733 | +            setOnPreferenceClickListener {
 |  
|  | 734 | +                val directions =
 |  
|  | 735 | +                    SettingsFragmentDirections.actionSettingsFragmentToBetaConnectionFeaturesFragment()
 |  
|  | 736 | +                requireView().findNavController().navigate(directions)
 |  
|  | 737 | +                true
 |  
|  | 738 | +            }
 |  
|  | 739 | +        }
 |  
|  | 740 | +
 |  
|  | 741 | +        requirePreference<Preference>(R.string.pref_key_tor_logs).apply {
 |  
|  | 742 | +            setOnPreferenceClickListener {
 |  
|  | 743 | +                val directions =
 |  
|  | 744 | +                    SettingsFragmentDirections.actionSettingsFragmentToTorLogsFragment()
 |  
|  | 745 | +                requireView().findNavController().navigate(directions)
 |  
|  | 746 | +                true
 |  
|  | 747 | +            }
 |  
|  | 748 | +        }
 |  
|  | 749 | +    }
 |  
|  | 750 | +
 |  
| 708 | 751 |      @VisibleForTesting
 |  
| 709 | 752 |      internal fun setupCookieBannerPreference() {
 |  
| 710 | 753 |          with(requirePreference<Preference>(R.string.pref_key_cookie_banner_settings)) {
 |  fenix/app/src/main/java/org/mozilla/fenix/settings/TorNetworkSettingsFragment.kt
deleted
 
 
| 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.settings
 |  
| 6 |  | -
 |  
| 7 |  | -import android.os.Bundle
 |  
| 8 |  | -import androidx.navigation.findNavController
 |  
| 9 |  | -import androidx.preference.Preference
 |  
| 10 |  | -import androidx.preference.PreferenceFragmentCompat
 |  
| 11 |  | -import org.mozilla.fenix.R
 |  
| 12 |  | -import org.mozilla.fenix.ext.components
 |  
| 13 |  | -import org.mozilla.fenix.ext.nav
 |  
| 14 |  | -import org.mozilla.fenix.ext.settings
 |  
| 15 |  | -import org.mozilla.fenix.ext.showToolbar
 |  
| 16 |  | -import org.mozilla.fenix.tor.TorBridgeTransportConfig
 |  
| 17 |  | -import org.mozilla.fenix.tor.TorEvents
 |  
| 18 |  | -
 |  
| 19 |  | -/**
 |  
| 20 |  | - * Lets the user configure Tor network connection settings
 |  
| 21 |  | - */
 |  
| 22 |  | -class TorNetworkSettingsFragment : PreferenceFragmentCompat(), TorEvents {
 |  
| 23 |  | -    override fun onResume() {
 |  
| 24 |  | -        super.onResume()
 |  
| 25 |  | -
 |  
| 26 |  | -        val torController = requireContext().components.torController
 |  
| 27 |  | -
 |  
| 28 |  | -        torController.registerTorListener(this)
 |  
| 29 |  | -
 |  
| 30 |  | -        showToolbar(getString(R.string.preferences_tor_network_settings))
 |  
| 31 |  | -
 |  
| 32 |  | -        val yesString = getString(R.string.preferences_tor_network_settings_yes)
 |  
| 33 |  | -        val noString = getString(R.string.preferences_tor_network_settings_no)
 |  
| 34 |  | -
 |  
| 35 |  | -        requirePreference<Preference>(R.string.pref_key_tor_network_settings_bridge_config).apply {
 |  
| 36 |  | -            setOnPreferenceClickListener {
 |  
| 37 |  | -                val directions =
 |  
| 38 |  | -                    TorNetworkSettingsFragmentDirections
 |  
| 39 |  | -                        .actionTorNetworkSettingsFragmentToTorBridgeConfigFragment()
 |  
| 40 |  | -                requireView().findNavController().navigate(directions)
 |  
| 41 |  | -                true
 |  
| 42 |  | -            }
 |  
| 43 |  | -
 |  
| 44 |  | -            if (torController.bridgesEnabled) {
 |  
| 45 |  | -                if (torController.bridgeTransport == TorBridgeTransportConfig.USER_PROVIDED) {
 |  
| 46 |  | -                    summary =
 |  
| 47 |  | -                        getString(
 |  
| 48 |  | -                            R
 |  
| 49 |  | -                            .string
 |  
| 50 |  | -                            .preferences_tor_network_settings_bridge_config_description_user_provided_enabled
 |  
| 51 |  | -                        )
 |  
| 52 |  | -                } else {
 |  
| 53 |  | -                    summary =
 |  
| 54 |  | -                        getString(
 |  
| 55 |  | -                            R
 |  
| 56 |  | -                            .string
 |  
| 57 |  | -                            .preferences_tor_network_settings_bridge_config_description_builtin_transport_enabled
 |  
| 58 |  | -                        )
 |  
| 59 |  | -                }
 |  
| 60 |  | -            } else {
 |  
| 61 |  | -                summary =
 |  
| 62 |  | -                    getString(
 |  
| 63 |  | -                        R
 |  
| 64 |  | -                        .string
 |  
| 65 |  | -                        .preferences_tor_network_settings_bridge_config_description
 |  
| 66 |  | -                    )
 |  
| 67 |  | -            }
 |  
| 68 |  | -        }
 |  
| 69 |  | -
 |  
| 70 |  | -        requirePreference<Preference>(R.string.pref_key_tor_network_settings_bridges_enabled).apply {
 |  
| 71 |  | -            val formatStringRes = R.string.preferences_tor_network_settings_bridges_enabled
 |  
| 72 |  | -            title = if (torController.bridgesEnabled) {
 |  
| 73 |  | -                getString(formatStringRes, yesString)
 |  
| 74 |  | -            } else {
 |  
| 75 |  | -                getString(formatStringRes, noString)
 |  
| 76 |  | -            }
 |  
| 77 |  | -        }
 |  
| 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 |  | -
 |  
| 88 |  | -        setStatus()
 |  
| 89 |  | -    }
 |  
| 90 |  | -
 |  
| 91 |  | -    private fun setStatus() {
 |  
| 92 |  | -        val torController = requireContext().components.torController
 |  
| 93 |  | -        val yesString = getString(R.string.preferences_tor_network_settings_yes)
 |  
| 94 |  | -        val noString = getString(R.string.preferences_tor_network_settings_no)
 |  
| 95 |  | -
 |  
| 96 |  | -        requirePreference<Preference>(R.string.pref_key_tor_network_settings_tor_ready).apply {
 |  
| 97 |  | -            val formatStringRes = R.string.preferences_tor_network_settings_tor_ready
 |  
| 98 |  | -            @SuppressWarnings("ComplexCondition")
 |  
| 99 |  | -            title = if (!torController.isStarting &&
 |  
| 100 |  | -                torController.isConnected &&
 |  
| 101 |  | -                torController.isBootstrapped &&
 |  
| 102 |  | -                !torController.isRestarting) {
 |  
| 103 |  | -                getString(formatStringRes, yesString)
 |  
| 104 |  | -            } else {
 |  
| 105 |  | -                getString(formatStringRes, noString)
 |  
| 106 |  | -            }
 |  
| 107 |  | -        }
 |  
| 108 |  | -
 |  
| 109 |  | -        requirePreference<Preference>(R.string.pref_key_tor_network_settings_state).apply {
 |  
| 110 |  | -            val formatStringRes = R.string.preferences_tor_network_settings_state
 |  
| 111 |  | -
 |  
| 112 |  | -            title = if (torController.isRestarting) {
 |  
| 113 |  | -                getString(formatStringRes,
 |  
| 114 |  | -                    getString(
 |  
| 115 |  | -                        R
 |  
| 116 |  | -                        .string
 |  
| 117 |  | -                        .preferences_tor_network_settings_restarting
 |  
| 118 |  | -                    )
 |  
| 119 |  | -                )
 |  
| 120 |  | -            } else if (torController.isStarting) {
 |  
| 121 |  | -                getString(formatStringRes,
 |  
| 122 |  | -                    getString(
 |  
| 123 |  | -                        R
 |  
| 124 |  | -                        .string
 |  
| 125 |  | -                        .preferences_tor_network_settings_connecting
 |  
| 126 |  | -                    )
 |  
| 127 |  | -                )
 |  
| 128 |  | -            } else if (torController.isConnected) {
 |  
| 129 |  | -                getString(formatStringRes,
 |  
| 130 |  | -                    getString(
 |  
| 131 |  | -                        R
 |  
| 132 |  | -                        .string
 |  
| 133 |  | -                        .preferences_tor_network_settings_connected
 |  
| 134 |  | -                    )
 |  
| 135 |  | -                )
 |  
| 136 |  | -            } else {
 |  
| 137 |  | -                getString(formatStringRes,
 |  
| 138 |  | -                    getString(
 |  
| 139 |  | -                        R
 |  
| 140 |  | -                        .string
 |  
| 141 |  | -                        .preferences_tor_network_settings_disconnected
 |  
| 142 |  | -                    )
 |  
| 143 |  | -                )
 |  
| 144 |  | -            }
 |  
| 145 |  | -        }
 |  
| 146 |  | -    }
 |  
| 147 |  | -
 |  
| 148 |  | -    override fun onStop() {
 |  
| 149 |  | -        super.onStop()
 |  
| 150 |  | -        requireContext().components.torController.unregisterTorListener(this)
 |  
| 151 |  | -    }
 |  
| 152 |  | -
 |  
| 153 |  | -    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
 |  
| 154 |  | -        setPreferencesFromResource(R.xml.tor_network_settings_preferences, rootKey)
 |  
| 155 |  | -    }
 |  
| 156 |  | -
 |  
| 157 |  | -    @SuppressWarnings("EmptyFunctionBlock")
 |  
| 158 |  | -    override fun onTorConnecting() {
 |  
| 159 |  | -    }
 |  
| 160 |  | -
 |  
| 161 |  | -    @SuppressWarnings("EmptyFunctionBlock")
 |  
| 162 |  | -    override fun onTorConnected() {
 |  
| 163 |  | -    }
 |  
| 164 |  | -
 |  
| 165 |  | -    @SuppressWarnings("EmptyFunctionBlock")
 |  
| 166 |  | -    override fun onTorStopped() {
 |  
| 167 |  | -    }
 |  
| 168 |  | -
 |  
| 169 |  | -    override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) {
 |  
| 170 |  | -        setStatus()
 |  
| 171 |  | -    }
 |  
| 172 |  | -} |  fenix/app/src/main/java/org/mozilla/fenix/tor/TorBootstrapFragment.kt
 
 
| ... | ... | @@ -19,6 +19,7 @@ import org.mozilla.fenix.tor.interactor.TorBootstrapInteractor |  
| 19 | 19 |  import androidx.navigation.fragment.findNavController
 |  
| 20 | 20 |  import com.google.android.material.appbar.AppBarLayout
 |  
| 21 | 21 |  import org.mozilla.fenix.HomeActivity
 |  
|  | 22 | +import org.mozilla.fenix.R
 |  
| 22 | 23 |  import org.mozilla.fenix.ext.components
 |  
| 23 | 24 |  import org.mozilla.fenix.ext.hideToolbar
 |  
| 24 | 25 |  import org.mozilla.fenix.ext.settings
 |  
| ... | ... | @@ -182,7 +183,9 @@ class TorBootstrapFragment : Fragment() { |  
| 182 | 183 |  
 |  
| 183 | 184 |      private fun openTorNetworkSettings() {
 |  
| 184 | 185 |          val directions =
 |  
| 185 |  | -            TorBootstrapFragmentDirections.actionTorbootstrapFragmentToTorNetworkSettingsFragment()
 |  
|  | 186 | +            TorBootstrapFragmentDirections.actionTorbootstrapFragmentToSettingsFragment(
 |  
|  | 187 | +                requireContext().getString(R.string.pref_key_connection)
 |  
|  | 188 | +            )
 |  
| 186 | 189 |          findNavController().navigate(directions)
 |  
| 187 | 190 |      }
 |  
| 188 | 191 |  
 |  fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistFragment.kt
 
 
| ... | ... | @@ -147,7 +147,7 @@ class TorConnectionAssistFragment : Fragment() { |  
| 147 | 147 |              getString(R.string.connection_assist_configure_connection_button)
 |  
| 148 | 148 |          binding.torBootstrapButton2.setOnClickListener {
 |  
| 149 | 149 |              viewModel.cancelTorBootstrap()
 |  
| 150 |  | -            openTorNetworkSettings()
 |  
|  | 150 | +            openTorConnectionSettings()
 |  
| 151 | 151 |          }
 |  
| 152 | 152 |      }
 |  
| 153 | 153 |  
 |  
| ... | ... | @@ -235,7 +235,7 @@ class TorConnectionAssistFragment : Fragment() { |  
| 235 | 235 |          binding.torBootstrapButton2.text =
 |  
| 236 | 236 |              getString(R.string.connection_assist_configure_connection_button)
 |  
| 237 | 237 |          binding.torBootstrapButton2.setOnClickListener {
 |  
| 238 |  | -            openTorNetworkSettings()
 |  
|  | 238 | +            openTorConnectionSettings()
 |  
| 239 | 239 |          }
 |  
| 240 | 240 |      }
 |  
| 241 | 241 |  
 |  
| ... | ... | @@ -376,9 +376,11 @@ class TorConnectionAssistFragment : Fragment() { |  
| 376 | 376 |          )
 |  
| 377 | 377 |      }
 |  
| 378 | 378 |  
 |  
| 379 |  | -    private fun openTorNetworkSettings() {
 |  
|  | 379 | +    private fun openTorConnectionSettings() {
 |  
| 380 | 380 |          findNavController().navigate(
 |  
| 381 |  | -            TorConnectionAssistFragmentDirections.actionTorConnectionAssistFragmentToTorNetworkSettings(),
 |  
|  | 381 | +            TorConnectionAssistFragmentDirections.actionTorConnectionAssistFragmentToSettingsFragment(
 |  
|  | 382 | +                requireContext().getString(R.string.pref_key_connection)
 |  
|  | 383 | +            ),
 |  
| 382 | 384 |          )
 |  
| 383 | 385 |      }
 |  
| 384 | 386 |  } |  fenix/app/src/main/java/org/mozilla/fenix/tor/TorController.kt
 
 
| ... | ... | @@ -17,6 +17,10 @@ class TorError( |  
| 17 | 17 |      var details: String
 |  
| 18 | 18 |  ) { }
 |  
| 19 | 19 |  
 |  
|  | 20 | +interface TorLogs {
 |  
|  | 21 | +    fun onLog(type: String?, message: String?)
 |  
|  | 22 | +}
 |  
|  | 23 | +
 |  
| 20 | 24 |  internal enum class TorStatus(val status: String) {
 |  
| 21 | 25 |      OFF("OFF"),
 |  
| 22 | 26 |      STARTING("STARTING"),
 |  
| ... | ... | @@ -68,6 +72,9 @@ interface TorController: TorEvents { |  
| 68 | 72 |      fun registerTorListener(l: TorEvents)
 |  
| 69 | 73 |      fun unregisterTorListener(l: TorEvents)
 |  
| 70 | 74 |  
 |  
|  | 75 | +    fun registerTorLogListener(l: TorLogs)
 |  
|  | 76 | +    fun unregisterTorLogListener(l: TorLogs)
 |  
|  | 77 | +
 |  
| 71 | 78 |      fun initiateTorBootstrap(lifecycleScope: LifecycleCoroutineScope? = null, withDebugLogging: Boolean = false)
 |  
| 72 | 79 |      fun stopTor()
 |  
| 73 | 80 |      fun setTorStopped()
 |  fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerGV.kt
 
 
| ... | ... | @@ -8,6 +8,7 @@ import mozilla.components.browser.engine.gecko.GeckoEngine |  
| 8 | 8 |  import org.mozilla.fenix.ext.components
 |  
| 9 | 9 |  import org.mozilla.geckoview.TorIntegrationAndroid
 |  
| 10 | 10 |  import org.mozilla.geckoview.TorIntegrationAndroid.BootstrapStateChangeListener
 |  
|  | 11 | +import org.mozilla.geckoview.TorIntegrationAndroid.TorLogListener
 |  
| 11 | 12 |  import org.mozilla.geckoview.TorSettings
 |  
| 12 | 13 |  import org.mozilla.geckoview.TorSettings.BridgeBuiltinType
 |  
| 13 | 14 |  import org.mozilla.geckoview.TorSettings.BridgeSource
 |  
| ... | ... | @@ -46,11 +47,12 @@ internal enum class TorConnectState(val state: String) { |  
| 46 | 47 |  
 |  
| 47 | 48 |  class TorControllerGV(
 |  
| 48 | 49 |      private val context: Context,
 |  
| 49 |  | -) : TorController, TorEvents, BootstrapStateChangeListener {
 |  
|  | 50 | +) : TorController, TorEvents, BootstrapStateChangeListener, TorLogListener {
 |  
| 50 | 51 |  
 |  
| 51 | 52 |      private val TAG = "TorControllerGV"
 |  
| 52 | 53 |  
 |  
| 53 | 54 |      private var torListeners = mutableListOf<TorEvents>()
 |  
|  | 55 | +    private var torLogListeners = mutableListOf<TorLogs>()
 |  
| 54 | 56 |  
 |  
| 55 | 57 |      internal var lastKnownStatus = TorConnectState.Initial
 |  
| 56 | 58 |      internal var lastKnownError: TorError? = null
 |  
| ... | ... | @@ -146,10 +148,12 @@ class TorControllerGV( |  
| 146 | 148 |  
 |  
| 147 | 149 |      override fun start() {
 |  
| 148 | 150 |          getTorIntegration().registerBootstrapStateChangeListener(this)
 |  
|  | 151 | +        getTorIntegration().registerLogListener(this)
 |  
| 149 | 152 |      }
 |  
| 150 | 153 |  
 |  
| 151 | 154 |      override fun stop() {
 |  
| 152 | 155 |          getTorIntegration().unregisterBootstrapStateChangeListener(this)
 |  
|  | 156 | +        getTorIntegration().unregisterLogListener(this)
 |  
| 153 | 157 |      }
 |  
| 154 | 158 |  
 |  
| 155 | 159 |      // TorEvents
 |  
| ... | ... | @@ -180,6 +184,13 @@ class TorControllerGV( |  
| 180 | 184 |          }
 |  
| 181 | 185 |      }
 |  
| 182 | 186 |  
 |  
|  | 187 | +    override fun onLog(type: String?, message: String?) {
 |  
|  | 188 | +        synchronized(torLogListeners) {
 |  
|  | 189 | +            entries.add(Pair(type, message))
 |  
|  | 190 | +            torLogListeners.toList().forEach { it.onLog(type, message) }
 |  
|  | 191 | +        }
 |  
|  | 192 | +    }
 |  
|  | 193 | +
 |  
| 183 | 194 |      override fun registerTorListener(l: TorEvents) {
 |  
| 184 | 195 |          synchronized(torListeners) {
 |  
| 185 | 196 |              if (torListeners.contains(l)) {
 |  
| ... | ... | @@ -198,6 +209,23 @@ class TorControllerGV( |  
| 198 | 209 |          }
 |  
| 199 | 210 |      }
 |  
| 200 | 211 |  
 |  
|  | 212 | +    override fun registerTorLogListener(l: TorLogs) {
 |  
|  | 213 | +        synchronized(torLogListeners) {
 |  
|  | 214 | +            if (torLogListeners.contains(l)) {
 |  
|  | 215 | +                return
 |  
|  | 216 | +            }
 |  
|  | 217 | +            torLogListeners.add(l)
 |  
|  | 218 | +        }
 |  
|  | 219 | +    }
 |  
|  | 220 | +    override fun unregisterTorLogListener(l: TorLogs) {
 |  
|  | 221 | +        synchronized(torLogListeners) {
 |  
|  | 222 | +            if (!torLogListeners.contains(l)) {
 |  
|  | 223 | +                return
 |  
|  | 224 | +            }
 |  
|  | 225 | +            torLogListeners.remove(l)
 |  
|  | 226 | +        }
 |  
|  | 227 | +    }
 |  
|  | 228 | +
 |  
| 201 | 229 |      override fun initiateTorBootstrap(
 |  
| 202 | 230 |          lifecycleScope: LifecycleCoroutineScope?,
 |  
| 203 | 231 |          withDebugLogging: Boolean,
 |  
| ... | ... | @@ -284,7 +312,6 @@ class TorControllerGV( |  
| 284 | 312 |              onTorConnecting()
 |  
| 285 | 313 |  
 |  
| 286 | 314 |          }
 |  
| 287 |  | -        entries.add(Pair(status, lastKnownStatus.toTorStatus().status))
 |  
| 288 | 315 |          onTorStatusUpdate(status, lastKnownStatus.toTorStatus().status, progress)
 |  
| 289 | 316 |      }
 |  
| 290 | 317 |  
 |  fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerTAS.kt
 
 
| ... | ... | @@ -211,6 +211,9 @@ class TorControllerTAS (private val context: Context): TorController { |  
| 211 | 211 |          }
 |  
| 212 | 212 |      }
 |  
| 213 | 213 |  
 |  
|  | 214 | +    override fun registerTorLogListener(l: TorLogs) {}
 |  
|  | 215 | +    override fun unregisterTorLogListener(l: TorLogs) {}
 |  
|  | 216 | +
 |  
| 214 | 217 |      private fun handlePendingRegistrationChanges() {
 |  
| 215 | 218 |          pendingRegisterChangeList.forEach {
 |  
| 216 | 219 |              if (it.second) {
 |  fenix/app/src/main/java/org/mozilla/fenix/tor/TorLogsFragment.kt
 
 
|  | 1 | +package org.mozilla.fenix.tor
 |  
|  | 2 | +
 |  
|  | 3 | +import android.os.Bundle
 |  
|  | 4 | +import android.text.method.ScrollingMovementMethod
 |  
|  | 5 | +import android.view.LayoutInflater
 |  
|  | 6 | +import android.view.View
 |  
|  | 7 | +import android.view.ViewGroup
 |  
|  | 8 | +import androidx.fragment.app.Fragment
 |  
|  | 9 | +import org.mozilla.fenix.R
 |  
|  | 10 | +import org.mozilla.fenix.components.Components
 |  
|  | 11 | +import org.mozilla.fenix.databinding.FragmentHomeBinding
 |  
|  | 12 | +import org.mozilla.fenix.databinding.FragmentTorConnectionAssistBinding
 |  
|  | 13 | +import org.mozilla.fenix.databinding.TorBootstrapLoggerBinding
 |  
|  | 14 | +import org.mozilla.fenix.databinding.TorNetworkSettingsBetaConnectionFeaturesBinding
 |  
|  | 15 | +import org.mozilla.fenix.ext.components
 |  
|  | 16 | +import org.mozilla.fenix.ext.requireComponents
 |  
|  | 17 | +import org.mozilla.fenix.tor.view.TorBootstrapLoggerViewHolder
 |  
|  | 18 | +
 |  
|  | 19 | +class TorLogsFragment(): Fragment(), TorLogs {
 |  
|  | 20 | +
 |  
|  | 21 | +    private var entries = mutableListOf<String>()
 |  
|  | 22 | +    internal var _binding: TorBootstrapLoggerBinding? = null
 |  
|  | 23 | +    private val binding get() = _binding!!
 |  
|  | 24 | +
 |  
|  | 25 | +    private var _components: Components? = null
 |  
|  | 26 | +    private val components get() = _components!!
 |  
|  | 27 | +
 |  
|  | 28 | +    override fun onCreateView(
 |  
|  | 29 | +        inflater: LayoutInflater,
 |  
|  | 30 | +        container: ViewGroup?,
 |  
|  | 31 | +        savedInstanceState: Bundle?,
 |  
|  | 32 | +    ): View {
 |  
|  | 33 | +        _binding = TorBootstrapLoggerBinding.inflate(inflater)
 |  
|  | 34 | +        _components = requireComponents
 |  
|  | 35 | +
 |  
|  | 36 | +        components.torController.registerTorLogListener(this)
 |  
|  | 37 | +
 |  
|  | 38 | +        val currentEntries = components.torController.logEntries
 |  
|  | 39 | +            .filter { it.second != null }
 |  
|  | 40 | +            .filter { !(it.second!!.startsWith("Circuit") && it.first == "ON") }
 |  
|  | 41 | +            // Keep synchronized with format in onTorStatusUpdate
 |  
|  | 42 | +            .flatMap { listOf("(${it.first}) '${it.second}'") }
 |  
|  | 43 | +        val entriesLen = currentEntries.size
 |  
|  | 44 | +        val subListOffset = if (entriesLen > TorBootstrapLoggerViewHolder.MAX_NEW_ENTRIES) TorBootstrapLoggerViewHolder.MAX_NEW_ENTRIES else entriesLen
 |  
|  | 45 | +        entries = currentEntries.subList((entriesLen - subListOffset), entriesLen) as MutableList<String>
 |  
|  | 46 | +        val initLog = "---------------" + getString(R.string.tor_initializing_log) + "---------------"
 |  
|  | 47 | +        entries.add(0, initLog)
 |  
|  | 48 | +
 |  
|  | 49 | +        with(binding.torBootstrapLogEntries) {
 |  
|  | 50 | +            movementMethod = ScrollingMovementMethod()
 |  
|  | 51 | +            text = formatLogEntries(entries)
 |  
|  | 52 | +        }
 |  
|  | 53 | +
 |  
|  | 54 | +
 |  
|  | 55 | +        return binding.root
 |  
|  | 56 | +    }
 |  
|  | 57 | +
 |  
|  | 58 | +    // TODO on destroy unregiuster
 |  
|  | 59 | +
 |  
|  | 60 | +    private fun formatLogEntries(entries: List<String>) = entries.joinToString("\n")
 |  
|  | 61 | +
 |  
|  | 62 | +    override fun onLog(type: String?, message: String?) {
 |  
|  | 63 | +        if (message == null || type == null) return
 |  
|  | 64 | +        if (type == "ON" && type.startsWith("Circuit")) return
 |  
|  | 65 | +
 |  
|  | 66 | +        if (entries.size > TorBootstrapLoggerViewHolder.MAX_LINES) {
 |  
|  | 67 | +            entries = entries.drop(1) as MutableList<String>
 |  
|  | 68 | +        }
 |  
|  | 69 | +        entries.add("($type) '$message'")
 |  
|  | 70 | +
 |  
|  | 71 | +        binding.torBootstrapLogEntries.text = formatLogEntries(entries)
 |  
|  | 72 | +    }
 |  
|  | 73 | +
 |  
|  | 74 | +    override fun onStop() {
 |  
|  | 75 | +        super.onStop()
 |  
|  | 76 | +        components.torController.unregisterTorLogListener(this)
 |  
|  | 77 | +    }
 |  
|  | 78 | +
 |  
|  | 79 | +} |  fenix/app/src/main/res/navigation/nav_graph.xml
 
 
| ... | ... | @@ -239,13 +239,6 @@ |  
| 239 | 239 |              android:name="scrollToCollection"
 |  
| 240 | 240 |              android:defaultValue="false"
 |  
| 241 | 241 |              app:argType="boolean" />
 |  
| 242 |  | -        <action
 |  
| 243 |  | -            android:id="@+id/action_homeFragment_to_torNetworkSettingsFragment"
 |  
| 244 |  | -            app:destination="@id/torNetworkSettingsFragment"
 |  
| 245 |  | -            app:enterAnim="@anim/slide_in_right"
 |  
| 246 |  | -            app:exitAnim="@anim/slide_out_left"
 |  
| 247 |  | -            app:popEnterAnim="@anim/slide_in_left"
 |  
| 248 |  | -            app:popExitAnim="@anim/slide_out_right" />
 |  
| 249 | 242 |      </fragment>
 |  
| 250 | 243 |  
 |  
| 251 | 244 |      <fragment
 |  
| ... | ... | @@ -269,12 +262,13 @@ |  
| 269 | 262 |              app:popUpTo="@id/torbootstrapFragment"
 |  
| 270 | 263 |              app:popUpToInclusive="true" />
 |  
| 271 | 264 |          <action
 |  
| 272 |  | -            android:id="@+id/action_torbootstrapFragment_to_torNetworkSettingsFragment"
 |  
| 273 |  | -            app:destination="@id/torNetworkSettingsFragment"
 |  
|  | 265 | +            android:id="@+id/action_torbootstrapFragment_to_SettingsFragment"
 |  
|  | 266 | +            app:destination="@id/settingsFragment"
 |  
| 274 | 267 |              app:enterAnim="@anim/slide_in_right"
 |  
| 275 | 268 |              app:exitAnim="@anim/slide_out_left"
 |  
| 276 | 269 |              app:popEnterAnim="@anim/slide_in_left"
 |  
| 277 | 270 |              app:popExitAnim="@anim/slide_out_right" />
 |  
|  | 271 | +
 |  
| 278 | 272 |      </fragment>
 |  
| 279 | 273 |  
 |  
| 280 | 274 |      <fragment
 |  
| ... | ... | @@ -294,8 +288,8 @@ |  
| 294 | 288 |              app:popEnterAnim="@anim/slide_in_left"
 |  
| 295 | 289 |              app:popExitAnim="@anim/slide_out_right" />
 |  
| 296 | 290 |          <action
 |  
| 297 |  | -            android:id="@+id/action_torConnectionAssistFragment_to_TorNetworkSettings"
 |  
| 298 |  | -            app:destination="@id/torNetworkSettingsFragment"
 |  
|  | 291 | +            android:id="@+id/action_torConnectionAssistFragment_to_TorConnectionSettings"
 |  
|  | 292 | +            app:destination="@id/settingsFragment"
 |  
| 299 | 293 |              app:enterAnim="@anim/slide_in_right"
 |  
| 300 | 294 |              app:exitAnim="@anim/slide_out_left"
 |  
| 301 | 295 |              app:popEnterAnim="@anim/slide_in_left"
 |  
| ... | ... | @@ -702,8 +696,22 @@ |  
| 702 | 696 |              app:popEnterAnim="@anim/slide_in_left"
 |  
| 703 | 697 |              app:popExitAnim="@anim/slide_out_right" />
 |  
| 704 | 698 |          <action
 |  
| 705 |  | -            android:id="@+id/action_settingsFragment_to_torNetworkSettingsFragment"
 |  
| 706 |  | -            app:destination="@id/torNetworkSettingsFragment"
 |  
|  | 699 | +            android:id="@+id/action_settingsFragment_to_torBridgeConfigFragment"
 |  
|  | 700 | +            app:destination="@id/torBridgeConfigFragment"
 |  
|  | 701 | +            app:enterAnim="@anim/slide_in_right"
 |  
|  | 702 | +            app:exitAnim="@anim/slide_out_left"
 |  
|  | 703 | +            app:popEnterAnim="@anim/slide_in_left"
 |  
|  | 704 | +            app:popExitAnim="@anim/slide_out_right" />
 |  
|  | 705 | +        <action
 |  
|  | 706 | +            android:id="@+id/action_settingsFragment_to_torLogsFragment"
 |  
|  | 707 | +            app:destination="@+id/torLogsFragment"
 |  
|  | 708 | +            app:enterAnim="@anim/slide_in_right"
 |  
|  | 709 | +            app:exitAnim="@anim/slide_out_left"
 |  
|  | 710 | +            app:popEnterAnim="@anim/slide_in_left"
 |  
|  | 711 | +            app:popExitAnim="@anim/slide_out_right" />
 |  
|  | 712 | +        <action
 |  
|  | 713 | +            android:id="@+id/action_settingsFragment_to_BetaConnectionFeaturesFragment"
 |  
|  | 714 | +            app:destination="@+id/torBetaConnectionFeaturesFragment"
 |  
| 707 | 715 |              app:enterAnim="@anim/slide_in_right"
 |  
| 708 | 716 |              app:exitAnim="@anim/slide_out_left"
 |  
| 709 | 717 |              app:popEnterAnim="@anim/slide_in_left"
 |  
| ... | ... | @@ -965,24 +973,6 @@ |  
| 965 | 973 |          android:id="@+id/sponsoredStoriesSettings"
 |  
| 966 | 974 |          android:name="org.mozilla.fenix.settings.SponsoredStoriesSettingsFragment"
 |  
| 967 | 975 |          android:label="@string/preferences_debug_settings_custom_sponsored_stories_parameters" />
 |  
| 968 |  | -    <fragment
 |  
| 969 |  | -        android:id="@+id/torNetworkSettingsFragment"
 |  
| 970 |  | -        android:name="org.mozilla.fenix.settings.TorNetworkSettingsFragment">
 |  
| 971 |  | -        <action
 |  
| 972 |  | -            android:id="@+id/action_torNetworkSettingsFragment_to_torBridgeConfigFragment"
 |  
| 973 |  | -            app:destination="@id/torBridgeConfigFragment"
 |  
| 974 |  | -            app:enterAnim="@anim/slide_in_right"
 |  
| 975 |  | -            app:exitAnim="@anim/slide_out_left"
 |  
| 976 |  | -            app:popEnterAnim="@anim/slide_in_left"
 |  
| 977 |  | -            app:popExitAnim="@anim/slide_out_right" />
 |  
| 978 |  | -        <action
 |  
| 979 |  | -            android:id="@+id/action_torNetworkSettingsFragment_to_BetaConnectionFeaturesFragment"
 |  
| 980 |  | -            app:destination="@+id/torBetaConnectionFeaturesFragment"
 |  
| 981 |  | -            app:enterAnim="@anim/slide_in_right"
 |  
| 982 |  | -            app:exitAnim="@anim/slide_out_left"
 |  
| 983 |  | -            app:popEnterAnim="@anim/slide_in_left"
 |  
| 984 |  | -            app:popExitAnim="@anim/slide_out_right" />
 |  
| 985 |  | -    </fragment>
 |  
| 986 | 976 |      <fragment
 |  
| 987 | 977 |          android:id="@+id/torBridgeConfigFragment"
 |  
| 988 | 978 |          android:name="org.mozilla.fenix.settings.TorBridgeConfigFragment"
 |  
| ... | ... | @@ -993,6 +983,11 @@ |  
| 993 | 983 |          android:name="org.mozilla.fenix.tor.TorBetaConnectionFeaturesFragment"
 |  
| 994 | 984 |          android:label="Enable beta connection features"
 |  
| 995 | 985 |          tools:layout="@layout/tor_network_settings_beta_connection_features" />
 |  
|  | 986 | +    <fragment
 |  
|  | 987 | +        android:id="@+id/torLogsFragment"
 |  
|  | 988 | +        android:name="org.mozilla.fenix.tor.TorLogsFragment"
 |  
|  | 989 | +        android:label="Tor Logs"
 |  
|  | 990 | +        tools:layout="@layout/tor_bootstrap_logger" />
 |  
| 996 | 991 |  
 |  
| 997 | 992 |      <fragment
 |  
| 998 | 993 |          android:id="@+id/trackingProtectionFragment"
 |  fenix/app/src/main/res/values/preference_keys.xml
 
 
| ... | ... | @@ -14,6 +14,8 @@ |  
| 14 | 14 |      <string name="pref_key_accessibility" translatable="false">pref_key_accessibility</string>
 |  
| 15 | 15 |      <string name="pref_key_accessibility_auto_size" translatable="false">pref_key_accessibility_auto_size</string>
 |  
| 16 | 16 |      <string name="pref_key_accessibility_font_scale" translatable="false">pref_key_accessibility_font_scale</string>
 |  
|  | 17 | +    <string name="pref_key_privacy" translatable="false">pref_key_privacy</string>
 |  
|  | 18 | +    <string name="pref_key_connection" translatable="false">pref_key_connection</string>
 |  
| 17 | 19 |      <string name="pref_key_accessibility_force_enable_zoom" translatable="false">pref_key_accessibility_force_enable_zoom</string>
 |  
| 18 | 20 |      <string name="pref_key_advanced" translatable="false">pref_key_advanced</string>
 |  
| 19 | 21 |      <string name="pref_key_language" translatable="false">pref_key_language</string>
 |  
| ... | ... | @@ -373,10 +375,10 @@ |  
| 373 | 375 |      <string name="pref_key_tor_security_level_safer_option" translatable="false">pref_key_tor_security_level_safer_option</string>
 |  
| 374 | 376 |      <string name="pref_key_tor_security_level_safest_option" translatable="false">pref_key_tor_security_level_safest_option</string>
 |  
| 375 | 377 |  
 |  
| 376 |  | -    <string name="pref_key_tor_network_settings" translatable="false">pref_key_tor_network_settings</string>
 |  
| 377 | 378 |      <string name="pref_key_tor_network_settings_explanation" translatable="false">pref_key_tor_network_settings_explanation</string>
 |  
| 378 | 379 |      <string name="pref_key_tor_network_settings_bridge_config" translatable="false">pref_key_tor_network_settings_bridge_config</string>
 |  
| 379 | 380 |      <string name="pref_key_use_new_bootstrap" translatable="false">pref_key_use_new_bootstrap</string>
 |  
|  | 381 | +    <string name="pref_key_tor_logs" translatable="false">pref_key_tor_logs</string>
 |  
| 380 | 382 |      <string name="pref_key_use_new_bootstrap_with_android_native" translatable="false">pref_key_use_new_bootstrap_with_android_native</string>
 |  
| 381 | 383 |      <string name="pref_key_use_new_bootstrap_with_html" translatable="false">pref_key_use_new_bootstrap_with_html</string>
 |  
| 382 | 384 |      <string name="pref_key_tor_network_settings_bridge_config_explanation" translatable="false">pref_key_tor_network_settings_bridge_config_explanation</string>
 |  fenix/app/src/main/res/values/torbrowser_strings.xml
 
 
| ... | ... | @@ -31,6 +31,7 @@ |  
| 31 | 31 |  
 |  
| 32 | 32 |      <string name="tor_explore_privately">Explore. Privately.</string>
 |  
| 33 | 33 |  
 |  
|  | 34 | +    <string name="preferences_tor_connection_settings_title">Connection</string>
 |  
| 34 | 35 |      <string name="preferences_tor_network_settings">Tor Network</string>
 |  
| 35 | 36 |      <string name="preferences_tor_network_settings_explanation">Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world.</string>
 |  
| 36 | 37 |      <string name="preferences_tor_network_settings_bridge_config">Config Bridge</string>
 |  
| ... | ... | @@ -57,6 +58,8 @@ |  
| 57 | 58 |      <string name="preferences_tor_network_settings_connected">Connected</string>
 |  
| 58 | 59 |      <string name="preferences_tor_network_settings_restarting">Restarting</string>
 |  
| 59 | 60 |      <string name="preferences_tor_network_settings_bridges_enabled">Bridges are enabled: %s</string>
 |  
|  | 61 | +    <string name="preferences_tor_logs">Tor Logs</string>
 |  
|  | 62 | +    <string name="preferences_tor_logs_description">View and copy your Tor logs</string>
 |  
| 60 | 63 |  
 |  
| 61 | 64 |      <!-- Preference title for security level settings -->
 |  
| 62 | 65 |      <string name="preferences_tor_security_level_settings">Security Settings</string>
 |  fenix/app/src/main/res/xml/preferences.xml
 
 
| ... | ... | @@ -93,6 +93,7 @@ |  
| 93 | 93 |  
 |  
| 94 | 94 |      <androidx.preference.PreferenceCategory
 |  
| 95 | 95 |          android:title="@string/preferences_category_privacy_security"
 |  
|  | 96 | +        android:key="@string/pref_key_privacy"
 |  
| 96 | 97 |          android:layout="@layout/preference_category_no_icon_style">
 |  
| 97 | 98 |  
 |  
| 98 | 99 |          <androidx.preference.Preference
 |  
| ... | ... | @@ -117,11 +118,6 @@ |  
| 117 | 118 |              android:title="@string/preferences_cookie_banner_reduction"
 |  
| 118 | 119 |              app:isPreferenceVisible="false" />
 |  
| 119 | 120 |  
 |  
| 120 |  | -        <androidx.preference.Preference
 |  
| 121 |  | -            android:key="@string/pref_key_tor_network_settings"
 |  
| 122 |  | -            app:iconSpaceReserved="false"
 |  
| 123 |  | -            android:title="@string/preferences_tor_network_settings" />
 |  
| 124 |  | -
 |  
| 125 | 121 |          <androidx.preference.Preference
 |  
| 126 | 122 |              android:key="@string/pref_key_tracking_protection_settings"
 |  
| 127 | 123 |              app:iconSpaceReserved="false"
 |  
| ... | ... | @@ -156,6 +152,41 @@ |  
| 156 | 152 |  
 |  
| 157 | 153 |      </androidx.preference.PreferenceCategory>
 |  
| 158 | 154 |  
 |  
|  | 155 | +    <!-- title="@string/preferences_category_advanced"
 |  
|  | 156 | +         key="@string/pref_key_advanced"-->
 |  
|  | 157 | +    <PreferenceCategory
 |  
|  | 158 | +        android:title="@string/preferences_tor_connection_settings_title"
 |  
|  | 159 | +        android:key="@string/pref_key_connection"
 |  
|  | 160 | +        android:layout="@layout/preference_category_no_icon_style">
 |  
|  | 161 | +
 |  
|  | 162 | +        <Preference
 |  
|  | 163 | +            android:key="@string/pref_key_tor_network_settings_explanation"
 |  
|  | 164 | +            app:iconSpaceReserved="false"
 |  
|  | 165 | +            android:title="@string/preferences_tor_network_settings_explanation" />
 |  
|  | 166 | +
 |  
|  | 167 | +        <Preference
 |  
|  | 168 | +            android:key="@string/pref_key_tor_network_settings_bridge_config"
 |  
|  | 169 | +            app:iconSpaceReserved="false"
 |  
|  | 170 | +            android:title="@string/preferences_tor_network_settings_bridge_config"
 |  
|  | 171 | +            android:summary="@string/preferences_tor_network_settings_bridge_config_description" />
 |  
|  | 172 | +
 |  
|  | 173 | +        <Preference
 |  
|  | 174 | +            android:key="@string/pref_key_use_new_bootstrap"
 |  
|  | 175 | +            app:iconSpaceReserved="false"
 |  
|  | 176 | +            android:title="Enable beta connection features" />
 |  
|  | 177 | +
 |  
|  | 178 | +        <Preference
 |  
|  | 179 | +            android:key="@string/pref_key_tor_logs"
 |  
|  | 180 | +            app:iconSpaceReserved="false"
 |  
|  | 181 | +            android:title="@string/preferences_tor_logs"
 |  
|  | 182 | +            android:summary="@string/preferences_tor_logs_description" />
 |  
|  | 183 | +
 |  
|  | 184 | +        <!-- Auto connect -->
 |  
|  | 185 | +
 |  
|  | 186 | +        <!-- Tor Logs -->
 |  
|  | 187 | +
 |  
|  | 188 | +    </PreferenceCategory>
 |  
|  | 189 | +
 |  
| 159 | 190 |      <PreferenceCategory
 |  
| 160 | 191 |          android:title="@string/preferences_category_advanced"
 |  
| 161 | 192 |          android:key="@string/pref_key_advanced"
 |  fenix/app/src/main/res/xml/tor_network_settings_preferences.xml
deleted
 
 
| 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.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
 |  
| 5 |  | -    xmlns:app="http://schemas.android.com/apk/res-auto">
 |  
| 6 |  | -    <Preference
 |  
| 7 |  | -        android:key="@string/pref_key_tor_network_settings_explanation"
 |  
| 8 |  | -        android:title="@string/preferences_tor_network_settings_explanation" />
 |  
| 9 |  | -    <androidx.preference.PreferenceCategory
 |  
| 10 |  | -        android:key="@string/pref_key_tor_network_settings_status"
 |  
| 11 |  | -        android:title="@string/preferences_tor_network_settings_status"
 |  
| 12 |  | -        app:iconSpaceReserved="false"
 |  
| 13 |  | -        android:layout="@layout/preference_cat_style" >
 |  
| 14 |  | -        <Preference
 |  
| 15 |  | -            android:key="@string/pref_key_tor_network_settings_tor_ready"
 |  
| 16 |  | -            android:title="@string/preferences_tor_network_settings_tor_ready" />
 |  
| 17 |  | -        <Preference
 |  
| 18 |  | -            android:key="@string/pref_key_tor_network_settings_state"
 |  
| 19 |  | -            android:title="@string/preferences_tor_network_settings_state" />
 |  
| 20 |  | -        <Preference
 |  
| 21 |  | -            android:key="@string/pref_key_tor_network_settings_bridges_enabled"
 |  
| 22 |  | -            android:title="@string/preferences_tor_network_settings_bridges_enabled" />
 |  
| 23 |  | -    </androidx.preference.PreferenceCategory>
 |  
| 24 |  | -    <Preference
 |  
| 25 |  | -        android:icon="@drawable/ic_tor_config_bridge"
 |  
| 26 |  | -        android:key="@string/pref_key_tor_network_settings_bridge_config"
 |  
| 27 |  | -        android:title="@string/preferences_tor_network_settings_bridge_config"
 |  
| 28 |  | -        android:summary="@string/preferences_tor_network_settings_bridge_config_description"
 |  
| 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 |  | -
 |  
| 35 |  | -</androidx.preference.PreferenceScreen> |  
 |