From f5d9fbe91c72daa97e0bbbc184a99db9671dd653 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Fri, 1 Dec 2023 10:41:30 -0500 Subject: [PATCH] Allow deeplinks back into Signal from iDEAL banking apps. --- app/src/main/AndroidManifest.xml | 7 +++++ .../thoughtcrime/securesms/MainActivity.java | 28 +++++++++++++------ .../java/org/signal/donations/StripeApi.kt | 6 ++-- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1a35897d0c..a7f2da4bc5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -594,6 +594,13 @@ android:host="signal.group"/> + + + + + + + diff --git a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.java b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.java index e432c051ce..32c102bb98 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.java @@ -17,8 +17,11 @@ import androidx.lifecycle.ViewModelProvider; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import org.signal.core.util.concurrent.LifecycleDisposable; +import org.signal.core.util.logging.Log; +import org.signal.donations.StripeApi; import org.thoughtcrime.securesms.components.DebugLogsPromptDialogFragment; import org.thoughtcrime.securesms.components.PromptBatterySaverDialogFragment; +import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity; import org.thoughtcrime.securesms.components.voice.VoiceNoteMediaController; import org.thoughtcrime.securesms.components.voice.VoiceNoteMediaControllerOwner; import org.thoughtcrime.securesms.conversationlist.RelinkDevicesReminderBottomSheetFragment; @@ -89,10 +92,7 @@ public class MainActivity extends PassphraseRequiredActivity implements VoiceNot ConversationListTabRepository repository = new ConversationListTabRepository(); ConversationListTabsViewModel.Factory factory = new ConversationListTabsViewModel.Factory(repository); - handleGroupLinkInIntent(getIntent()); - handleProxyInIntent(getIntent()); - handleSignalMeIntent(getIntent()); - handleCallLinkInIntent(getIntent()); + handleDeeplinkIntent(getIntent()); CachedInflater.from(this).clear(); @@ -134,10 +134,7 @@ public class MainActivity extends PassphraseRequiredActivity implements VoiceNot @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); - handleGroupLinkInIntent(intent); - handleProxyInIntent(intent); - handleSignalMeIntent(intent); - handleCallLinkInIntent(intent); + handleDeeplinkIntent(intent); } @Override @@ -203,6 +200,14 @@ public class MainActivity extends PassphraseRequiredActivity implements VoiceNot return navigator; } + private void handleDeeplinkIntent(Intent intent) { + handleGroupLinkInIntent(intent); + handleProxyInIntent(intent); + handleSignalMeIntent(intent); + handleCallLinkInIntent(intent); + handleDonateReturnIntent(intent); + } + private void handleGroupLinkInIntent(Intent intent) { Uri data = intent.getData(); if (data != null) { @@ -231,6 +236,13 @@ public class MainActivity extends PassphraseRequiredActivity implements VoiceNot } } + private void handleDonateReturnIntent(Intent intent) { + Uri data = intent.getData(); + if (data != null && data.toString().startsWith(StripeApi.RETURN_URL_IDEAL)) { + startActivity(AppSettingsActivity.manageSubscriptions(this)); + } + } + public void onFirstRender() { onFirstRender = true; } diff --git a/donations/lib/src/main/java/org/signal/donations/StripeApi.kt b/donations/lib/src/main/java/org/signal/donations/StripeApi.kt index bb5439929f..0ec6a7d3c2 100644 --- a/donations/lib/src/main/java/org/signal/donations/StripeApi.kt +++ b/donations/lib/src/main/java/org/signal/donations/StripeApi.kt @@ -44,6 +44,8 @@ class StripeApi( const val RETURN_URL_SCHEME = "sgnlpay" private const val RETURN_URL_3DS = "$RETURN_URL_SCHEME://3DS" + + const val RETURN_URL_IDEAL = "https://signaldonations.org/stripe/return/ideal" } sealed class CreatePaymentIntentResult { @@ -74,7 +76,7 @@ class StripeApi( val parameters = mutableMapOf( "client_secret" to setupIntent.intentClientSecret, "payment_method" to paymentMethodId, - "return_url" to RETURN_URL_3DS + "return_url" to if (paymentSource is IDEALPaymentSource) RETURN_URL_IDEAL else RETURN_URL_3DS ) if (paymentSource.type.isBankTransfer) { @@ -122,7 +124,7 @@ class StripeApi( val parameters = mutableMapOf( "client_secret" to paymentIntent.intentClientSecret, "payment_method" to paymentMethodId, - "return_url" to RETURN_URL_3DS + "return_url" to if (paymentSource is IDEALPaymentSource) RETURN_URL_IDEAL else RETURN_URL_3DS ) if (paymentSource.type.isBankTransfer) {