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