[tbb-commits] [Git][tpo/applications/firefox-android][firefox-android-115.2.1-13.5-1] fixup! Add Tor integration and UI
Dan Ballard (@dan)
git at gitlab.torproject.org
Mon May 13 22:21:11 UTC 2024
Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android
Commits:
cf78d7f5 by clairehurst at 2024-05-13T14:35:02-07:00
fixup! Add Tor integration and UI
- - - - -
18 changed files:
- fenix/app/src/main/AndroidManifest.xml
- fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt
- fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt
- − fenix/app/src/main/java/org/mozilla/fenix/tor/TorBootstrapFragment.kt
- fenix/app/src/main/java/org/mozilla/fenix/tor/TorController.kt
- − fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerTAS.kt
- − fenix/app/src/main/java/org/mozilla/fenix/tor/controller/TorBootstrapController.kt
- − fenix/app/src/main/java/org/mozilla/fenix/tor/interactor/TorBootstrapInteractor.kt
- − fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapAdapter.kt
- − fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapConnectViewHolder.kt
- − fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapLoggerViewHolder.kt
- − fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapPagerAdapter.kt
- − fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapPagerViewHolder.kt
- − fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapView.kt
- − fenix/app/src/main/res/drawable/ic_tor_connect_computer_graphic.xml
- − fenix/app/src/main/res/layout/tor_bootstrap_connect.xml
- − fenix/app/src/main/res/layout/tor_bootstrap_logger.xml
- − fenix/app/src/main/res/layout/tor_bootstrap_pager.xml
Changes:
=====================================
fenix/app/src/main/AndroidManifest.xml
=====================================
@@ -367,12 +367,6 @@
tools:node="remove" />
</provider>
<!-- Define Orbotservice's TorService -->
- <service
- android:name="org.torproject.android.service.TorService"
- android:enabled="true"
- android:exported="false"
- android:stopWithTask="true">
- </service>
</application>
</manifest>
=====================================
fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt
=====================================
@@ -103,7 +103,6 @@ import org.mozilla.fenix.utils.Settings.Companion.TOP_SITES_PROVIDER_MAX_THRESHO
import org.mozilla.fenix.wallpapers.Wallpaper
import java.util.UUID
import java.util.concurrent.TimeUnit
-import org.torproject.android.service.util.Prefs
/**
*The main application class for Fenix. Records data to measure initialization performance.
@@ -234,8 +233,8 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
Log.addSink(FenixLogSink(logsDebug = Config.channel.isDebug, AndroidLogSink()))
}
- @OptIn(DelicateCoroutinesApi::class) // GlobalScope usage
- open fun setupInMainProcessOnly() {
+ @VisibleForTesting
+ protected open fun setupInMainProcessOnly() {
ProfilerMarkerFactProcessor.create { components.core.engine.profiler }.register()
run {
@@ -273,11 +272,6 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
if (!megazordSetup.isCompleted) {
runBlockingIncrement { megazordSetup.await() }
}
-
- GlobalScope.launch(Dispatchers.IO) {
- // Give TAS the base Context
- Prefs.setContext(applicationContext)
- }
}
setupLeakCanary()
=====================================
fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt
=====================================
@@ -44,7 +44,6 @@ import org.mozilla.fenix.perf.StartupStateProvider
import org.mozilla.fenix.perf.StrictModeManager
import org.mozilla.fenix.perf.lazyMonitored
import org.mozilla.fenix.tor.TorControllerGV
-import org.mozilla.fenix.tor.TorControllerTAS
import org.mozilla.fenix.utils.ClipboardHandler
import org.mozilla.fenix.utils.Settings
import org.mozilla.fenix.wifi.WifiConnectionMonitor
=====================================
fenix/app/src/main/java/org/mozilla/fenix/tor/TorBootstrapFragment.kt deleted
=====================================
@@ -1,197 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-package org.mozilla.fenix.tor
-
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.core.view.children
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.lifecycleScope
-import org.mozilla.fenix.BuildConfig
-import org.mozilla.fenix.databinding.FragmentHomeBinding
-import org.mozilla.fenix.ext.requireComponents
-import org.mozilla.fenix.tor.interactor.DefaultTorBootstrapInteractor
-import org.mozilla.fenix.tor.interactor.TorBootstrapInteractor
-import androidx.navigation.fragment.findNavController
-import com.google.android.material.appbar.AppBarLayout
-import org.mozilla.fenix.HomeActivity
-import org.mozilla.fenix.R
-import org.mozilla.fenix.ext.components
-import org.mozilla.fenix.ext.hideToolbar
-import org.mozilla.fenix.ext.settings
-import org.mozilla.fenix.tor.controller.DefaultTorBootstrapController
-import org.mozilla.fenix.tor.view.TorBootstrapView
-
-
- at Suppress("TooManyFunctions", "LargeClass")
-class TorBootstrapFragment : Fragment() {
-
- internal var _binding: FragmentHomeBinding? = null
- private val binding get() = _binding!!
-
-
- private var torBootstrapView: TorBootstrapView? = null
-
- private var _torBootstrapInteractor: TorBootstrapInteractor? = null
- private val torBootstrapInteractor: TorBootstrapInteractor
- get() = _torBootstrapInteractor!!
-
- private lateinit var torBootstrapStatus: TorBootstrapStatus
-
-
- @Suppress("LongMethod")
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?,
- ): View {
- _binding = FragmentHomeBinding.inflate(inflater, container, false)
- val components = requireComponents
-
- torBootstrapStatus = TorBootstrapStatus(
- !BuildConfig.DISABLE_TOR,
- components.torController,
- ::dispatchModeChanges
- )
-
- if (!torBootstrapStatus.isBootstrapping()) {
- openHome()
- }
-
- // Was _sessionControlInteractor
- _torBootstrapInteractor = DefaultTorBootstrapInteractor(
- controller = DefaultTorBootstrapController(
- handleTorBootstrapConnect = ::handleTorBootstrapConnect,
- cancelTorBootstrap = ::cancelTorBootstrap,
- initiateTorBootstrap = ::initiateTorBootstrap,
- openTorNetworkSettings = ::openTorNetworkSettings
- ),
- )
-
- torBootstrapView = TorBootstrapView(
- containerView = binding.sessionControlRecyclerView,
- viewLifecycleOwner = viewLifecycleOwner,
- interactor = torBootstrapInteractor,
- )
-
- adjustHomeFragmentView()
- updateSessionControlView()
- showSessionControlView()
-
- return binding.root
- }
-
- private fun updateSessionControlView() {
- torBootstrapView?.update(requireContext().components.appStore.state)
- }
-
- // This function should be paired with showSessionControlView()
- private fun adjustHomeFragmentView() {
- binding.sessionControlRecyclerView.apply {
- visibility = View.INVISIBLE
- }
-
- binding.sessionControlRecyclerView.apply {
- setPadding(0, 0, 0, 0)
- (layoutParams as ViewGroup.MarginLayoutParams).setMargins(0, 0, 0, 0)
- }
-
- binding.homeAppBar.apply {
- visibility = View.GONE
-
- // Reset this as SCROLL in case it was previously set as NO_SCROLL after bootstrap
- children.forEach {
- (it.layoutParams as AppBarLayout.LayoutParams).scrollFlags =
- AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL
- }
- }
- binding.onionPatternImage.apply {
- visibility = View.GONE
- }
- binding.toolbarLayout.apply {
- visibility = View.GONE
- }
- }
-
- // This function should be paired with adjustHomeFragmentView()
- private fun showSessionControlView() {
- binding.sessionControlRecyclerView.apply {
- visibility = View.VISIBLE
- }
- }
-
- private fun dispatchModeChanges(isBootstrapping: Boolean) {
- //requireComponents.appStore.dispatch(AppAction.ModeChange(mode))
- if (!isBootstrapping) {
- openHome()
- } else {
- adjustHomeFragmentView()
- updateSessionControlView()
- showSessionControlView()
- }
- }
-
- override fun onStop() {
- super.onStop()
- torBootstrapStatus.unregisterTorListener()
- }
-
- override fun onResume() {
- super.onResume()
-
- torBootstrapStatus.registerTorListener()
-
- // fenix#40176: Ensure the Home fragment is rendered correctly when we resume.
- val isBootstraping = torBootstrapStatus.isBootstrapping()
-
- if (!isBootstraping) {
- openHome()
- }
-
- adjustHomeFragmentView()
- updateSessionControlView()
- showSessionControlView()
-
- hideToolbar()
-
- // Whenever a tab is selected its last access timestamp is automatically updated by A-C.
- // However, in the case of resuming the app to the home fragment, we already have an
- // existing selected tab, but its last access timestamp is outdated. No action is
- // triggered to cause an automatic update on warm start (no tab selection occurs). So we
- // update it manually here.
- requireComponents.useCases.sessionUseCases.updateLastAccess()
- (requireActivity() as HomeActivity).navigateToHome()
- }
-
- private fun handleTorBootstrapConnect() {
- requireComponents.torController.onTorConnecting()
- }
-
- private fun cancelTorBootstrap() {
- requireComponents.torController.stopTor()
- }
-
- private fun initiateTorBootstrap(withDebugLogging: Boolean = false) {
- requireComponents.torController.initiateTorBootstrap(lifecycleScope, withDebugLogging)
- }
-
- private fun openTorNetworkSettings() {
- val directions =
- TorBootstrapFragmentDirections.actionTorbootstrapFragmentToSettingsFragment(
- requireContext().getString(R.string.pref_key_connection)
- )
- findNavController().navigate(directions)
- }
-
- private fun openHome() {
- val directions =
- TorBootstrapFragmentDirections
- .actionStartupHome()
- findNavController().navigate(directions)
- }
-
-}
=====================================
fenix/app/src/main/java/org/mozilla/fenix/tor/TorController.kt
=====================================
@@ -29,25 +29,6 @@ internal enum class TorStatus(val status: String) {
ON("ON"),
STOPPING("STOPPING"),
UNKNOWN("UNKNOWN");
-
- companion object {
- fun fromString(status: String): TorStatus {
- return when (status) {
- "ON" -> ON
- "STARTING" -> STARTING
- "STOPPING" -> STOPPING
- "OFF" -> OFF
- else -> UNKNOWN
- }
- }
- }
-
- fun isOff() = this == OFF
- fun isOn() = this == ON
- fun isStarting() = this == STARTING
- fun isStarted() = ((this == STARTING) || (this == ON))
- fun isStopping() = this == STOPPING
- fun isUnknown() = this == UNKNOWN
}
interface TorController: TorEvents {
=====================================
fenix/app/src/main/java/org/mozilla/fenix/tor/TorControllerTAS.kt deleted
=====================================
@@ -1,342 +0,0 @@
-package org.mozilla.fenix.tor
-
-import android.content.BroadcastReceiver
-import android.content.Context
-import android.content.Intent
-import android.content.IntentFilter
-import androidx.lifecycle.LifecycleCoroutineScope
-import androidx.localbroadcastmanager.content.LocalBroadcastManager
-import kotlinx.coroutines.channels.Channel
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withTimeoutOrNull
-import org.mozilla.fenix.BuildConfig
-import org.torproject.android.service.TorService
-import org.torproject.android.service.TorServiceConstants
-import org.torproject.android.service.util.Prefs
-
- at SuppressWarnings("TooManyFunctions")
-class TorControllerTAS (private val context: Context): TorController {
- private val lbm: LocalBroadcastManager = LocalBroadcastManager.getInstance(context)
- private val entries = mutableListOf<Pair<String?, String?>>()
- override val logEntries get() = entries
- override var quickstart: Boolean = false // Stub, is never used
-
- private var torListeners = mutableListOf<TorEvents>()
-
- private var pendingRegisterChangeList = mutableListOf<Pair<TorEvents, Boolean>>()
- private var lockTorListenersMutation = false
-
- private var lastKnownStatus = TorStatus.OFF
- private var wasTorBootstrapped = false
- private var isTorRestarting = false
-
- // This may be a lie
- private var isTorBootstrapped = false
- get() = ((lastKnownStatus == TorStatus.ON) && wasTorBootstrapped)
-
- val isDebugLoggingEnabled get() =
- context
- .getSharedPreferences("org.torproject.android_preferences", Context.MODE_PRIVATE)
- .getBoolean("pref_enable_logging", false)
-
- override val isStarting get() = lastKnownStatus.isStarting()
- override val isRestarting get() = isTorRestarting
- override val isBootstrapped get() = isTorBootstrapped
- override val isConnected get() = (lastKnownStatus.isStarted() && !isTorRestarting)
-
- override var bridgesEnabled: Boolean
- get() = Prefs.bridgesEnabled()
- set(value) { Prefs.putBridgesEnabled(value) }
-
- override var bridgeTransport: TorBridgeTransportConfig
- get() {
- return TorBridgeTransportConfigUtil.getStringToBridgeTransport(
- Prefs.getBridgesList()
- )
- }
- set(value) {
- if (value == TorBridgeTransportConfig.USER_PROVIDED) {
- // Don't set the pref when the value is USER_PROVIDED because
- // "user_provided" is not a valid bridge or transport type.
- // This call should be followed by setting userProvidedBridges.
- return
- }
- Prefs.setBridgesList(value.transportName)
- }
-
- override var userProvidedBridges: String?
- get() {
- val bridges = Prefs.getBridgesList()
- val bridgeType =
- TorBridgeTransportConfigUtil.getStringToBridgeTransport(bridges)
- return when (bridgeType) {
- TorBridgeTransportConfig.USER_PROVIDED -> bridges
- else -> null
- }
- }
- set(value) {
- Prefs.setBridgesList(value)
- }
-
- override fun start() {
- // Register receiver
- lbm.registerReceiver(
- persistentBroadcastReceiver,
- IntentFilter(TorServiceConstants.ACTION_STATUS)
- )
- lbm.registerReceiver(
- persistentBroadcastReceiver,
- IntentFilter(TorServiceConstants.LOCAL_ACTION_LOG)
- )
- }
-
- override fun stop() {
- lbm.unregisterReceiver(persistentBroadcastReceiver)
- }
-
- private val persistentBroadcastReceiver = object : BroadcastReceiver() {
- override fun onReceive(context: Context, intent: Intent) {
- if (intent.action == null ||
- (intent.action != TorServiceConstants.ACTION_STATUS &&
- intent.action != TorServiceConstants.LOCAL_ACTION_LOG)
- ) {
- return
- }
- val action = intent.action
-
- val logentry: String?
- val status: String?
- if (action == TorServiceConstants.LOCAL_ACTION_LOG) {
- logentry = intent.getExtras()
- ?.getCharSequence(TorServiceConstants.LOCAL_EXTRA_LOG) as? String?
- } else {
- logentry = null
- }
-
- status = intent.getExtras()
- ?.getCharSequence(TorServiceConstants.EXTRA_STATUS) as? String?
-
- if (logentry == null && status == null) {
- return
- }
-
- onTorStatusUpdate(logentry, status)
-
- if (status == null) {
- return
- }
-
- val newStatus = TorStatus.fromString(status)
-
- if (newStatus.isUnknown() && wasTorBootstrapped) {
- stopTor()
- }
-
- entries.add(Pair(logentry, status))
-
- if (logentry != null && logentry.contains(TorServiceConstants.TOR_CONTROL_PORT_MSG_BOOTSTRAP_DONE)) {
- wasTorBootstrapped = true
- onTorConnected()
- }
-
- if (lastKnownStatus.isStopping() && newStatus.isOff()) {
- if (isTorRestarting) {
- initiateTorBootstrap()
- } else {
- onTorStopped()
- }
- }
-
- if (lastKnownStatus.isOff() && newStatus.isStarting()) {
- isTorRestarting = false
- }
-
- lastKnownStatus = newStatus
- }
- }
-
- override fun onTorConnecting() {
- lockTorListenersMutation = true
- torListeners.forEach { it.onTorConnecting() }
- lockTorListenersMutation = false
-
- handlePendingRegistrationChanges()
- }
-
- override fun onTorConnected() {
- lockTorListenersMutation = true
- torListeners.forEach { it.onTorConnected() }
- lockTorListenersMutation = false
-
- handlePendingRegistrationChanges()
- }
-
- override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) {
- lockTorListenersMutation = true
- torListeners.forEach { it.onTorStatusUpdate(entry, status) }
- lockTorListenersMutation = false
-
- handlePendingRegistrationChanges()
- }
-
- override fun onTorStopped() {
- lockTorListenersMutation = true
- torListeners.forEach { it.onTorStopped() }
- lockTorListenersMutation = false
-
- handlePendingRegistrationChanges()
- }
-
- override fun registerTorListener(l: TorEvents) {
- if (torListeners.contains(l)) {
- return
- }
-
- if (lockTorListenersMutation) {
- pendingRegisterChangeList.add(Pair(l, true))
- } else {
- torListeners.add(l)
- }
- }
-
- override fun unregisterTorListener(l: TorEvents) {
- if (!torListeners.contains(l)) {
- return
- }
-
- if (lockTorListenersMutation) {
- pendingRegisterChangeList.add(Pair(l, false))
- } else {
- torListeners.remove(l)
- }
- }
-
- override fun registerTorLogListener(l: TorLogs) {}
- override fun unregisterTorLogListener(l: TorLogs) {}
-
- private fun handlePendingRegistrationChanges() {
- pendingRegisterChangeList.forEach {
- if (it.second) {
- registerTorListener(it.first)
- } else {
- unregisterTorListener(it.first)
- }
- }
-
- pendingRegisterChangeList.clear()
- }
-
- /**
- * Receive the current Tor status.
- *
- * Send a request for the current status and receive the response.
- * Returns true if Tor is running, false otherwise.
- *
- */
- private suspend fun checkTorIsStarted(): Boolean {
- val channel = Channel<Boolean>()
-
- // Register receiver
- val lbm: LocalBroadcastManager = LocalBroadcastManager.getInstance(context)
- val localBroadcastReceiver = object : BroadcastReceiver() {
- override fun onReceive(context: Context, intent: Intent) {
- val action = intent.action ?: return
- // We only want ACTION_STATUS messages
- if (action != TorServiceConstants.ACTION_STATUS) {
- return
- }
- // The current status has the EXTRA_STATUS key
- val currentStatus =
- intent.getStringExtra(TorServiceConstants.EXTRA_STATUS)
- channel.trySend(currentStatus === TorServiceConstants.STATUS_ON)
- }
- }
- lbm.registerReceiver(
- localBroadcastReceiver,
- IntentFilter(TorServiceConstants.ACTION_STATUS)
- )
-
- // Request service status
- sendServiceAction(TorServiceConstants.ACTION_STATUS)
-
- // Wait for response and unregister receiver
- var torIsStarted = false
- withTimeoutOrNull(torServiceResponseTimeout) {
- torIsStarted = channel.receive()
- }
- lbm.unregisterReceiver(localBroadcastReceiver)
- return torIsStarted
- }
-
- override fun initiateTorBootstrap(lifecycleScope: LifecycleCoroutineScope?, withDebugLogging: Boolean) {
- if (BuildConfig.DISABLE_TOR) {
- return
- }
-
- context.getSharedPreferences("org.torproject.android_preferences", Context.MODE_PRIVATE)
- .edit().putBoolean("pref_enable_logging", withDebugLogging).apply()
-
- if (lifecycleScope == null) {
- sendServiceAction(TorServiceConstants.ACTION_START)
- } else {
- lifecycleScope.launch {
- val torNeedsStart = !checkTorIsStarted()
- if (torNeedsStart) {
- sendServiceAction(TorServiceConstants.ACTION_START)
- }
- }
- }
- }
-
- override fun stopTor() {
- if (BuildConfig.DISABLE_TOR) {
- return
- }
-
- val torService = Intent(context, TorService::class.java)
- context.stopService(torService)
- }
-
- override fun setTorStopped() {
- lastKnownStatus = TorStatus.OFF
- onTorStopped()
- }
-
- override fun restartTor() {
- // tor-android-service doesn't dynamically update the torrc file,
- // and it doesn't use SETCONF, so we completely restart the service.
- // However, don't restart if we aren't started and we weren't
- // previously started.
- if (!lastKnownStatus.isStarted() && !wasTorBootstrapped) {
- return
- }
-
- if (!lastKnownStatus.isStarted() && wasTorBootstrapped) {
- // If we aren't started, but we were previously bootstrapped,
- // then we handle a "restart" request as a "start" restart
- initiateTorBootstrap()
- } else {
- // |isTorRestarting| tracks the state of restart. When we receive an |OFF| state
- // from TorService in persistentBroadcastReceiver::onReceive we restart the Tor
- // service.
- isTorRestarting = true
- stopTor()
- }
- }
-
- private fun sendServiceAction(action: String) {
- val torServiceStatus = Intent(context, TorService::class.java)
- torServiceStatus.action = action
- context.startService(torServiceStatus)
- }
-
- companion object {
- const val torServiceResponseTimeout = 5000L
- }
-
- // Compat with TorControlGV Stubs
-
- override fun getLastErrorState() : TorError? {
- return null;
- }
-}
=====================================
fenix/app/src/main/java/org/mozilla/fenix/tor/controller/TorBootstrapController.kt deleted
=====================================
@@ -1,63 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-package org.mozilla.fenix.tor.controller
-
-import org.mozilla.fenix.tor.interactor.TorBootstrapInteractor
-
-interface TorBootstrapController {
- /**
- * @see [TorBootstrapInteractor.onTorBootstrapConnectClicked]
- */
- fun handleTorBootstrapConnectClicked()
-
- /**
- * @see [TorBootstrapInteractor.onTorStopBootstrapping]
- */
- fun handleTorStopBootstrapping()
-
- /**
- * @see [TorBootstrapInteractor.onTorStartBootstrapping]
- */
- fun handleTorStartBootstrapping()
-
- /**
- * @see [TorBootstrapInteractor.onTorStartDebugBootstrapping]
- */
- fun handleTorStartDebugBootstrapping()
-
- /**
- * @see [TorBootstrapInteractor.onTorBootstrapNetworkSettingsClicked]
- */
- fun handleTorNetworkSettingsClicked()
-
-
-}
-
-class DefaultTorBootstrapController(
- private val handleTorBootstrapConnect: () -> Unit,
- private val initiateTorBootstrap: (Boolean) -> Unit,
- private val cancelTorBootstrap: () -> Unit,
- private val openTorNetworkSettings: () -> Unit
-) : TorBootstrapController {
- override fun handleTorBootstrapConnectClicked() {
- handleTorBootstrapConnect()
- }
-
- override fun handleTorStopBootstrapping() {
- cancelTorBootstrap()
- }
-
- override fun handleTorStartBootstrapping() {
- initiateTorBootstrap(false)
- }
-
- override fun handleTorStartDebugBootstrapping() {
- initiateTorBootstrap(true)
- }
-
- override fun handleTorNetworkSettingsClicked() {
- openTorNetworkSettings()
- }
-}
=====================================
fenix/app/src/main/java/org/mozilla/fenix/tor/interactor/TorBootstrapInteractor.kt deleted
=====================================
@@ -1,60 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-package org.mozilla.fenix.tor.interactor
-
-import org.mozilla.fenix.tor.controller.TorBootstrapController
-
-interface TorBootstrapInteractor {
- /**
- * Initiates Tor bootstrapping. Called when a user clicks on the "Connect" button.
- */
- fun onTorBootstrapConnectClicked()
-
- /**
- * Initiates Tor bootstrapping. Called when a user clicks on the "Connect" button.
- */
- fun onTorStartBootstrapping()
-
- /**
- * Stop Tor bootstrapping. Called when a user clicks on the "settings" cog/button.
- */
- fun onTorStopBootstrapping()
-
- /**
- * Initiates Tor bootstrapping with debug logging. Called when bootstrapping fails with
- * the control.txt file not existing.
- */
- fun onTorStartDebugBootstrapping()
-
- /**
- * Open Tor Network Settings preference screen
- */
- fun onTorBootstrapNetworkSettingsClicked()
-}
-
-class DefaultTorBootstrapInteractor(
- private val controller: TorBootstrapController,
-) : TorBootstrapInteractor {
-
- override fun onTorBootstrapConnectClicked() {
- controller.handleTorBootstrapConnectClicked()
- }
-
- override fun onTorStopBootstrapping() {
- controller.handleTorStopBootstrapping()
- }
-
- override fun onTorStartBootstrapping() {
- controller.handleTorStartBootstrapping()
- }
-
- override fun onTorStartDebugBootstrapping() {
- controller.handleTorStartDebugBootstrapping()
- }
-
- override fun onTorBootstrapNetworkSettingsClicked() {
- controller.handleTorNetworkSettingsClicked()
- }
-}
=====================================
fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapAdapter.kt deleted
=====================================
@@ -1,83 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-package org.mozilla.fenix.tor.view
-
-import android.view.LayoutInflater
-import android.view.ViewGroup
-import androidx.annotation.LayoutRes
-import androidx.lifecycle.LifecycleOwner
-import androidx.recyclerview.widget.DiffUtil
-import androidx.recyclerview.widget.ListAdapter
-import androidx.recyclerview.widget.RecyclerView
-import org.mozilla.fenix.components.Components
-import org.mozilla.fenix.home.topsites.TopSitePagerViewHolder
-import org.mozilla.fenix.tor.interactor.TorBootstrapInteractor
-
-sealed class AdapterItem(@LayoutRes val viewType: Int) {
- object TorBootstrap : AdapterItem(TorBootstrapPagerViewHolder.LAYOUT_ID)
-
-
- open fun sameAs(other: AdapterItem) = this::class == other::class
- open fun getChangePayload(newItem: AdapterItem): Any? = null
- open fun contentsSameAs(other: AdapterItem) = this::class == other::class
-
-}
-
-class AdapterItemDiffCallback : DiffUtil.ItemCallback<AdapterItem>() {
- override fun areItemsTheSame(oldItem: AdapterItem, newItem: AdapterItem) =
- oldItem.sameAs(newItem)
-
- @Suppress("DiffUtilEquals")
- override fun areContentsTheSame(oldItem: AdapterItem, newItem: AdapterItem) =
- oldItem.contentsSameAs(newItem)
-
- override fun getChangePayload(oldItem: AdapterItem, newItem: AdapterItem): Any? {
- return oldItem.getChangePayload(newItem) ?: return super.getChangePayload(oldItem, newItem)
- }
-}
-
-
-
-class TorBootstrapAdapter(
- private val interactor: TorBootstrapInteractor,
- private val viewLifecycleOwner: LifecycleOwner,
- private val components: Components,
-) : ListAdapter<AdapterItem, RecyclerView.ViewHolder>(AdapterItemDiffCallback()) {
-
- // This method triggers the ComplexMethod lint error when in fact it's quite simple.
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
- val view = LayoutInflater.from(parent.context).inflate(viewType, parent, false)
- return when (viewType) {
- TorBootstrapPagerViewHolder.LAYOUT_ID -> TorBootstrapPagerViewHolder(
- view,
- components,
- interactor
- )
- else -> throw IllegalStateException()
- }
- }
-
- override fun getItemViewType(position: Int) = getItem(position).viewType
-
- override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int, payloads: MutableList<Any>) {
- if (payloads.isEmpty()) {
- onBindViewHolder(holder, position)
- } else {
- when (holder) {
- is TopSitePagerViewHolder -> {
- if (payloads[0] is org.mozilla.fenix.home.sessioncontrol.AdapterItem.TopSitePagerPayload) {
- val payload = payloads[0] as org.mozilla.fenix.home.sessioncontrol.AdapterItem.TopSitePagerPayload
- holder.update(payload)
- }
- }
- }
- }
- }
-
- override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
- // no-op. This ViewHolder receives the HomeStore as argument and will observe that
- // without the need for us to manually update from here the data to be displayed.
- }
-}
=====================================
fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapConnectViewHolder.kt deleted
=====================================
@@ -1,89 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-package org.mozilla.fenix.tor.view
-
-import android.view.View
-import androidx.recyclerview.widget.RecyclerView
-import org.mozilla.fenix.R
-import org.mozilla.fenix.components.Components
-import org.mozilla.fenix.databinding.TorBootstrapConnectBinding
-import org.mozilla.fenix.tor.TorEvents
-import org.mozilla.fenix.tor.interactor.TorBootstrapInteractor
-
-class TorBootstrapConnectViewHolder(
- private val view: View,
- private val components: Components,
- private val interactor: TorBootstrapInteractor
-) : RecyclerView.ViewHolder(view), TorEvents {
-
- var binding: TorBootstrapConnectBinding
-
- init {
- binding = TorBootstrapConnectBinding.bind(view)
-
- with(binding.torBootstrapNetworkSettingsButton) {
- setOnClickListener {
- interactor.onTorStopBootstrapping()
- interactor.onTorBootstrapNetworkSettingsClicked()
-
- with(binding.torBootstrapProgress) {
- visibility = View.INVISIBLE
- }
-
- with(binding.torBootstrapConnectButton) {
- visibility = View.VISIBLE
- }
- }
- }
-
- with(binding.torBootstrapConnectButton) {
- setOnClickListener {
- interactor.onTorBootstrapConnectClicked()
- interactor.onTorStartBootstrapping()
-
- visibility = View.INVISIBLE
-
- with(binding.torBootstrapProgress) {
- visibility = View.VISIBLE
- }
- }
- }
-
- components.torController.registerTorListener(this)
- }
-
- @SuppressWarnings("EmptyFunctionBlock")
- override fun onTorConnecting() {
- }
-
- override fun onTorConnected() {
- components.torController.unregisterTorListener(this)
- }
-
- @SuppressWarnings("EmptyFunctionBlock")
- override fun onTorStopped() {
- }
-
- override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) {
- if (entry == null) return
-
- binding.torBootstrapStatusMessage.text = entry
- if (entry.startsWith(BOOTSTRAPPED_PREFIX)) {
- val percentIdx = entry.indexOf("%")
- val percent = entry.substring(
- BOOTSTRAPPED_PREFIX.length,
- percentIdx
- )
- with(binding.torBootstrapProgress) {
- this.progress = percent.toInt()
- }
- }
- }
-
- companion object {
- const val LAYOUT_ID = R.layout.tor_bootstrap_connect
- const val BOOTSTRAPPED_PREFIX = "NOTICE: Bootstrapped "
- }
-}
=====================================
fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapLoggerViewHolder.kt deleted
=====================================
@@ -1,76 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-package org.mozilla.fenix.tor.view
-
-import android.text.method.ScrollingMovementMethod
-import android.view.View
-import androidx.recyclerview.widget.RecyclerView
-import org.mozilla.fenix.R
-import org.mozilla.fenix.components.Components
-import org.mozilla.fenix.databinding.TorBootstrapLoggerBinding
-import org.mozilla.fenix.tor.TorEvents
-
-class TorBootstrapLoggerViewHolder(
- private val view: View,
- private val components: Components
- ) : RecyclerView.ViewHolder(view), TorEvents {
-
- private var entries = mutableListOf<String>()
- private var binding: TorBootstrapLoggerBinding
-
- init {
- binding = TorBootstrapLoggerBinding.bind(view)
- components.torController.registerTorListener(this)
-
- val currentEntries = components.torController.logEntries
- .filter { it.first != null }
- .filter { !(it.first!!.startsWith("Circuit") && it.second == "ON") }
- // Keep synchronized with format in onTorStatusUpdate
- .flatMap { listOf("(${it.second}) '${it.first}'") }
- val entriesLen = currentEntries.size
- val subListOffset = if (entriesLen > MAX_NEW_ENTRIES) MAX_NEW_ENTRIES else entriesLen
- entries = currentEntries.subList((entriesLen - subListOffset), entriesLen) as MutableList<String>
- val initLog = "---------------" + view.resources.getString(R.string.tor_initializing_log) + "---------------"
- entries.add(0, initLog)
-
- with(binding.torBootstrapLogEntries) {
- movementMethod = ScrollingMovementMethod()
- text = formatLogEntries(entries)
- }
- }
-
- private fun formatLogEntries(entries: List<String>) = entries.joinToString("\n")
-
- @SuppressWarnings("EmptyFunctionBlock")
- override fun onTorConnecting() {
- }
-
- override fun onTorConnected() {
- components.torController.unregisterTorListener(this)
- }
-
- @SuppressWarnings("EmptyFunctionBlock")
- override fun onTorStopped() {
- }
-
- override fun onTorStatusUpdate(entry: String?, status: String?, progress: Double?) {
- if (status == null || entry == null) return
- if (status == "ON" && entry.startsWith("Circuit")) return
-
- if (entries.size > MAX_LINES) {
- entries = entries.drop(1) as MutableList<String>
- }
- entries.add("($status) '$entry'")
-
- binding.torBootstrapLogEntries.text = formatLogEntries(entries)
- }
-
- companion object {
- const val LAYOUT_ID = R.layout.tor_bootstrap_logger
- const val MAX_NEW_ENTRIES = 24
- const val MAX_LINES = 25
- }
-
-}
=====================================
fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapPagerAdapter.kt deleted
=====================================
@@ -1,43 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-package org.mozilla.fenix.tor.view
-
-import android.view.LayoutInflater
-import android.view.ViewGroup
-import androidx.recyclerview.widget.RecyclerView
-import org.mozilla.fenix.components.Components
-import org.mozilla.fenix.tor.interactor.TorBootstrapInteractor
-
-class TorBootstrapPagerAdapter(
- private val components: Components,
- private val interactor: TorBootstrapInteractor
-) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
-
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
- if (viewType == BOOTSTRAP_UI_PAGE_TYPE) {
- val viewDVH = LayoutInflater.from(parent.context)
- .inflate(TorBootstrapConnectViewHolder.LAYOUT_ID, parent, false)
- return TorBootstrapConnectViewHolder(viewDVH, components, interactor)
- } else {
- val viewLVH = LayoutInflater.from(parent.context)
- .inflate(TorBootstrapLoggerViewHolder.LAYOUT_ID, parent, false)
- return TorBootstrapLoggerViewHolder(viewLVH, components)
- }
- }
-
- @SuppressWarnings("EmptyFunctionBlock")
- override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
- }
-
- override fun getItemViewType(position: Int): Int = position
-
- override fun getItemCount(): Int = BOOTSTRAP_PAGE_COUNT
-
- companion object {
- const val BOOTSTRAP_UI_PAGE_TYPE = 0
- const val BOOTSTRAP_LOG_PAGE_TYPE = 1
- const val BOOTSTRAP_PAGE_COUNT = 2
- }
-}
=====================================
fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapPagerViewHolder.kt deleted
=====================================
@@ -1,32 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-package org.mozilla.fenix.tor.view
-
-import android.view.View
-import androidx.recyclerview.widget.RecyclerView
-import org.mozilla.fenix.R
-import org.mozilla.fenix.components.Components
-import org.mozilla.fenix.databinding.TorBootstrapPagerBinding
-import org.mozilla.fenix.tor.interactor.TorBootstrapInteractor
-
-class TorBootstrapPagerViewHolder(
- view: View,
- components: Components,
- interactor: TorBootstrapInteractor
- ) : RecyclerView.ViewHolder(view) {
-
- private val bootstrapPagerAdapter = TorBootstrapPagerAdapter(components, interactor)
-
- init {
- val binding = TorBootstrapPagerBinding.bind(view)
- binding.bootstrapPager.apply {
- adapter = bootstrapPagerAdapter
- }
- }
-
- companion object {
- const val LAYOUT_ID = R.layout.tor_bootstrap_pager
- }
-}
=====================================
fenix/app/src/main/java/org/mozilla/fenix/tor/view/TorBootstrapView.kt deleted
=====================================
@@ -1,49 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-package org.mozilla.fenix.tor.view
-
-import androidx.lifecycle.LifecycleOwner
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import org.mozilla.fenix.components.appstate.AppState
-import org.mozilla.fenix.ext.components
-import org.mozilla.fenix.tor.interactor.TorBootstrapInteractor
-
-
-class TorBootstrapView(
- containerView: RecyclerView,
- viewLifecycleOwner: LifecycleOwner,
- interactor: TorBootstrapInteractor,
-) {
-
- val view: RecyclerView = containerView //as RecyclerView
-
- private fun bootstrapAdapterItems() = listOf(AdapterItem.TorBootstrap)
-
- private val torBootstrapAdapter = TorBootstrapAdapter(
- interactor,
- viewLifecycleOwner,
- containerView.context.components,
- )
-
- //private val torBootstrapAdapter =
- // TorBootstrapAdapter(interactor, containerView.context.components)
- //private val torBootstrapAdapter = TorBootstrapPagerAdapter(containerView.context.components, interactor)
-
- init {
- containerView.apply {
- adapter = torBootstrapAdapter
- layoutManager = LinearLayoutManager(containerView.context)
- }
- }
-
- private fun AppState.toAdapterList(): List<AdapterItem> {
- return bootstrapAdapterItems()
- }
-
- fun update(state: AppState) {
- torBootstrapAdapter.submitList(state.toAdapterList())
- }
-}
=====================================
fenix/app/src/main/res/drawable/ic_tor_connect_computer_graphic.xml deleted
=====================================
@@ -1,506 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:aapt="http://schemas.android.com/aapt"
- android:width="302dp"
- android:height="263dp"
- android:viewportWidth="302"
- android:viewportHeight="263">
- <path
- android:pathData="M279.49,222.64l-94.22,-0l-0,-79.61l94.22,-0z"
- android:strokeWidth="1"
- android:fillType="nonZero"
- android:strokeColor="#00000000">
- <aapt:attr name="android:fillColor">
- <gradient
- android:startY="203.70642"
- android:startX="231.9"
- android:endY="160.04314"
- android:endX="232.90999"
- android:type="linear">
- <item android:offset="0.08" android:color="#FF7E4696"/>
- <item android:offset="0.39" android:color="#9B7E4696"/>
- <item android:offset="0.85" android:color="#007E4696"/>
- </gradient>
- </aapt:attr>
- </path>
- <path
- android:pathData="M112.74,217.05l-102.32,-0l-0,-102.32l102.32,-0z"
- android:strokeWidth="1"
- android:fillType="nonZero"
- android:strokeColor="#00000000">
- <aapt:attr name="android:fillColor">
- <gradient
- android:startY="203.36"
- android:startX="60.96"
- android:endY="124.990005"
- android:endX="62.249996"
- android:type="linear">
- <item android:offset="0.08" android:color="#FF00D9B5"/>
- <item android:offset="0.3" android:color="#BA00D9B5"/>
- <item android:offset="0.8" android:color="#1100D9B5"/>
- <item android:offset="0.85" android:color="#0000D9B5"/>
- </gradient>
- </aapt:attr>
- </path>
- <path
- android:pathData="M58,1L183.49,1C186.526,1.016 188.984,3.474 189,6.51L189,100.25L52.47,100.25L52.47,6.51C52.486,3.466 54.956,1.005 58,1Z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#F0D4FD"
- android:strokeColor="#65318E"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M60.55,8.87h120.41v108.53h-120.41z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#FFFFFF"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M60.55,8.87h120.41v108.53h-120.41z"
- android:strokeWidth="1"
- android:fillType="nonZero"
- android:strokeColor="#00000000">
- <aapt:attr name="android:fillColor">
- <gradient
- android:startY="-56.010002"
- android:startX="120.75"
- android:endY="120.520004"
- android:endX="120.75"
- android:type="linear">
- <item android:offset="0.08" android:color="#FF00D9B5"/>
- <item android:offset="0.12" android:color="#F700D9B5"/>
- <item android:offset="0.19" android:color="#E200D9B5"/>
- <item android:offset="0.26" android:color="#BF00D9B5"/>
- <item android:offset="0.35" android:color="#8E00D9B5"/>
- <item android:offset="0.44" android:color="#5100D9B5"/>
- <item android:offset="0.54" android:color="#0700D9B5"/>
- <item android:offset="0.54" android:color="#0000D9B5"/>
- </gradient>
- </aapt:attr>
- </path>
- <path
- android:pathData="M77.5,120.83h134.33v10.38h-134.33z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#F0D4FD"
- android:strokeColor="#65318E"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M52.47,100.25l0,10.29l25.03,20.67l0,-10.38z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#65318E"
- android:strokeColor="#F0D4FD"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M60.33,33.17h43.89v37.87h-43.89z"
- android:strokeWidth="1.76"
- android:fillColor="#FFFFFF"
- android:strokeColor="#65318E"
- android:fillType="nonZero"/>
- <path
- android:pathData="M178.05,170.61L61.43,170.61L61.43,87C61.43,85.895 62.325,85 63.43,85L176,85C177.105,85 178,85.895 178,87L178.05,170.61Z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#00D9B5"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M66.88,89.57h105.71v76.37h-105.71z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#F0D4FD"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M177.06,170.61l-115.63,0l21.37,17.75l115.64,0z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#65318E"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M82.8,188.36h115.11v8.96h-115.11z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#00D9B5"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M61.43,170.61l0,7.04l21.37,19.67l0,-8.96z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#FFFFFF"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M190.59,183L74,183L74,99.29C74.027,98.177 74.937,97.29 76.05,97.29L188.54,97.29C189.653,97.29 190.563,98.177 190.59,99.29L190.59,183Z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#00D9B5"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M79.42,101.91h105.71v76.37h-105.71z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#F0D4FD"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M189.73,182.95l-115.77,0l21.37,17.75l115.77,0z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#65318E"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M95.33,200.7h115.38v8.96h-115.38z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#00D9B5"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M73.96,182.95l0,6.78l21.37,19.93l0,-8.96z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#FFFFFF"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M203.12,195.29L86.5,195.29L86.5,111.63C86.5,110.525 87.395,109.63 88.5,109.63L201.08,109.63C202.185,109.63 203.08,110.525 203.08,111.63L203.12,195.29Z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#00D9B5"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M91.95,114.25h105.71v76.37h-105.71z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#F0D4FD"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M202.4,195.29l-115.9,0l21.37,17.75l115.9,0z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#65318E"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M107.87,213.04h115.64v8.96h-115.64z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#00D9B5"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M86.5,195.29l0,6.51l21.37,20.2l0,-8.96z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#FFFFFF"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M215.66,207.63L99,207.63L99,124C99,122.895 99.895,122 101,122L213.61,122C214.715,122 215.61,122.895 215.61,124L215.66,207.63Z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#00D9B5"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M104.49,126.59h105.71v76.37h-105.71z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#F0D4FD"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M215.06,207.63l-116.03,0l21.37,17.75l116.03,0z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#65318E"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M120.4,225.38h115.9v8.96h-115.9z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#00D9B5"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M99.03,207.63l0,6.25l21.37,20.46l0,-8.96z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#FFFFFF"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M228.19,220L111.57,220L111.57,136.31C111.57,135.205 112.465,134.31 113.57,134.31L226.15,134.31C227.255,134.31 228.15,135.205 228.15,136.31L228.19,220Z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#00D9B5"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M117.02,138.93h105.71v76.37h-105.71z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#F0D4FD"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M227.73,219.97l-116.16,0l21.37,17.75l116.16,0z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#65318E"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M132.94,237.72h116.16v8.96h-116.16z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#00D9B5"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M111.57,219.97l0,5.99l21.37,19.72l0,-7.96z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#FFFFFF"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M245.52,234.67L128.9,234.67L128.9,151C128.9,149.895 129.795,149 130.9,149L243.48,149C244.585,149 245.48,149.895 245.48,151L245.52,234.67Z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#00D9B5"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M134.36,153.64h105.71v76.37h-105.71z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#F0D4FD"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M245.06,234.67l-116.16,0l21.37,17.76l116.16,0z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#65318E"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M150.27,252.43h116.16v8.96h-116.16z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#00D9B5"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M60.33,33.89h41.01v38.59h-41.01z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#65318E"
- android:strokeColor="#65318E"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M67.24,33.89h34.1v30.04h-34.1z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#65318E"
- android:strokeColor="#65318E"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M150.62,58.81L150.62,151L279.49,151L279.49,58.81C279.49,55.01 276.41,51.93 272.61,51.93L157.5,51.93C153.7,51.93 150.62,55.01 150.62,58.81ZM273.46,142.2L156.65,142.2L156.65,61.41L273.46,61.41L273.46,142.2Z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#00D9B5"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M277.38,150.95l-126.76,0l23.62,19.62l126.76,0z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#F0D4FD"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M174.24,170.57h126.76v9.9h-126.76z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#00D9B5"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M150.62,150.95l0,9.81l23.62,19.71l0,-9.9z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#490260"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M157.37,61.41h116.09v80.79h-116.09z"
- android:strokeWidth="1.76"
- android:fillColor="#FFFFFF"
- android:strokeColor="#65318E"
- android:fillType="nonZero"/>
- <path
- android:pathData="M157.37,61.41h116.09v80.79h-116.09z"
- android:strokeWidth="1"
- android:fillType="nonZero"
- android:strokeColor="#00000000">
- <aapt:attr name="android:fillColor">
- <gradient
- android:startY="18.45"
- android:startX="215.42"
- android:endY="112.96"
- android:endX="215.42"
- android:type="linear">
- <item android:offset="0.08" android:color="#FFF0D4FD"/>
- <item android:offset="0.27" android:color="#C4F0D4FD"/>
- <item android:offset="0.7" android:color="#33F0D4FD"/>
- <item android:offset="0.85" android:color="#00F0D4FD"/>
- </gradient>
- </aapt:attr>
- </path>
- <path
- android:pathData="M157.37,61.41h1.72v80.79h-1.72z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#490260"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M5.78,27.13L119,27.13C121.64,27.13 123.78,29.27 123.78,31.91L123.78,119.64L1,119.64L1,31.9C1.006,29.264 3.144,27.13 5.78,27.13Z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#00D9B5"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M9.05,34.34h106.66v76.63h-106.66z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#FFFFFF"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M121.75,119.63l-120.75,0l22.5,18.69l120.74,0z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#F0D4FD"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M23.5,138.32h120.75v9.43h-120.75z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#00D9B5"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M1,119.63l0,9.34l22.5,18.78l0,-9.43z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#490260"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M9.82,35.75h104.98v74.01h-104.98z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#FFFFFF"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M9.82,35.75h104.98v74.01h-104.98z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#FFFFFF"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M58.1,35.75L115.36,35.75L115.36,102.15L65.3,102.15C61.341,102.156 58.122,98.959 58.1,95L58.1,35.75Z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#F0D4FD"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M69.28,35.43h46.09v53.39h-46.09z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#F0D4FD"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M9.05,110.21L9.05,34.34L12.25,34.34L12.25,107C12.253,107.85 11.917,108.667 11.316,109.269C10.716,109.871 9.9,110.21 9.05,110.21Z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#490260"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M132.94,246.68l17.33,14.71l0,-8.96l-17.33,-14.71z"
- android:strokeLineJoin="round"
- android:strokeWidth="1.76"
- android:fillColor="#FFFFFF"
- android:strokeColor="#490260"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
-</vector>
=====================================
fenix/app/src/main/res/layout/tor_bootstrap_connect.xml deleted
=====================================
@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
- - License, v. 2.0. If a copy of the MPL was not distributed with this
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_gravity="bottom"
- android:layout_marginLeft="16dp"
- android:layout_marginRight="16dp" >
-
- <ImageView
- android:id="@+id/tor_bootstrap_network_settings_button"
- app:srcCompat="@drawable/mozac_ic_settings"
- android:scaleType="fitCenter"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginTop="20dp"
- android:layout_alignParentTop="true"
- android:layout_alignParentEnd="true"
- tools:ignore="ContentDescription" />
-
- <ImageView
- android:id="@+id/tor_bootstrap_image"
- app:srcCompat="@drawable/ic_tor_connect_computer_graphic"
- android:scaleType="fitCenter"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginTop="80dp"
- android:layout_marginBottom="10dp"
- android:layout_centerHorizontal="true"
- android:layout_below="@id/tor_bootstrap_network_settings_button"
- android:layout_above="@id/tor_bootstrap_connect_button"
- android:gravity="center"
- tools:ignore="ContentDescription" />
-
- <androidx.appcompat.widget.SwitchCompat
- android:id="@+id/quick_start_toggle"
- android:visibility="gone"
- android:checked="false"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_above="@id/tor_bootstrap_connect_button" />
-
- <Button
- android:id="@+id/tor_bootstrap_connect_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:width="160dp"
- android:height="36dp"
- android:layout_marginBottom="10dp"
- android:layout_centerHorizontal="true"
- android:layout_above="@id/tor_bootstrap_status_message"
- android:gravity="center|center_vertical"
- android:text="@string/tor_bootstrap_connect"
- android:fontFamily="Roboto-Medium"
- android:textColor="#FF000000"
- android:textSize="18sp"
- android:lineSpacingMultiplier="0.89"
- android:background="@drawable/rounded_corners" />
-
- <TextView
- android:id="@+id/tor_bootstrap_status_message"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="32dp"
- android:layout_centerHorizontal="true"
- android:paddingStart="8dp"
- android:paddingEnd="8dp"
- android:gravity="center"
- android:lines="3"
- android:layout_above="@id/tor_bootstrap_swipe_log" />
-
- <TextView
- android:id="@+id/tor_bootstrap_swipe_log"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:width="360dp"
- android:height="24dp"
- android:layout_marginBottom="15dp"
- android:layout_centerHorizontal="true"
- android:layout_alignParentBottom="true"
- android:gravity="center"
- android:textSize="14sp"
- android:textColor="#FFFFFFFF"
- android:fontFamily="Roboto-Regular"
- android:lineSpacingMultiplier="1.71"
- android:text="@string/tor_bootstrap_swipe_for_logs"
- android:layout_above="@id/tor_bootstrap_progress" />
-
- <ProgressBar
- android:id="@+id/tor_bootstrap_progress"
- style="?android:attr/progressBarStyleHorizontal"
- android:layout_width="match_parent"
- android:layout_height="3dp"
- android:visibility="invisible"
- android:layout_alignParentBottom="true" />
-</RelativeLayout>
=====================================
fenix/app/src/main/res/layout/tor_bootstrap_logger.xml deleted
=====================================
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
- - License, v. 2.0. If a copy of the MPL was not distributed with this
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <TextView
- android:id="@+id/tor_bootstrap_log_entries"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="bottom"
- android:textColor="@android:color/white"
- android:fontFamily="RobotoMono-Regular"
- android:textSize="12sp"
- android:textIsSelectable="true"
- android:layout_marginLeft="20dp"
- android:layout_marginRight="20dp"
- android:layout_marginBottom="20dp" />
-</FrameLayout>
=====================================
fenix/app/src/main/res/layout/tor_bootstrap_pager.xml deleted
=====================================
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
- - License, v. 2.0. If a copy of the MPL was not distributed with this
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<com.google.android.material.appbar.AppBarLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:background="?torBootstrapBackground">
-
- <androidx.viewpager2.widget.ViewPager2
- android:id="@+id/bootstrap_pager"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
-</com.google.android.material.appbar.AppBarLayout>
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/cf78d7f568e31507d9c30910f15ec9ffa7c09601
--
This project does not include diff previews in email notifications.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/firefox-android/-/commit/cf78d7f568e31507d9c30910f15ec9ffa7c09601
You're receiving this email because of your account on gitlab.torproject.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.torproject.org/pipermail/tbb-commits/attachments/20240513/bec846fa/attachment-0001.htm>
More information about the tbb-commits
mailing list