Richard Pospesel pushed to branch tor-browser-102.2.1-12.5-1 at The Tor Project / Applications / fenix
Commits: 667092ef by Tommy Webb at 2023-02-02T23:23:07+00:00 Bug 40536: Wait until Tor is connected to process intents
- - - - -
2 changed files:
- app/src/main/java/org/mozilla/fenix/HomeActivity.kt - app/src/main/java/org/mozilla/fenix/IntentReceiverActivity.kt
Changes:
===================================== app/src/main/java/org/mozilla/fenix/HomeActivity.kt ===================================== @@ -129,6 +129,7 @@ import org.mozilla.fenix.tabstray.TabsTrayFragment import org.mozilla.fenix.tabstray.TabsTrayFragmentDirections import org.mozilla.fenix.theme.DefaultThemeManager import org.mozilla.fenix.theme.ThemeManager +import org.mozilla.fenix.tor.TorEvents import org.mozilla.fenix.trackingprotection.TrackingProtectionPanelDialogFragmentDirections import org.mozilla.fenix.utils.BrowsersCache import org.mozilla.fenix.utils.Settings @@ -533,6 +534,24 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { * Handles intents received when the activity is open. */ final override fun onNewIntent(intent: Intent?) { + if (intent?.action == ACTION_MAIN || components.torController.isConnected) { + onNewIntentInternal(intent) + } else { + // Wait until Tor is connected to handle intents from external apps for links, search, etc. + components.torController.registerTorListener(object : TorEvents { + override fun onTorConnected() { + components.torController.unregisterTorListener(this) + onNewIntentInternal(intent) + } + override fun onTorConnecting() { /* no-op */ } + override fun onTorStopped() { /* no-op */ } + override fun onTorStatusUpdate(entry: String?, status: String?) { /* no-op */ } + }) + return + } + } + + private fun onNewIntentInternal(intent: Intent?) { super.onNewIntent(intent) intent?.let { handleNewIntent(it) @@ -1092,13 +1111,16 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
/** * Indicates if the user should be redirected to the [BrowserFragment] or to the [HomeFragment], - * links from an external apps should always opened in the [BrowserFragment]. + * links from an external apps should always opened in the [BrowserFragment], + * unless Tor is not yet connected. */ fun shouldStartOnHome(intent: Intent? = this.intent): Boolean { return components.strictMode.resetAfter(StrictMode.allowThreadDiskReads()) { // We only want to open on home when users tap the app, - // we want to ignore other cases when the app gets open by users clicking on links. - getSettings().shouldStartOnHome() && intent?.action == ACTION_MAIN + // we want to ignore other cases when the app gets open by users clicking on links, + // unless Tor is not yet connected. + getSettings().shouldStartOnHome() && (intent?.action == ACTION_MAIN || + !components.torController.isConnected) } }
===================================== app/src/main/java/org/mozilla/fenix/IntentReceiverActivity.kt ===================================== @@ -6,6 +6,7 @@ package org.mozilla.fenix
import android.app.Activity import android.content.Intent +import android.content.Intent.ACTION_MAIN import android.content.pm.PackageManager import android.os.Build import android.os.Bundle @@ -24,6 +25,7 @@ import org.mozilla.fenix.ext.settings import org.mozilla.fenix.perf.MarkersActivityLifecycleCallbacks import org.mozilla.fenix.perf.StartupTimeline import org.mozilla.fenix.shortcut.NewTabShortcutIntentProcessor +import org.mozilla.fenix.tor.TorEvents
/** * Processes incoming intents and sends them to the corresponding activity. @@ -45,7 +47,23 @@ class IntentReceiverActivity : Activity() { // the HomeActivity. val intent = intent?.let { Intent(it) } ?: Intent() intent.sanitize().stripUnwantedFlags() - processIntent(intent) + if (intent.action == ACTION_MAIN || components.torController.isConnected) { + processIntent(intent) + } else { + // Wait until Tor is connected to handle intents from external apps for links, search, etc. + components.torController.registerTorListener(object : TorEvents { + override fun onTorConnected() { + components.torController.unregisterTorListener(this) + processIntent(intent) + } + override fun onTorConnecting() { /* no-op */ } + override fun onTorStopped() { /* no-op */ } + override fun onTorStatusUpdate(entry: String?, status: String?) { /* no-op */ } + }) + + // In the meantime, open the HomeActivity so the user can get connected. + processIntent(Intent()) + }
components.core.engine.profiler?.addMarker( MarkersActivityLifecycleCallbacks.MARKER_NAME, startTimeProfiler, "IntentReceiverActivity.onCreate"
View it on GitLab: https://gitlab.torproject.org/tpo/applications/fenix/-/commit/667092ef6caed0...