Skip to content
Snippets Groups Projects
Verified Commit eda934e8 authored by Alex Catarineu's avatar Alex Catarineu Committed by Pier Angelo Vendrame
Browse files

Bug 40007: [android] Port external helper app prompting

Together with the corresponding fenix patch, this allows all `startActivity`
that may open external apps to be replaced by `TorUtils.startActivityPrompt`.
parent 9cf9ccf1
No related branches found
No related tags found
1 merge request!1222Bug 43166: Rebased alpha onto 128.3.0esr
Showing
with 45 additions and 13 deletions
......@@ -46,6 +46,7 @@ dependencies {
implementation project(':ui-widgets')
implementation ComponentsDependencies.kotlin_coroutines
implementation project(path: ':support-utils')
testImplementation project(':support-test')
testImplementation project(':support-test-libstate')
......
......@@ -108,7 +108,7 @@ class AppLinksFeature(
}
@Suppress("ComplexCondition")
if (isSameCallerAndApp(tab, appIntent) || (!tab.content.private && !shouldPrompt()) ||
if (isSameCallerAndApp(tab, appIntent) || (true || !tab.content.private && !shouldPrompt()) ||
fragmentManager == null
) {
doOpenApp()
......
......@@ -26,6 +26,7 @@ import java.lang.Exception
import java.lang.NullPointerException
import java.lang.NumberFormatException
import java.net.URISyntaxException
import mozilla.components.support.utils.TorUtils
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
internal const val EXTRA_BROWSER_FALLBACK_URL = "browser_fallback_url"
......@@ -232,7 +233,7 @@ class AppLinksUseCases(
if (launchInNewTask) {
it.flags = it.flags or Intent.FLAG_ACTIVITY_NEW_TASK
}
context.startActivity(it)
TorUtils.startActivityPrompt(context, it)
} catch (e: Exception) {
when (e) {
is ActivityNotFoundException, is SecurityException, is NullPointerException -> {
......
......@@ -26,6 +26,7 @@ import mozilla.components.support.ktx.kotlin.stripMailToProtocol
import mozilla.components.support.ktx.kotlin.takeOrReplace
import mozilla.components.ui.widgets.DefaultSnackbarDelegate
import mozilla.components.ui.widgets.SnackbarDelegate
import mozilla.components.support.utils.TorUtils
/**
* A candidate for an item to be displayed in the context menu.
......@@ -491,7 +492,8 @@ data class ContextMenuCandidate(
flags = Intent.FLAG_ACTIVITY_NEW_TASK
putExtra(Intent.EXTRA_TEXT, hitResult.getLink())
}
context.startActivity(
TorUtils.startActivityPrompt(
context,
intent.createChooserExcludingCurrentApp(
context,
context.getString(R.string.mozac_feature_contextmenu_share_link),
......
......@@ -77,6 +77,7 @@ import mozilla.components.support.ktx.kotlinx.coroutines.throttleLatest
import mozilla.components.support.utils.DownloadUtils
import mozilla.components.support.utils.ext.registerReceiverCompat
import mozilla.components.support.utils.ext.stopForegroundCompat
import mozilla.components.support.utils.TorUtils
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
......@@ -984,7 +985,7 @@ abstract class AbstractFetchDownloadService : Service() {
val newIntent = createOpenFileIntent(applicationContext, download)
return try {
applicationContext.startActivity(newIntent)
TorUtils.startActivityPrompt(applicationContext, newIntent)
true
} catch (error: ActivityNotFoundException) {
false
......
......@@ -41,6 +41,7 @@ import mozilla.components.support.base.log.logger.Logger
import mozilla.components.support.ktx.R
import mozilla.components.support.ktx.android.content.res.resolveAttribute
import mozilla.components.support.utils.ext.getPackageInfoCompat
import mozilla.components.support.utils.TorUtils
import java.io.File
/**
......@@ -109,12 +110,11 @@ fun Context.share(text: String, subject: String = getString(R.string.mozac_suppo
flags = FLAG_ACTIVITY_NEW_TASK
}
startActivity(
intent.createChooserExcludingCurrentApp(
this,
getString(R.string.mozac_support_ktx_menu_share_with),
),
)
val shareIntent = intent.createChooserExcludingCurrentApp(this, getString(R.string.mozac_support_ktx_menu_share_with)).apply {
flags = FLAG_ACTIVITY_NEW_TASK
}
TorUtils.startActivityPrompt(this, shareIntent)
true
} catch (e: ActivityNotFoundException) {
Log.log(Log.Priority.WARN, message = "No activity to share to found", throwable = e, tag = "Reference-Browser")
......@@ -221,7 +221,7 @@ fun Context.email(
flags = FLAG_ACTIVITY_NEW_TASK
}
startActivity(emailIntent)
TorUtils.startActivityPrompt(this, emailIntent)
true
} catch (e: ActivityNotFoundException) {
Logger.warn("No activity found to handle email intent", throwable = e)
......@@ -252,7 +252,7 @@ fun Context.call(
flags = FLAG_ACTIVITY_NEW_TASK
}
startActivity(callIntent)
TorUtils.startActivityPrompt(this, callIntent)
true
} catch (e: ActivityNotFoundException) {
Logger.warn("No activity found to handle dial intent", throwable = e)
......@@ -280,7 +280,7 @@ fun Context.addContact(
addFlags(FLAG_ACTIVITY_NEW_TASK)
}
startActivity(intent)
TorUtils.startActivityPrompt(this, intent)
true
} catch (e: ActivityNotFoundException) {
Logger.warn("No activity found to handle dial intent", throwable = e)
......
/* 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 mozilla.components.support.utils
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import mozilla.components.support.utils.PendingIntentUtils
object TorUtils {
const val TORBROWSER_START_ACTIVITY_PROMPT = "torbrowser_start_activity_prompt"
// Delegates showing prompt and possibly starting the activity to the main app activity.
// Highly dependant on Fenix/Tor Browser for Android.
// One downside of this implementation is that it does not throw exceptions like the
// direct context.startActivity, so the UI will behave as if the startActivity call was
// done successfully, which may not always be the case.
fun startActivityPrompt(context: Context, intent: Intent) {
val intentContainer = Intent()
intentContainer.setPackage(context.applicationContext.packageName)
intentContainer.putExtra(TORBROWSER_START_ACTIVITY_PROMPT, PendingIntent.getActivity(context, 0, intent, PendingIntentUtils.defaultFlags))
intentContainer.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intentContainer)
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment