From 6930f3daf73c656eab703337b77cdbf5baf8897c Mon Sep 17 00:00:00 2001 From: Moti Zilberman Date: Wed, 17 Apr 2024 05:22:09 -0700 Subject: [PATCH] Minimal implementation of "paused in debugger" overlay (#44079) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/44079 Changelog: [Internal] Implements an unstyled, non-interactive version of the "paused in debugger" in-app overlay in Fusebox on Android, based on the event introduced in D56068444. The implementation in `DevSupportManagerBase` is shared across Bridge and Bridgeless. In upcoming diffs in this stack, we'll add interactive features (namely "resume" and "step over" buttons, like in Chrome) and improve the visual styling of this overlay. Reviewed By: hoxyq Differential Revision: D56068445 fbshipit-source-id: a9ac2765d29d64615751b5cdf03939e0b84d2545 --- .../ReactAndroid/api/ReactAndroid.api | 6 ++++ .../facebook/react/ReactInstanceManager.java | 6 +++- .../devsupport/DevSupportManagerBase.java | 30 +++++++++++++++++++ .../devsupport/ReleaseDevSupportManager.java | 6 ++++ .../interfaces/DevSupportManager.kt | 6 ++++ .../facebook/react/runtime/ReactHostImpl.java | 6 +++- 6 files changed, 58 insertions(+), 2 deletions(-) diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index c83c01d7b0f..f11528dbaa1 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -2130,6 +2130,7 @@ public abstract class com/facebook/react/devsupport/DevSupportManagerBase : com/ public fun handleException (Ljava/lang/Exception;)V public fun hasUpToDateJSBundleInCache ()Z protected fun hideDevLoadingView ()V + public fun hidePausedInDebuggerOverlay ()V public fun hideRedboxDialog ()V public fun isPackagerRunning (Lcom/facebook/react/devsupport/interfaces/PackagerStatusCallback;)V public fun onNewReactContextCreated (Lcom/facebook/react/bridge/ReactContext;)V @@ -2149,6 +2150,7 @@ public abstract class com/facebook/react/devsupport/DevSupportManagerBase : com/ public fun showDevOptionsDialog ()V public fun showNewJSError (Ljava/lang/String;Lcom/facebook/react/bridge/ReadableArray;I)V public fun showNewJavaError (Ljava/lang/String;Ljava/lang/Throwable;)V + public fun showPausedInDebuggerOverlay (Ljava/lang/String;)V public fun startInspector ()V public fun stopInspector ()V public fun toggleElementInspector ()V @@ -2294,6 +2296,7 @@ public class com/facebook/react/devsupport/ReleaseDevSupportManager : com/facebo public fun handleException (Ljava/lang/Exception;)V public fun handleReloadJS ()V public fun hasUpToDateJSBundleInCache ()Z + public fun hidePausedInDebuggerOverlay ()V public fun hideRedboxDialog ()V public fun isPackagerRunning (Lcom/facebook/react/devsupport/interfaces/PackagerStatusCallback;)V public fun loadSplitBundleFromServer (Ljava/lang/String;Lcom/facebook/react/devsupport/interfaces/DevSplitBundleCallback;)V @@ -2313,6 +2316,7 @@ public class com/facebook/react/devsupport/ReleaseDevSupportManager : com/facebo public fun showDevOptionsDialog ()V public fun showNewJSError (Ljava/lang/String;Lcom/facebook/react/bridge/ReadableArray;I)V public fun showNewJavaError (Ljava/lang/String;Ljava/lang/Throwable;)V + public fun showPausedInDebuggerOverlay (Ljava/lang/String;)V public fun startInspector ()V public fun stopInspector ()V public fun toggleElementInspector ()V @@ -2404,6 +2408,7 @@ public abstract interface class com/facebook/react/devsupport/interfaces/DevSupp public abstract fun getSourceUrl ()Ljava/lang/String; public abstract fun handleReloadJS ()V public abstract fun hasUpToDateJSBundleInCache ()Z + public abstract fun hidePausedInDebuggerOverlay ()V public abstract fun hideRedboxDialog ()V public abstract fun isPackagerRunning (Lcom/facebook/react/devsupport/interfaces/PackagerStatusCallback;)V public abstract fun loadSplitBundleFromServer (Ljava/lang/String;Lcom/facebook/react/devsupport/interfaces/DevSplitBundleCallback;)V @@ -2423,6 +2428,7 @@ public abstract interface class com/facebook/react/devsupport/interfaces/DevSupp public abstract fun showDevOptionsDialog ()V public abstract fun showNewJSError (Ljava/lang/String;Lcom/facebook/react/bridge/ReadableArray;I)V public abstract fun showNewJavaError (Ljava/lang/String;Ljava/lang/Throwable;)V + public abstract fun showPausedInDebuggerOverlay (Ljava/lang/String;)V public abstract fun startInspector ()V public abstract fun stopInspector ()V public abstract fun toggleElementInspector ()V diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index 98130368d4b..3159ccb9709 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -1502,7 +1502,11 @@ public class ReactInstanceManager { @Override public void onSetPausedInDebuggerMessage(@Nullable String message) { - // TODO(moti): Implement this + if (message == null) { + mDevSupportManager.hidePausedInDebuggerOverlay(); + } else { + mDevSupportManager.showPausedInDebuggerOverlay(message); + } } }); } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java index bd4240fff3c..0646e89e473 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java @@ -1164,4 +1164,34 @@ public abstract class DevSupportManagerBase implements DevSupportManager { mDevServerHelper.openDebugger( mCurrentContext, mApplicationContext.getString(R.string.catalyst_open_debugger_error)); } + + private @Nullable AlertDialog mPausedInDebuggerDialog; + + @Override + public void showPausedInDebuggerOverlay(String message) { + UiThreadUtil.runOnUiThread( + () -> { + if (mPausedInDebuggerDialog != null) { + mPausedInDebuggerDialog.dismiss(); + } + Activity context = mReactInstanceDevHelper.getCurrentActivity(); + if (context == null || context.isFinishing()) { + return; + } + mPausedInDebuggerDialog = + new AlertDialog.Builder(context).setMessage(message).setCancelable(false).create(); + mPausedInDebuggerDialog.show(); + }); + } + + @Override + public void hidePausedInDebuggerOverlay() { + UiThreadUtil.runOnUiThread( + () -> { + if (mPausedInDebuggerDialog != null) { + mPausedInDebuggerDialog.dismiss(); + mPausedInDebuggerDialog = null; + } + }); + } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/ReleaseDevSupportManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/ReleaseDevSupportManager.java index 82e36f7ad48..3c2404ae27a 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/ReleaseDevSupportManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/ReleaseDevSupportManager.java @@ -207,4 +207,10 @@ public class ReleaseDevSupportManager implements DevSupportManager { @Override public void openDebugger() {} + + @Override + public void showPausedInDebuggerOverlay(String message) {} + + @Override + public void hidePausedInDebuggerOverlay() {} } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.kt index 9e6d3251ab5..802696a7069 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.kt @@ -105,6 +105,12 @@ public interface DevSupportManager : JSExceptionHandler { /** Attempt to open the JS debugger on the host machine. */ public fun openDebugger() + /** Shows the "paused in debugger" overlay with the given message. */ + public fun showPausedInDebuggerOverlay(message: String) + + /** Hides the "paused in debugger" overlay, if currently shown. */ + public fun hidePausedInDebuggerOverlay() + /** * The PackagerLocationCustomizer allows you to have a dynamic packager location that is * determined right before loading the packager. Your customizer must call |callback|, as loading diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java index 9afc9f616f1..ca793505b4f 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java @@ -469,7 +469,11 @@ public class ReactHostImpl implements ReactHost { @DoNotStrip private void setPausedInDebuggerMessage(@Nullable String message) { - // TODO(moti): Implement this + if (message == null) { + mDevSupportManager.hidePausedInDebuggerOverlay(); + } else { + mDevSupportManager.showPausedInDebuggerOverlay(message); + } } /**