Commit 282eda4d authored by Alex Catarineu's avatar Alex Catarineu
Browse files

Bug 40007: 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 6af46bae
......@@ -36,6 +36,7 @@ dependencies {
implementation Dependencies.kotlin_stdlib
implementation Dependencies.kotlin_coroutines
implementation project(path: ':support-utils')
testImplementation project(':support-test')
......
......@@ -67,7 +67,8 @@ class AppLinksFeature(
loadUrlUseCase?.invoke(url, session, EngineSession.LoadUrlFlags.none())
}
if (!session.private || fragmentManager == null) {
// useCases.openAppLink will now prompt: calling it directly to avoid prompting twice
if (true || !session.private || fragmentManager == null) {
doOpenApp()
return
}
......
......@@ -19,6 +19,7 @@ import mozilla.components.support.base.log.logger.Logger
import mozilla.components.support.ktx.android.content.pm.isPackageInstalled
import mozilla.components.support.ktx.android.net.isHttpOrHttps
import java.net.URISyntaxException
import mozilla.components.support.utils.TorUtils
private const val EXTRA_BROWSER_FALLBACK_URL = "browser_fallback_url"
private const val MARKET_INTENT_URI_PACKAGE_PREFIX = "market://details?id="
......@@ -200,7 +201,7 @@ class AppLinksUseCases(
if (launchInNewTask) {
it.flags = it.flags or Intent.FLAG_ACTIVITY_NEW_TASK
}
context.startActivity(it)
TorUtils.startActivityPrompt(context, it)
} catch (e: ActivityNotFoundException) {
failedToLaunchAction()
Logger.error("failed to start third party app activity", e)
......
......@@ -18,6 +18,7 @@ import mozilla.components.feature.app.links.AppLinksUseCases
import mozilla.components.support.ktx.android.content.addContact
import mozilla.components.support.ktx.android.content.share
import mozilla.components.support.ktx.kotlin.stripMailToProtocol
import mozilla.components.support.utils.TorUtils
/**
* A candidate for an item to be displayed in the context menu.
......@@ -320,7 +321,7 @@ data class ContextMenuCandidate(
context.getString(R.string.mozac_feature_contextmenu_share_link)
).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(shareIntent)
TorUtils.startActivityPrompt(context, shareIntent)
}
)
......
......@@ -70,6 +70,7 @@ import mozilla.components.support.base.log.logger.Logger
import mozilla.components.support.ktx.kotlin.sanitizeURL
import mozilla.components.support.ktx.kotlinx.coroutines.throttleLatest
import mozilla.components.support.utils.DownloadUtils
import mozilla.components.support.utils.TorUtils
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
......@@ -812,7 +813,7 @@ abstract class AbstractFetchDownloadService : Service() {
}
return try {
context.startActivity(newIntent)
TorUtils.startActivityPrompt(context, newIntent)
true
} catch (error: ActivityNotFoundException) {
false
......
......@@ -35,6 +35,7 @@ import mozilla.components.support.base.log.Log
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.TorUtils
/**
* The (visible) version name of the application, as specified by the <manifest> tag's versionName
......@@ -105,7 +106,7 @@ fun Context.share(text: String, subject: String = getString(R.string.mozac_suppo
flags = FLAG_ACTIVITY_NEW_TASK
}
startActivity(shareIntent)
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")
......@@ -136,7 +137,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)
......@@ -167,7 +168,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)
......@@ -195,7 +196,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
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, 0))
intentContainer.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intentContainer)
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment