From 7fe8bb1b3bc848dd6349e91731c83b9f54a18a05 Mon Sep 17 00:00:00 2001 From: Natalie Bunduwongse Date: Thu, 14 Mar 2024 13:50:50 +1100 Subject: [PATCH] fix: android custom tabs dismiss callback --- .../immutable/unity/ImmutableActivity.java | 57 +++++++++--------- .../Plugins/Android/ImmutableAndroid.aar | Bin 9361 -> 8066 bytes 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/Plugins/Android/ImmutableAndroid/ImmutableAndroid/src/main/java/com/immutable/unity/ImmutableActivity.java b/Plugins/Android/ImmutableAndroid/ImmutableAndroid/src/main/java/com/immutable/unity/ImmutableActivity.java index 1ef84eab..dcacfd60 100644 --- a/Plugins/Android/ImmutableAndroid/ImmutableAndroid/src/main/java/com/immutable/unity/ImmutableActivity.java +++ b/Plugins/Android/ImmutableAndroid/ImmutableAndroid/src/main/java/com/immutable/unity/ImmutableActivity.java @@ -6,8 +6,6 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -61,6 +59,16 @@ protected void onSaveInstanceState(@NonNull Bundle outState) { @Override protected void onResume() { super.onResume(); + Uri uri = getUri(); + // Determine whether user returned to this activity from a redirect or because the user cancelled + // the auth flow. If there is no response data (from RedirectActivity), it's because the + // user dismissed custom tabs, pressed the back button, or the auth flow finished without invoking + // RedirectActivity. + if (customTabsLaunched && uri != null && getIntent().getData() == null && callbackInstance != null) { + // User cancelled auth flow + callbackInstance.onCustomTabsDismissed(uri.toString()); + } + Intent authenticationIntent = getIntent(); if (!customTabsLaunched && authenticationIntent.getExtras() == null) { // This activity was launched in an unexpected way @@ -85,34 +93,29 @@ protected void onDestroy() { } } - private void launchCustomTabs() { + @Nullable + private Uri getUri() { Bundle extras = getIntent().getExtras(); - Uri uri; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - uri = extras.getParcelable(EXTRA_URI, Uri.class); + if (extras != null) { + Uri uri; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + uri = extras.getParcelable(EXTRA_URI, Uri.class); + } else { + uri = extras.getParcelable(EXTRA_URI); + } + return uri; } else { - uri = extras.getParcelable(EXTRA_URI); + return null; + } + } + + private void launchCustomTabs() { + Uri uri = getUri(); + if (uri != null) { + customTabsController = new CustomTabsController(this, new CustomTabsCallback()); + customTabsController.bindService(); + customTabsController.launch(uri); } - customTabsController = new CustomTabsController(this, new CustomTabsCallback() { - @Override - public void onNavigationEvent(int navigationEvent, @Nullable Bundle extras) { - if (navigationEvent == CustomTabsCallback.TAB_HIDDEN && callbackInstance != null) { - // Adding some delay before calling onCustomTabsDismissed as sometimes this gets called - // before the PKCE deeplink is triggered (by 100ms). This means pkceCompletionSource will be - // set to null before the SDK can use it to notify the consumer of the PKCE result. - // See PassportImpl.OnLoginPKCEDismissed and PassportImpl.OnDeepLinkActivated - final Handler handler = new Handler(Looper.getMainLooper()); - handler.postDelayed(new Runnable() { - @Override - public void run() { - callbackInstance.onCustomTabsDismissed(uri.toString()); - } - }, 1000); - } - } - }); - customTabsController.bindService(); - customTabsController.launch(uri); } private void onDeeplinkResult(@Nullable Intent intent) { diff --git a/src/Packages/Passport/Runtime/Assets/Plugins/Android/ImmutableAndroid.aar b/src/Packages/Passport/Runtime/Assets/Plugins/Android/ImmutableAndroid.aar index 4e3e1f1f5ffec607894b455908c462381510f004..c2da52af39d4b3e3852da9416bc55fe843978066 100644 GIT binary patch delta 7104 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 delta 8409 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