From 1ac3b890d8a3fc91cee2140c63ca58052bc539df Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Mon, 16 Sep 2024 06:45:53 -0700 Subject: [PATCH] add support for multiple calls to Linking.getInitialURL (#46502) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/46502 changelog: [internal] At the moment, Linking module has undocumented restriction that if you call it twice when Android Activity is not available, it will return with an error. This is unnecessary and can be handled more sensibly. Reviewed By: javache, yungsters Differential Revision: D62708123 fbshipit-source-id: 79a6beb70e834e631f7bedaf6a64076b050a7daa --- .../react/modules/intent/IntentModule.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/intent/IntentModule.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/intent/IntentModule.java index 1e285b2c6f1..4324495b07a 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/intent/IntentModule.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/intent/IntentModule.java @@ -24,12 +24,15 @@ import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableType; import com.facebook.react.module.annotations.ReactModule; +import java.util.ArrayList; +import java.util.List; /** Intent module. Launch other activities or open URLs. */ @ReactModule(name = NativeIntentAndroidSpec.NAME) public class IntentModule extends NativeIntentAndroidSpec { private @Nullable LifecycleEventListener mInitialURLListener = null; + private final List mPendingOpenURLPromises = new ArrayList<>(); private static final String EXTRA_MAP_KEY_FOR_VALUE = "value"; @@ -40,6 +43,7 @@ public class IntentModule extends NativeIntentAndroidSpec { @Override public void invalidate() { synchronized (this) { + mPendingOpenURLPromises.clear(); if (mInitialURLListener != null) { getReactApplicationContext().removeLifecycleEventListener(mInitialURLListener); mInitialURLListener = null; @@ -82,10 +86,8 @@ public class IntentModule extends NativeIntentAndroidSpec { } private synchronized void waitForActivityAndGetInitialURL(final Promise promise) { + mPendingOpenURLPromises.add(promise); if (mInitialURLListener != null) { - promise.reject( - new IllegalStateException( - "Cannot await activity from more than one call to getInitialURL")); return; } @@ -93,11 +95,14 @@ public class IntentModule extends NativeIntentAndroidSpec { new LifecycleEventListener() { @Override public void onHostResume() { - getInitialURL(promise); - getReactApplicationContext().removeLifecycleEventListener(this); synchronized (IntentModule.this) { + for (Promise promise : mPendingOpenURLPromises) { + getInitialURL(promise); + } + mInitialURLListener = null; + mPendingOpenURLPromises.clear(); } }