diff --git a/react-native/react-native-flipper/android/src/main/java/com/facebook/flipper/reactnative/FlipperModule.java b/react-native/react-native-flipper/android/src/main/java/com/facebook/flipper/reactnative/FlipperModule.java index b18a3fb80..3e7b96b62 100644 --- a/react-native/react-native-flipper/android/src/main/java/com/facebook/flipper/reactnative/FlipperModule.java +++ b/react-native/react-native-flipper/android/src/main/java/com/facebook/flipper/reactnative/FlipperModule.java @@ -7,6 +7,7 @@ package com.facebook.flipper.reactnative; +import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; @@ -40,8 +41,9 @@ public class FlipperModule extends ReactContextBaseJavaModule { } @ReactMethod - public void registerPlugin(final String pluginId, final Boolean inBackground) { - this.manager.registerPlugin(this, pluginId, inBackground); + public void registerPlugin( + final String pluginId, final Boolean inBackground, final Callback statusCallback) { + this.manager.registerPlugin(this, pluginId, inBackground, statusCallback); } @ReactMethod diff --git a/react-native/react-native-flipper/android/src/main/java/com/facebook/flipper/reactnative/FlipperReactNativeJavaScriptPluginManager.java b/react-native/react-native-flipper/android/src/main/java/com/facebook/flipper/reactnative/FlipperReactNativeJavaScriptPluginManager.java index 0abdd4c83..3601f3bd9 100644 --- a/react-native/react-native-flipper/android/src/main/java/com/facebook/flipper/reactnative/FlipperReactNativeJavaScriptPluginManager.java +++ b/react-native/react-native-flipper/android/src/main/java/com/facebook/flipper/reactnative/FlipperReactNativeJavaScriptPluginManager.java @@ -12,6 +12,7 @@ import com.facebook.flipper.core.FlipperArray; import com.facebook.flipper.core.FlipperClient; import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.core.FlipperResponder; +import com.facebook.react.bridge.Callback; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; @@ -51,7 +52,15 @@ public class FlipperReactNativeJavaScriptPluginManager { } public void registerPlugin( - FlipperModule module, final String pluginId, final Boolean inBackground) { + FlipperModule module, + final String pluginId, + final Boolean inBackground, + final Callback statusCallback) { + if (this.flipperClient == null) { + // Flipper is not available in this build + statusCallback.invoke("noflipper"); + return; + } FlipperReactNativeJavaScriptPlugin existing = getPlugin(pluginId); if (existing != null) { // Make sure events are emitted on the right application context @@ -60,6 +69,7 @@ public class FlipperReactNativeJavaScriptPluginManager { if (existing.isConnected()) { existing.fireOnConnect(); } + statusCallback.invoke("ok"); return; } // we always create a new plugin class on the fly, @@ -69,6 +79,7 @@ public class FlipperReactNativeJavaScriptPluginManager { // inner class with no new members }; this.flipperClient.addPlugin(plugin); + statusCallback.invoke("ok"); } public void send(String pluginId, String method, String data) { diff --git a/react-native/react-native-flipper/index.d.ts b/react-native/react-native-flipper/index.d.ts index e77195d5b..309e7ffc7 100644 --- a/react-native/react-native-flipper/index.d.ts +++ b/react-native/react-native-flipper/index.d.ts @@ -64,6 +64,7 @@ declare module 'Flipper' { export function registerPlugin( pluginId: string, runInBackground: boolean, + statusCallback: (status: 'noflipper' | 'ok') => void, ): void; export function send(pluginId: string, method: string, data: string): void; export function reportErrorWithMetadata( diff --git a/react-native/react-native-flipper/index.js b/react-native/react-native-flipper/index.js index ac406cf36..3d485f7b2 100644 --- a/react-native/react-native-flipper/index.js +++ b/react-native/react-native-flipper/index.js @@ -125,6 +125,10 @@ function startEventListeners() { // $FlowFixMe export function addPlugin(plugin) { + if (!Flipper) { + printNoFlipperWarning(); + return; + } if (!plugin || typeof plugin !== 'object') { throw new Error('Expected plugin, got ' + plugin); } @@ -141,7 +145,22 @@ export function addPlugin(plugin) { plugin._connection = new Connection(id); plugins[id] = plugin; - Flipper.registerPlugin(id, runInBackground); + Flipper.registerPlugin(id, runInBackground, status => { + if (status === 'noflipper') { + printNoFlipperWarning(); + } + }); } -startEventListeners(); +function printNoFlipperWarning() { + // $FlowFixMe + if (typeof __DEV__ !== 'undefined' && __DEV__) { + console.warn( + 'The native module for Flipper seems unavailable. Make sure `initializeFlipper(this, getReactNativeHost().getReactInstanceManager()` is called in MainApplication.java:onCreate, and that `react-native-flipper` is installed as yarn dependency', + ); + } +} + +if (Flipper) { + startEventListeners(); +}