Skip to content

Commit

Permalink
Adjust how we external nav for ideal donations.
Browse files Browse the repository at this point in the history
  • Loading branch information
alex-signal authored and greyson-signal committed Feb 12, 2025
1 parent 8013da6 commit 86fa653
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import android.content.Intent
import android.net.Uri
import android.widget.Toast
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.signal.core.util.isNotNullOrBlank
import org.signal.core.util.logging.Log
import org.signal.donations.StripeApi
import org.thoughtcrime.securesms.R

Expand All @@ -20,6 +22,8 @@ import org.thoughtcrime.securesms.R
*/
object ExternalNavigationHelper {

private val TAG = Log.tag(ExternalNavigationHelper::class)

fun maybeLaunchExternalNavigationIntent(context: Context, webRequestUri: Uri?, launchIntent: (Intent) -> Unit): Boolean {
val url = webRequestUri ?: return false
if (url.scheme?.startsWith("http") == true || url.scheme == StripeApi.RETURN_URL_SCHEME) {
Expand All @@ -37,55 +41,19 @@ object ExternalNavigationHelper {
}

private fun attemptIntentLaunch(context: Context, url: Uri, launchIntent: (Intent) -> Unit) {
val intent = Intent(Intent.ACTION_VIEW, url)
val intent = Intent.parseUri(url.toString(), Intent.URI_INTENT_SCHEME)
try {
launchIntent(intent)
} catch (e: ActivityNotFoundException) {
// Parses intent:// schema uris according to https://developer.chrome.com/docs/multidevice/android/intents/

if (url.scheme?.equals("intent") == true) {
val fragmentParts: Map<String, String?> = url.fragment
?.split(";")
?.associate {
val parts = it.split('=', limit = 2)

if (parts.size > 1) {
parts[0] to parts[1]
} else {
parts[0] to null
}
} ?: emptyMap()

val fallbackUri = fragmentParts["S.browser_fallback_url"]?.let { Uri.parse(it) }
Log.w(TAG, "Cannot find activity for intent. Checking for fallback URL.", e)

val packageId: String? = if (looksLikeAMarketLink(fallbackUri)) {
fallbackUri!!.getQueryParameter("id")
} else {
fragmentParts["package"]
}

if (!packageId.isNullOrBlank()) {
try {
launchIntent(
Intent(
Intent.ACTION_VIEW,
Uri.parse("market://details?id=$packageId")
)
)
} catch (e: ActivityNotFoundException) {
toastOnActivityNotFound(context)
}
} else if (fallbackUri != null) {
try {
launchIntent(
Intent(
Intent.ACTION_VIEW,
fallbackUri
)
)
} catch (e: ActivityNotFoundException) {
toastOnActivityNotFound(context)
}
val fallback = intent.getStringExtra("browser_fallback_url")
if (fallback.isNotNullOrBlank()) {
try {
launchIntent(Intent.parseUri(fallback, Intent.URI_INTENT_SCHEME))
} catch (e: ActivityNotFoundException) {
Log.w(TAG, "Failed to launch fallback URL.", e)
toastOnActivityNotFound(context)
}
}
}
Expand All @@ -94,8 +62,4 @@ object ExternalNavigationHelper {
private fun toastOnActivityNotFound(context: Context) {
Toast.makeText(context, R.string.CommunicationActions_no_browser_found, Toast.LENGTH_SHORT).show()
}

private fun looksLikeAMarketLink(uri: Uri?): Boolean {
return uri != null && uri.host == "play.google.com" && uri.getQueryParameter("id") != null
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,12 @@ class Stripe3DSDialogFragment : DialogFragment(R.layout.donation_webview_fragmen
gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
}
setOnClickListener {
handleLaunchExternal(Intent(Intent.ACTION_VIEW, args.uri))
ExternalNavigationHelper.maybeLaunchExternalNavigationIntent(
context,
args.uri
) {
handleLaunchExternal(it)
}
}
}
binding.root.addView(openApp)
Expand Down

0 comments on commit 86fa653

Please sign in to comment.