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 f3efa6cd0fc3..4324495b07ad 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.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"; @@ -39,9 +42,12 @@ public IntentModule(ReactApplicationContext reactContext) { @Override public void invalidate() { - if (mInitialURLListener != null) { - getReactApplicationContext().removeLifecycleEventListener(mInitialURLListener); - mInitialURLListener = null; + synchronized (this) { + mPendingOpenURLPromises.clear(); + if (mInitialURLListener != null) { + getReactApplicationContext().removeLifecycleEventListener(mInitialURLListener); + mInitialURLListener = null; + } } super.invalidate(); } @@ -79,11 +85,9 @@ public void getInitialURL(Promise promise) { } } - private void waitForActivityAndGetInitialURL(final Promise promise) { + 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; } @@ -91,10 +95,15 @@ private void waitForActivityAndGetInitialURL(final Promise promise) { new LifecycleEventListener() { @Override public void onHostResume() { - getInitialURL(promise); - getReactApplicationContext().removeLifecycleEventListener(this); - mInitialURLListener = null; + synchronized (IntentModule.this) { + for (Promise promise : mPendingOpenURLPromises) { + getInitialURL(promise); + } + + mInitialURLListener = null; + mPendingOpenURLPromises.clear(); + } } @Override