From 43b61ab4f9598051a76d5337f10e6f3ba28c7288 Mon Sep 17 00:00:00 2001 From: Moti Zilberman Date: Wed, 17 Apr 2024 03:44:14 -0700 Subject: [PATCH 1/5] Minimal implementation of "paused in debugger" overlay Differential Revision: D56068445 --- .../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 c83c01d7b0f2..f11528dbaa14 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 98130368d4b2..3159ccb97095 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 void onReload() { @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 bd4240fff3c3..0646e89e473d 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 void openDebugger() { 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 82e36f7ad483..3c2404ae27aa 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 void handleException(Exception e) { @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 9e6d3251ab5d..802696a7069a 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 9afc9f616f10..ca793505b4f9 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 TaskInterface reload(String reason) { @DoNotStrip private void setPausedInDebuggerMessage(@Nullable String message) { - // TODO(moti): Implement this + if (message == null) { + mDevSupportManager.hidePausedInDebuggerOverlay(); + } else { + mDevSupportManager.showPausedInDebuggerOverlay(message); + } } /** From 3cfc248cc618608aad2d183a161bac09b76f4aa8 Mon Sep 17 00:00:00 2001 From: Moti Zilberman Date: Wed, 17 Apr 2024 03:44:14 -0700 Subject: [PATCH 2/5] Add Step Over and Resume buttons to pause overlay Differential Revision: D56098084 --- .../ReactAndroid/api/ReactAndroid.api | 13 +++++++--- .../facebook/react/ReactInstanceManager.java | 21 ++++++++++++++- .../ReactInstanceManagerInspectorTarget.java | 4 +++ .../devsupport/DevSupportManagerBase.java | 12 +++++++-- .../devsupport/ReleaseDevSupportManager.java | 3 ++- .../interfaces/DevSupportManager.kt | 11 +++++++- .../facebook/react/runtime/ReactHostImpl.java | 21 ++++++++++++++- .../react/runtime/ReactHostInspectorTarget.kt | 4 +++ .../ReactInstanceManagerInspectorTarget.cpp | 26 +++++++++++++++++++ .../jni/ReactInstanceManagerInspectorTarget.h | 3 +++ .../runtime/jni/JReactHostInspectorTarget.cpp | 26 +++++++++++++++++++ .../runtime/jni/JReactHostInspectorTarget.h | 7 +++-- 12 files changed, 140 insertions(+), 11 deletions(-) diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index f11528dbaa14..8cf7943de737 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -1174,6 +1174,8 @@ public class com/facebook/react/bridge/ReactIgnorableMountingException : java/la public class com/facebook/react/bridge/ReactInstanceManagerInspectorTarget : java/lang/AutoCloseable { public fun (Lcom/facebook/react/bridge/ReactInstanceManagerInspectorTarget$TargetDelegate;)V public fun close ()V + public fun sendDebuggerResumeCommand ()V + public fun sendDebuggerStepOverCommand ()V } public abstract interface class com/facebook/react/bridge/ReactInstanceManagerInspectorTarget$TargetDelegate { @@ -2150,7 +2152,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 showPausedInDebuggerOverlay (Ljava/lang/String;Lcom/facebook/react/devsupport/interfaces/DevSupportManager$PausedInDebuggerOverlayCommandListener;)V public fun startInspector ()V public fun stopInspector ()V public fun toggleElementInspector ()V @@ -2316,7 +2318,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 showPausedInDebuggerOverlay (Ljava/lang/String;Lcom/facebook/react/devsupport/interfaces/DevSupportManager$PausedInDebuggerOverlayCommandListener;)V public fun startInspector ()V public fun stopInspector ()V public fun toggleElementInspector ()V @@ -2428,7 +2430,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 showPausedInDebuggerOverlay (Ljava/lang/String;Lcom/facebook/react/devsupport/interfaces/DevSupportManager$PausedInDebuggerOverlayCommandListener;)V public abstract fun startInspector ()V public abstract fun stopInspector ()V public abstract fun toggleElementInspector ()V @@ -2439,6 +2441,11 @@ public abstract interface class com/facebook/react/devsupport/interfaces/DevSupp public abstract fun run (Ljava/lang/Runnable;)V } +public abstract interface class com/facebook/react/devsupport/interfaces/DevSupportManager$PausedInDebuggerOverlayCommandListener { + public abstract fun onResume ()V + public abstract fun onStepOver ()V +} + public abstract interface class com/facebook/react/devsupport/interfaces/ErrorCustomizer { public abstract fun customizeErrorInfo (Landroid/util/Pair;)Landroid/util/Pair; } 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 3159ccb97095..c85a737b73d3 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 @@ -87,6 +87,7 @@ import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener; import com.facebook.react.devsupport.interfaces.DevLoadingViewManager; import com.facebook.react.devsupport.interfaces.DevSupportManager; +import com.facebook.react.devsupport.interfaces.DevSupportManager.PausedInDebuggerOverlayCommandListener; import com.facebook.react.devsupport.interfaces.PackagerStatusCallback; import com.facebook.react.devsupport.interfaces.RedBoxHandler; import com.facebook.react.internal.AndroidChoreographerProvider; @@ -1505,7 +1506,25 @@ public void onSetPausedInDebuggerMessage(@Nullable String message) { if (message == null) { mDevSupportManager.hidePausedInDebuggerOverlay(); } else { - mDevSupportManager.showPausedInDebuggerOverlay(message); + mDevSupportManager.showPausedInDebuggerOverlay( + message, + new PausedInDebuggerOverlayCommandListener() { + @Override + public void onResume() { + UiThreadUtil.assertOnUiThread(); + if (mInspectorTarget != null) { + mInspectorTarget.sendDebuggerResumeCommand(); + } + } + + @Override + public void onStepOver() { + UiThreadUtil.assertOnUiThread(); + if (mInspectorTarget != null) { + mInspectorTarget.sendDebuggerStepOverCommand(); + } + } + }); } } }); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactInstanceManagerInspectorTarget.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactInstanceManagerInspectorTarget.java index 05b5e4996248..a0395cdb959c 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactInstanceManagerInspectorTarget.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactInstanceManagerInspectorTarget.java @@ -40,6 +40,10 @@ public void execute(Runnable command) { private native HybridData initHybrid(Executor executor, TargetDelegate delegate); + public native void sendDebuggerResumeCommand(); + + public native void sendDebuggerStepOverCommand(); + public void close() { mHybridData.resetNative(); } 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 0646e89e473d..160a50061635 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 @@ -1168,7 +1168,8 @@ public void openDebugger() { private @Nullable AlertDialog mPausedInDebuggerDialog; @Override - public void showPausedInDebuggerOverlay(String message) { + public void showPausedInDebuggerOverlay( + String message, PausedInDebuggerOverlayCommandListener listener) { UiThreadUtil.runOnUiThread( () -> { if (mPausedInDebuggerDialog != null) { @@ -1179,7 +1180,14 @@ public void showPausedInDebuggerOverlay(String message) { return; } mPausedInDebuggerDialog = - new AlertDialog.Builder(context).setMessage(message).setCancelable(false).create(); + new AlertDialog.Builder(context) + .setMessage(message) + .setCancelable(false) + .setNeutralButton( + "Step Over", (DialogInterface dialog, int id) -> listener.onStepOver()) + .setPositiveButton( + "Resume", (DialogInterface dialog, int id) -> listener.onResume()) + .create(); mPausedInDebuggerDialog.show(); }); } 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 3c2404ae27aa..62c71db83035 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 @@ -209,7 +209,8 @@ public void handleException(Exception e) { public void openDebugger() {} @Override - public void showPausedInDebuggerOverlay(String message) {} + public void showPausedInDebuggerOverlay( + String message, PausedInDebuggerOverlayCommandListener listener) {} @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 802696a7069a..2353d65ab194 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 @@ -106,7 +106,10 @@ public interface DevSupportManager : JSExceptionHandler { public fun openDebugger() /** Shows the "paused in debugger" overlay with the given message. */ - public fun showPausedInDebuggerOverlay(message: String) + public fun showPausedInDebuggerOverlay( + message: String, + listener: PausedInDebuggerOverlayCommandListener + ) /** Hides the "paused in debugger" overlay, if currently shown. */ public fun hidePausedInDebuggerOverlay() @@ -119,4 +122,10 @@ public interface DevSupportManager : JSExceptionHandler { public fun interface PackagerLocationCustomizer { public fun run(callback: Runnable?) } + + public interface PausedInDebuggerOverlayCommandListener { + public fun onResume() + + public fun onStepOver() + } } 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 ca793505b4f9..f2caeff7bd8c 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 @@ -53,6 +53,7 @@ import com.facebook.react.devsupport.InspectorFlags; import com.facebook.react.devsupport.ReleaseDevSupportManager; import com.facebook.react.devsupport.interfaces.DevSupportManager; +import com.facebook.react.devsupport.interfaces.DevSupportManager.PausedInDebuggerOverlayCommandListener; import com.facebook.react.fabric.ComponentFactory; import com.facebook.react.fabric.FabricUIManager; import com.facebook.react.interfaces.TaskInterface; @@ -472,7 +473,25 @@ private void setPausedInDebuggerMessage(@Nullable String message) { if (message == null) { mDevSupportManager.hidePausedInDebuggerOverlay(); } else { - mDevSupportManager.showPausedInDebuggerOverlay(message); + mDevSupportManager.showPausedInDebuggerOverlay( + message, + new PausedInDebuggerOverlayCommandListener() { + @Override + public void onResume() { + UiThreadUtil.assertOnUiThread(); + if (mReactHostInspectorTarget != null) { + mReactHostInspectorTarget.sendDebuggerResumeCommand(); + } + } + + @Override + public void onStepOver() { + UiThreadUtil.assertOnUiThread(); + if (mReactHostInspectorTarget != null) { + mReactHostInspectorTarget.sendDebuggerStepOverCommand(); + } + } + }); } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt index 6b6820d451d4..67368d673c4e 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt @@ -24,6 +24,10 @@ internal class ReactHostInspectorTarget(private val reactHostImpl: ReactHostImpl private external fun initHybrid(reactHostImpl: ReactHostImpl, executor: Executor): HybridData + public external fun sendDebuggerResumeCommand() + + public external fun sendDebuggerStepOverCommand() + override fun close() { mHybridData.resetNative() } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.cpp index 7b8ee8039c49..042e5cf934da 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.cpp @@ -78,10 +78,36 @@ ReactInstanceManagerInspectorTarget::initHybrid( return makeCxxInstance(jobj, executor, delegate); } +void ReactInstanceManagerInspectorTarget::sendDebuggerResumeCommand() { + if (inspectorTarget_) { + inspectorTarget_->sendCommand(HostCommand::DebuggerResume); + } else { + jni::throwNewJavaException( + "java/lang/IllegalStateException", + "Cannot send command while the Fusebox backend is not enabled"); + } +} + +void ReactInstanceManagerInspectorTarget::sendDebuggerStepOverCommand() { + if (inspectorTarget_) { + inspectorTarget_->sendCommand(HostCommand::DebuggerStepOver); + } else { + jni::throwNewJavaException( + "java/lang/IllegalStateException", + "Cannot send command while the Fusebox backend is not enabled"); + } +} + void ReactInstanceManagerInspectorTarget::registerNatives() { registerHybrid({ makeNativeMethod( "initHybrid", ReactInstanceManagerInspectorTarget::initHybrid), + makeNativeMethod( + "sendDebuggerResumeCommand", + ReactInstanceManagerInspectorTarget::sendDebuggerResumeCommand), + makeNativeMethod( + "sendDebuggerStepOverCommand", + ReactInstanceManagerInspectorTarget::sendDebuggerStepOverCommand), }); } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.h b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.h index 7b5791859f80..b9ec235d089a 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.h @@ -44,6 +44,9 @@ class ReactInstanceManagerInspectorTarget ReactInstanceManagerInspectorTarget::TargetDelegate::javaobject> delegate); + void sendDebuggerResumeCommand(); + void sendDebuggerStepOverCommand(); + static void registerNatives(); jsinspector_modern::HostTarget* getInspectorTarget(); diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp index 247b4002f4de..0575aba4f54e 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp @@ -63,9 +63,35 @@ JReactHostInspectorTarget::initHybrid( return makeCxxInstance(reactHostImpl, executor); } +void JReactHostInspectorTarget::sendDebuggerResumeCommand() { + if (inspectorTarget_) { + inspectorTarget_->sendCommand(HostCommand::DebuggerResume); + } else { + jni::throwNewJavaException( + "java/lang/IllegalStateException", + "Cannot send command while the Fusebox backend is not enabled"); + } +} + +void JReactHostInspectorTarget::sendDebuggerStepOverCommand() { + if (inspectorTarget_) { + inspectorTarget_->sendCommand(HostCommand::DebuggerStepOver); + } else { + jni::throwNewJavaException( + "java/lang/IllegalStateException", + "Cannot send command while the Fusebox backend is not enabled"); + } +} + void JReactHostInspectorTarget::registerNatives() { registerHybrid({ makeNativeMethod("initHybrid", JReactHostInspectorTarget::initHybrid), + makeNativeMethod( + "sendDebuggerResumeCommand", + JReactHostInspectorTarget::sendDebuggerResumeCommand), + makeNativeMethod( + "sendDebuggerStepOverCommand", + JReactHostInspectorTarget::sendDebuggerStepOverCommand), }); } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h index 84efd9ca91d1..aea5ab417328 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h @@ -53,13 +53,16 @@ class JReactHostInspectorTarget jni::alias_ref); static void registerNatives(); + void sendDebuggerResumeCommand(); + void sendDebuggerStepOverCommand(); + jsinspector_modern::HostTarget* getInspectorTarget(); + + // HostTargetDelegate methods void onReload(const PageReloadRequest& request) override; void onSetPausedInDebuggerMessage( const OverlaySetPausedInDebuggerMessageRequest&) override; - jsinspector_modern::HostTarget* getInspectorTarget(); - private: JReactHostInspectorTarget( jni::alias_ref reactHostImpl, From 3b614a7dca8a8197f0bec1cb01d48a9e3e0b4c4c Mon Sep 17 00:00:00 2001 From: Moti Zilberman Date: Wed, 17 Apr 2024 03:44:14 -0700 Subject: [PATCH 3/5] Style pause overlay to be similar to Chrome's Differential Revision: D56105051 --- .../devsupport/DevSupportManagerBase.java | 30 +++++++---- .../devsupport/drawable-hdpi/ic_resume.png | Bin 0 -> 493 bytes .../devsupport/drawable-hdpi/ic_step_over.png | Bin 0 -> 764 bytes .../devsupport/drawable-mdpi/ic_resume.png | Bin 0 -> 341 bytes .../devsupport/drawable-mdpi/ic_step_over.png | Bin 0 -> 439 bytes .../devsupport/drawable-xhdpi/ic_resume.png | Bin 0 -> 598 bytes .../drawable-xhdpi/ic_step_over.png | Bin 0 -> 908 bytes .../devsupport/drawable-xxhdpi/ic_resume.png | Bin 0 -> 950 bytes .../drawable-xxhdpi/ic_step_over.png | Bin 0 -> 1670 bytes .../devsupport/drawable-xxxhdpi/ic_resume.png | Bin 0 -> 1376 bytes .../drawable-xxxhdpi/ic_step_over.png | Bin 0 -> 2059 bytes .../res/devsupport/drawable/ripple_effect.xml | 10 ++++ .../layout/paused_in_debugger_view.xml | 50 ++++++++++++++++++ 13 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-hdpi/ic_resume.png create mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-hdpi/ic_step_over.png create mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-mdpi/ic_resume.png create mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-mdpi/ic_step_over.png create mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xhdpi/ic_resume.png create mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xhdpi/ic_step_over.png create mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xxhdpi/ic_resume.png create mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xxhdpi/ic_step_over.png create mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xxxhdpi/ic_resume.png create mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xxxhdpi/ic_step_over.png create mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable/ripple_effect.xml create mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/layout/paused_in_debugger_view.xml 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 160a50061635..897c4ed86513 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 @@ -10,6 +10,7 @@ import android.app.Activity; import android.app.ActivityManager; import android.app.AlertDialog; +import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; @@ -22,8 +23,10 @@ import android.os.Build; import android.util.Pair; import android.view.Gravity; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.Window; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.LinearLayout; @@ -1165,7 +1168,7 @@ public void openDebugger() { mCurrentContext, mApplicationContext.getString(R.string.catalyst_open_debugger_error)); } - private @Nullable AlertDialog mPausedInDebuggerDialog; + private @Nullable Dialog mPausedInDebuggerDialog; @Override public void showPausedInDebuggerOverlay( @@ -1179,15 +1182,22 @@ public void showPausedInDebuggerOverlay( if (context == null || context.isFinishing()) { return; } - mPausedInDebuggerDialog = - new AlertDialog.Builder(context) - .setMessage(message) - .setCancelable(false) - .setNeutralButton( - "Step Over", (DialogInterface dialog, int id) -> listener.onStepOver()) - .setPositiveButton( - "Resume", (DialogInterface dialog, int id) -> listener.onResume()) - .create(); + View dialogView = + LayoutInflater.from(context).inflate(R.layout.paused_in_debugger_view, null); + mPausedInDebuggerDialog = new Dialog(context); + mPausedInDebuggerDialog.setContentView(dialogView); + mPausedInDebuggerDialog.setCancelable(false); + TextView pausedText = Assertions.assertNotNull(dialogView.findViewById(R.id.paused_text)); + pausedText.setText(message); + View resumeButton = Assertions.assertNotNull(dialogView.findViewById(R.id.resume_button)); + resumeButton.setOnClickListener((v) -> listener.onResume()); + View stepOverButton = + Assertions.assertNotNull(dialogView.findViewById(R.id.step_over_button)); + stepOverButton.setOnClickListener((v) -> listener.onStepOver()); + Window dialogWindow = mPausedInDebuggerDialog.getWindow(); + if (dialogWindow != null) { + dialogWindow.setGravity(Gravity.TOP); + } mPausedInDebuggerDialog.show(); }); } diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-hdpi/ic_resume.png b/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-hdpi/ic_resume.png new file mode 100644 index 0000000000000000000000000000000000000000..36add7f936a881cf923f3a34bc16fa76c219df6c GIT binary patch literal 493 zcmVPx$r%6OXRA@u(mpw}ZK@f)LJ%bjaM9}yFc6R;&3yWyy53v+03&EJvB83*(34&l} zD_F)v3(-PU40b6cP5i<_#kkoKKMqvH<+9mJ7Wc{p!|8GH)fPfQitDjl8i zTqaQ_0&C0sM}p7}j4xb$D+s`?2RV{WC5pj5NxwYgfilFrn)iDTtpgZayczbG3ru`X zB-h%xy0qgDJemM8;=mgKSYCV zM+rNJIjhI%roPZvf2CA)rKsbfM~SElRPE;gR0^4nI|ocFtjg~kP$^_O?i?_!uqwZE jK&6oBxO2d?!m9kQ3omFu%;?%;00000NkvXXu0mjfSSiyr literal 0 HcmV?d00001 diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-hdpi/ic_step_over.png b/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-hdpi/ic_step_over.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd364d79d5576a7db3f6ef8da0781666e35dd74 GIT binary patch literal 764 zcmVPx%wn;=mRA@u(*G-6(WfTYS-)LkCVUdx7Nb4j>l%VKC1))V$w9zD8Qm1eVL20%Zz|7c>Qm1eVLk zOM&T_jfGf&r|~HM!7n(5Z}A)cE_dB?!FT|ei&wA?&*H)VY49Qr;4}P`;L2F402W~j zUc;>H=6W)H88a~l4{`g)Q+#%!Q|lvqfvZ&n6#&m*M`w@an1(-b1P5_8t@1!xYZ=xj znCSUj*ZfxOpDX}jn_zKeGJ6T{;w$`%n|+PNjD#8iF4PL*uHkw7SOGDN0>SEM@bjSODSV0-Q-#g>_n`H6 zJU0x0mpkdd$+Y=0)##7Lxc9l7gP*g}-WSI_Y{$bmjJJ}E2!g-Hf@Bx~A9QK*KK{e1 zF7pFKujdzFcb783bfnIq9QN1&qh~&j<4K&!XJUuMuK0MO0fc>C&m?)X&-+2hKD?cS zI@-(X%>NkXh}0$6ivSx57IgtI{(ows0eqed>ohhYEHZk+5=Zm%-ad9^j7FSp!{WY$ z7Ygp|qWHaxqVqdeBBt+nFs*k^H_Ajbj0ir zxPTjdorU+~3t!mkN)GUt*pK@r0>GFUtUlZTR2i(+HwCH;R_mJrRR*i|O@S(d)%vDD umBDI#Q=rOVwZ17(Ww2V`6sR&-t-l3xQf)DnmXqcH0000Px$4@pEpR9Hu2WEfz;IKcKZj5=U61V%$(@P~jy!y64)S;5WD@^WjXz}b z9%yjPx$aY;l$R9Hvt)W1tsQ5?tdmx_q!pbjDm27wMaWs6e|;iBLo7|jjh=Ah8fmJn!d zx#*BnQ;4GY7X*PgGz3CFAP9031rY^N&w(>Mi258gc@XZM?mhS3@8|PU9W2;c2`?>p8JQtYQNHu45$EKqHngkUCw) zHyoe~qv#0c{^A*a=9y~1002ovPDHLkV1mTPy37Co literal 0 HcmV?d00001 diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xhdpi/ic_resume.png b/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xhdpi/ic_resume.png new file mode 100644 index 0000000000000000000000000000000000000000..4154d5316650af847fd18483947ecf3a83fe7d89 GIT binary patch literal 598 zcmV-c0;&CpP)Px%5J^NqRCr$PnY&5@Q4oe_Hi?}ehTx^K(MRwFk{9r0?7Xa2wjzRHVWnV#R&Y80a%pYW~9|V9nfH?sv z0pD4dY77g8tr;4 zo#qxs>Om*KcL^kC9?44tB3wIDiD9pI$=QcPBwT!rSo`}E@w*@)1Owm$8kG^P6;x`Y z35nyPjkO>^1PI_u?geA9|kDBwXiJ#-c69{Hpu)S#Plf4dl+Im4s*W{;d&*;`BK!RYjO5JM)c0_ z;f?Y=4Te{m-pT}k9w&37!~y2!R!^BYK#!BTQQ`n|bE~IJ9H7U^+$eE?xw+L-CJxZ! kWNwr=z}(#GDP!+|cTw+-Q07GF=l}o!07*qoM6N<$f_cCHGynhq literal 0 HcmV?d00001 diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xhdpi/ic_step_over.png b/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xhdpi/ic_step_over.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1b26c72a425cbf0b3db979da3aaff15d3e7afa GIT binary patch literal 908 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-HD>V0QC#aSW-5 zdppDXgm0k8@%s6DPHDg2BkU=1s-cmGqjQRoFx!+Qm8B~EJQF4|Iw`T8a1c^u(@0uj z!{#KXC{#J+$=g3SpKqRf?&rIm-`7>|_e)a89vdbQ0$f;tZa#26ZPLXIre)0S4HFyk_D|Z&uE(&N z@$cS;*EE=ZF}pWZn!0_kQp%Cuu>9EHo!d>D8a^J-OvvHtT0fB|j?urt|A0b5gh5fl{iE_AFSNtKMUGjl z`u7z{wQCPnKe`yk^5U3W#qz&Q)0ot?lsw`u@a|yo`DizvQS90a{o>i8jK5=Eckx?s z>8uxilki}s^o*o%;Rfr{Uw`v=vofxFkZ-eo)t6T+{Jaf$3}qE{D!r*}bv^#Bko97yew_Iy-tkhL)+@tUj>pJ8<=jqY>Z%-bDF_a zddG}UzQT{U_SpJ2K74okd56K@myiG13h%gck41(ptU^JJ**w_clzBlsX>H=;9-Q zD;YhQvJxK$nb|P8E%k6{zN+S+YiM>>LTgXvRu%ne*GkW-IJB?oU!C!@e}4bPe66NS zCDUGd>SmVoFFPxKvBGvy+}q>qrn4F5t_}>}{8wiA!&uAz!Y)UHFE5Y_oiwv^D?8&? zhW_qFZMwqRQjBVjzx|jPpG^@vlX#+`DRzeCoe5;}E~OvHXJ*QB4BW$Y8<@QqJYD@< J);T3K0RV9HjQ#)s literal 0 HcmV?d00001 diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xxhdpi/ic_resume.png b/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xxhdpi/ic_resume.png new file mode 100644 index 0000000000000000000000000000000000000000..8982f12865e69384e5c1b5a4ec41b02939424e84 GIT binary patch literal 950 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-HD>U@q`8Z;A0L0YXfJ)$Iow z&-MJdx0W$ERG8_Qms`n$ml^LISLbqHpWb%mMWpGopqsYebdG#KRyR3?Q)2ZlB_l1R z)r+cv>wgJvHveURbY4++y}?SRrr1@TC-zuXsaG#qAF^vjwx`I%6vo+mLZ|g!Jn7S4 zyw&E)?l~r$C&e!)>{D14_r@w?UiHyGSwSu(lNuU+nui)|-n|*Ud3t}HM^lTRuz)avrN9MM_I@gV++-ojh>ZV`3eJ|s_bs+C%nZB41cJ3Q#J0GmLQ~d3> zaN!*3O9~1Rnv$kQb1gT#Zwl|Z9$8|=k~7sYRLphm#GJIhfiF*e%zE5;8aGXVm-bEiEEk84BiZ?EEKx-97%UQ(i-GrI^C1eH}9cgQe|rKYi9qI5{hi zvHls`#G|_mFW=Sv>X>hHYjXzI4a09MPI#}p%2sv%S-h_=>)Q?g7dF&OUawmp9b5RP zy;%A0`&{h>4bNI?LqBgkU3l&+&-1t&QydsYHaIHW(LH%g)^IkvYWsq_FT`}XAE?}U zw``9p&t$I9Tx58|U86z#@vO5OCvrS^`r@v5e;MnCHlN$6yL}n= zsNNLYKULW9-jw?f;%=O7FFrh%{lms7bKPr>F#SllcK@(%3)7E`q|F=e?P^%tUflcB zE~e1Gj@R)1k*vuo@qN!8zf9y)_2zxREtUA-{ZFlq^%|{5@7?Irf4Ma+t(Naced^0! n+*}O5mr*rEq9pRm60LQoanay2MvFTYcBy-E?B+9KUv8Bu`zkaM;Fi{(o`XQ(hY9X3r;>x`i<4e1h41J+#O5A-7m?3onW+Xa zOKtOT%&$%POq}j6nU-(lOZ8XB^NbBwecp$v)&8%+bUs2v2)MXJE z2wnp_@P~dFNl%JNVtw&FCJ8m&e*!>Eu7fPF&uMVct#wL}VMVusX2_K(0Hrg9F%>>Y zQK4{pQ>1*-%FD`JZ4Yn?#A2PaPIOZP>n_8+$oWO3zi@h*_;f#kt2Ew` zrGth|8rpc!G9f+pnv1d~G#CCF&ows7x+9dXf$?+#e;pKIJ_g`{{Dz?9+6VpzBx+yG zQY9Pnb+lz(fbKxskO_jaC0Ucw>@90fwENbL`3!aBi@Q|Gst4IqgX0ds^=CR5H8_Jo%YD^l@Dm66_GLw% zyT6pS^3m4W`8kcrKDP4w42$YK78NJGrQydggENDU!P1^(Z@m?teQ0m}GVGy%nlhpT z=4Y9qmslnUjx4a8R&k}&}O%I3yrrz)*vQVFiMe2)$9^oCd4mme=Ac7>D5k}owT#4yh6V6m_74O6$*-sif zTJO`8S9{~S_w4M;e?H=i`w`0?McPfv^rLeya0s00(hehYY*^@h%)Z!z0z9K2u-aw5f=72Wd(mrcYmXt zUPi^O;+SWnD^3oxTtQtoy7-kaE2zcM*Fi0e#ux&-B|1t6z^Bg+!~A m-M_i1N|U_*L!kd^;0*{-JRRD33QONS76`$^$GyQdB=c`0>;HlP literal 0 HcmV?d00001 diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xxxhdpi/ic_resume.png b/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xxxhdpi/ic_resume.png new file mode 100644 index 0000000000000000000000000000000000000000..c69f2b701e6bdae4c11957ac721139779952144a GIT binary patch literal 1376 zcmc&!=~Gh&9Q?f(0!Y9FQi-A|V6C*}sz>DzlLrQ3DiVkaQm!bmCF(d3VywlJ(2PeD1Be)d0wy&5A3DlcqIm|GSs205ez`L;+p_}rO$Ih}dHpP8$x5v1Y;q3c} zbu}xg!aIo7Whl>JiixR!LlBT!`5~w^$fXZd4 zsz1)o>gEZOyMx6bkcf@%2N4^w5MNu>GS>rYy|tZ%xqxUB5#8%1oIU6q0{v5{7zD=2 z_f8r9`v_VW&e4(W&NhUW32sPl&Awdnn76QQ-z`z|*+3(ID(dHvBeY7Qye`4B@m{%L z-{=KX_7WMNn>U>fDU8$9W~T~&FPZdSsu|Qa0|JU?VQOr!EN!48wSN3s_2Qc6Kk~X^ zOZ4qgHyH+tabFH3(N^w&UGoDxO+rz zo-TNuLQeekX#?uf@PqAVvg4U@&c*Am@0>9;SB~&Kzy-aw{nIZCx_!bQtk#wHo$0SH zFSrO9%vn2P)o8@_iQ(h^rsCk~$^q#L>dT*yQzr~P335iGSN@7@4Fe7MXOMIfgnb%eG%kfwZbI(OoO*I=Lb$6)d$ zb37iKaibO4DtbK28tb?%=_bGPpkD$;VSs3%nTOb=NoHHeM;<(0ZmKE;eFzwxm1(}W zMZI16LBdR1+bR-hQ0_974{2^yPxJWI*r^$7D<6@Jw@gP{rAcyVRh=h&qjl5b2KhE+ z3BPN8>#;y8CxVWwKah(PyOyvmv>?EWZD~yvu5O^Q&$qN>gd*x@tuBF1KQ9LT*660c zDUPsaZq&BVy-!MWfM*|nVoEj+&s?O5&k4J~T2~YHyq#Wr6yp)t3e(rZSD8-dC~G;Z z=*%qWa(je~w-vi%{s;H;O(y!Fru;nJ*!|(f(RPd+g-Pj$<}xCy#_mVjsXb$oM3$}C zbbX05FLJ0-An4>YuB?A0oBE_7U)jId9eYa#>b#jNiYXL37(P3Gd4LGPewM={ZZw!a z==>+%iwZkU4yqKJKAZ$KK%)801H82yK8lK)=xaLQT!MT91_IM%CIxZ`H|N-c#PUIp ziup(Yg2)H!zf1zPuXd>i+?;-RfdC!&AsZWrE6&eBuy%2c7_N}+|qvl>p5C} literal 0 HcmV?d00001 diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xxxhdpi/ic_step_over.png b/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xxxhdpi/ic_step_over.png new file mode 100644 index 0000000000000000000000000000000000000000..f708d64dd37bc5b271df59346945fde475e791cb GIT binary patch literal 2059 zcmdUw`6Js01IE8elQ`DU2x?Nto4A@eH#Ah+Op_*#W)g`~FH&n)ty|sZm9JIRO_|Y3 zQH;dBRx_rWDXK;0zUqit(IVw_1)*=>KVv^U&*$^o^W&4^LZcuRH5CB>Ksr!KjL+o! zKk|sr{o?GEp3i{XVo>aXI?;*u03g@tK>C&$?Y+v4SPCQ`dwK3Ji6lrBgj{#(vVqPd)FVZc5JVNT#{q%l-L>6Vtn* zonDbh6cdav^}w0q{FkSri-5vhp@JCJeFE(5+mZig3RMZ5;ADU%;1;OH(Fc>j7|6k) z^4jS&+?v&z#TtGMwkE$899EU5k>?02fRC$=qsMjJZvt|MkSXXC+zu|Y7P=2q(`+FN zh^IghJbwvT4TeH!5DDZz61J>S+2$2&-1fFK4un%Uj~=x{gwwbJ|8iGnEM#+ZRxZGG zWw8vl^3FFcCNM8I(q^n2MU0bek?qIyO4W#GxuAl3Aq;;j|0Fzn82y1?$`>UyKINcUfdEI41Th+^rU$|6{<;hBy;Yfd(hC<1yy(!Hj ztYROG)X$x0sX@_;Hl0G%xNfYl<`Ul*Am+*I)Bsq2=*o+1naO1^^WK?2RLe6=lQGgx zTcYh&UFa^z`70|nG=J9@C$tix)b98dPs5}8eOI!>t$~LMWS$MaYl!>j%=!EELsxvU z!W!Z6(xu1INu7>e;cYsC6PNSKt4B+XDr`x^Drkt3LLcT7vt-L*U+udzKzg4iT?SnPU^KkhiY-^&=c;ep067iWLm`Dw^t{`4bNgVsZ3IAn9w${ zu5!fI?ausxFi1bmt9KOd47&h`XqYv_kLTbtR6o( z5WZi9p`-+1E}4FixBb_WI{l&vc5Yk`0bL?&UB4*3@vnWX$o~N2A5Ulb>T)FSBH}#_KEMeg&OM=yIW(H0OCQp5crk)z8gFiZ68n9tMoU! zR7Uk=Y}I@A;Xj;BwKoQkadV18ieuNX4U>`5D(~QFpYN8Ir7TPO?Ln^ukAX_0LCdns z7(-R%2!v@`3+=E6M&@c?UKrWEz8ym$oGfH!y0E0YTl~zV!K_~s%n{IG@P}Qm_;|(n ziz>ezu1AE+>aH>}Dsi*=WRU# z9tL90RvQc>F|7wf$jY$#1;%Cpjj1-={AuHk|CbZr^U%bxp1ttay3>mj{q0R?bLuyh zPqnxoBLw|E7=oFs41GPLx7x(Okqac+r#zVKW@gRS)LWN8bI%&k&m_3dN_oZW<8Lt# zt9$r)AB!g~@uTf#xHwBW=w>3%yoThwxVvK?HzB8mt@X`2`vdE78coS7USOWB(2Qd1 zHl)99Cpa$lXd7|{s(Dp55XO4>fRZ5x^*eL82;fBz`X!@<^8d!)q;Z&bH=evuV8cw+ ztPF|xhnACbFmvcHsrS*kYTs$DhCnqyCvu-ccB)}UBmt5xta!8lqju(AI9&u>5Hskv mpyh8J%Cu+zF65s%vwbe9W&reCiZA~B?tlZCMyj)CC;ks)Si$@N literal 0 HcmV?d00001 diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable/ripple_effect.xml b/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable/ripple_effect.xml new file mode 100644 index 000000000000..a972afdb5ee7 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable/ripple_effect.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/layout/paused_in_debugger_view.xml b/packages/react-native/ReactAndroid/src/main/res/devsupport/layout/paused_in_debugger_view.xml new file mode 100644 index 000000000000..ce9ca6745655 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/res/devsupport/layout/paused_in_debugger_view.xml @@ -0,0 +1,50 @@ + + + + + + + + + From 291648818e54e4a35354cb2aefaa65db7d34fcc9 Mon Sep 17 00:00:00 2001 From: Moti Zilberman Date: Wed, 17 Apr 2024 03:44:14 -0700 Subject: [PATCH 4/5] Tweak pause overlay design, remove Step Over button Differential Revision: D56193523 --- .../ReactAndroid/api/ReactAndroid.api | 2 -- .../facebook/react/ReactInstanceManager.java | 8 ------ .../ReactInstanceManagerInspectorTarget.java | 2 -- .../devsupport/DevSupportManagerBase.java | 4 +-- .../interfaces/DevSupportManager.kt | 2 -- .../facebook/react/runtime/ReactHostImpl.java | 8 ------ .../react/runtime/ReactHostInspectorTarget.kt | 2 -- .../ReactInstanceManagerInspectorTarget.cpp | 13 --------- .../jni/ReactInstanceManagerInspectorTarget.h | 1 - .../runtime/jni/JReactHostInspectorTarget.cpp | 13 --------- .../runtime/jni/JReactHostInspectorTarget.h | 1 - .../devsupport/drawable-hdpi/ic_step_over.png | Bin 764 -> 0 bytes .../devsupport/drawable-mdpi/ic_step_over.png | Bin 439 -> 0 bytes .../drawable-xhdpi/ic_step_over.png | Bin 908 -> 0 bytes .../drawable-xxhdpi/ic_step_over.png | Bin 1670 -> 0 bytes .../drawable-xxxhdpi/ic_step_over.png | Bin 2059 -> 0 bytes .../paused_in_debugger_background.xml | 27 ++++++++++++++++++ .../layout/paused_in_debugger_view.xml | 18 ++---------- 18 files changed, 30 insertions(+), 71 deletions(-) delete mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-hdpi/ic_step_over.png delete mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-mdpi/ic_step_over.png delete mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xhdpi/ic_step_over.png delete mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xxhdpi/ic_step_over.png delete mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xxxhdpi/ic_step_over.png create mode 100644 packages/react-native/ReactAndroid/src/main/res/devsupport/drawable/paused_in_debugger_background.xml diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index 8cf7943de737..aadda62ceda4 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -1175,7 +1175,6 @@ public class com/facebook/react/bridge/ReactInstanceManagerInspectorTarget : jav public fun (Lcom/facebook/react/bridge/ReactInstanceManagerInspectorTarget$TargetDelegate;)V public fun close ()V public fun sendDebuggerResumeCommand ()V - public fun sendDebuggerStepOverCommand ()V } public abstract interface class com/facebook/react/bridge/ReactInstanceManagerInspectorTarget$TargetDelegate { @@ -2443,7 +2442,6 @@ public abstract interface class com/facebook/react/devsupport/interfaces/DevSupp public abstract interface class com/facebook/react/devsupport/interfaces/DevSupportManager$PausedInDebuggerOverlayCommandListener { public abstract fun onResume ()V - public abstract fun onStepOver ()V } public abstract interface class com/facebook/react/devsupport/interfaces/ErrorCustomizer { 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 c85a737b73d3..c12e171c69a8 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 @@ -1516,14 +1516,6 @@ public void onResume() { mInspectorTarget.sendDebuggerResumeCommand(); } } - - @Override - public void onStepOver() { - UiThreadUtil.assertOnUiThread(); - if (mInspectorTarget != null) { - mInspectorTarget.sendDebuggerStepOverCommand(); - } - } }); } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactInstanceManagerInspectorTarget.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactInstanceManagerInspectorTarget.java index a0395cdb959c..f99291dabad9 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactInstanceManagerInspectorTarget.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactInstanceManagerInspectorTarget.java @@ -42,8 +42,6 @@ public void execute(Runnable command) { public native void sendDebuggerResumeCommand(); - public native void sendDebuggerStepOverCommand(); - public void close() { mHybridData.resetNative(); } 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 897c4ed86513..a877ec1c30ac 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 @@ -1191,12 +1191,10 @@ public void showPausedInDebuggerOverlay( pausedText.setText(message); View resumeButton = Assertions.assertNotNull(dialogView.findViewById(R.id.resume_button)); resumeButton.setOnClickListener((v) -> listener.onResume()); - View stepOverButton = - Assertions.assertNotNull(dialogView.findViewById(R.id.step_over_button)); - stepOverButton.setOnClickListener((v) -> listener.onStepOver()); Window dialogWindow = mPausedInDebuggerDialog.getWindow(); if (dialogWindow != null) { dialogWindow.setGravity(Gravity.TOP); + dialogWindow.setBackgroundDrawableResource(R.drawable.paused_in_debugger_background); } mPausedInDebuggerDialog.show(); }); 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 2353d65ab194..c16751534e92 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 @@ -125,7 +125,5 @@ public interface DevSupportManager : JSExceptionHandler { public interface PausedInDebuggerOverlayCommandListener { public fun onResume() - - public fun onStepOver() } } 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 f2caeff7bd8c..1ac87ed7deba 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 @@ -483,14 +483,6 @@ public void onResume() { mReactHostInspectorTarget.sendDebuggerResumeCommand(); } } - - @Override - public void onStepOver() { - UiThreadUtil.assertOnUiThread(); - if (mReactHostInspectorTarget != null) { - mReactHostInspectorTarget.sendDebuggerStepOverCommand(); - } - } }); } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt index 67368d673c4e..c6f916155abd 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt @@ -26,8 +26,6 @@ internal class ReactHostInspectorTarget(private val reactHostImpl: ReactHostImpl public external fun sendDebuggerResumeCommand() - public external fun sendDebuggerStepOverCommand() - override fun close() { mHybridData.resetNative() } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.cpp index 042e5cf934da..c97907bc63de 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.cpp @@ -88,16 +88,6 @@ void ReactInstanceManagerInspectorTarget::sendDebuggerResumeCommand() { } } -void ReactInstanceManagerInspectorTarget::sendDebuggerStepOverCommand() { - if (inspectorTarget_) { - inspectorTarget_->sendCommand(HostCommand::DebuggerStepOver); - } else { - jni::throwNewJavaException( - "java/lang/IllegalStateException", - "Cannot send command while the Fusebox backend is not enabled"); - } -} - void ReactInstanceManagerInspectorTarget::registerNatives() { registerHybrid({ makeNativeMethod( @@ -105,9 +95,6 @@ void ReactInstanceManagerInspectorTarget::registerNatives() { makeNativeMethod( "sendDebuggerResumeCommand", ReactInstanceManagerInspectorTarget::sendDebuggerResumeCommand), - makeNativeMethod( - "sendDebuggerStepOverCommand", - ReactInstanceManagerInspectorTarget::sendDebuggerStepOverCommand), }); } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.h b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.h index b9ec235d089a..4aead15d30ec 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.h @@ -45,7 +45,6 @@ class ReactInstanceManagerInspectorTarget delegate); void sendDebuggerResumeCommand(); - void sendDebuggerStepOverCommand(); static void registerNatives(); diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp index 0575aba4f54e..dbcfa3f0a8b5 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp @@ -73,25 +73,12 @@ void JReactHostInspectorTarget::sendDebuggerResumeCommand() { } } -void JReactHostInspectorTarget::sendDebuggerStepOverCommand() { - if (inspectorTarget_) { - inspectorTarget_->sendCommand(HostCommand::DebuggerStepOver); - } else { - jni::throwNewJavaException( - "java/lang/IllegalStateException", - "Cannot send command while the Fusebox backend is not enabled"); - } -} - void JReactHostInspectorTarget::registerNatives() { registerHybrid({ makeNativeMethod("initHybrid", JReactHostInspectorTarget::initHybrid), makeNativeMethod( "sendDebuggerResumeCommand", JReactHostInspectorTarget::sendDebuggerResumeCommand), - makeNativeMethod( - "sendDebuggerStepOverCommand", - JReactHostInspectorTarget::sendDebuggerStepOverCommand), }); } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h index aea5ab417328..e27655793ae1 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h @@ -54,7 +54,6 @@ class JReactHostInspectorTarget static void registerNatives(); void sendDebuggerResumeCommand(); - void sendDebuggerStepOverCommand(); jsinspector_modern::HostTarget* getInspectorTarget(); diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-hdpi/ic_step_over.png b/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-hdpi/ic_step_over.png deleted file mode 100644 index 5fd364d79d5576a7db3f6ef8da0781666e35dd74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 764 zcmVPx%wn;=mRA@u(*G-6(WfTYS-)LkCVUdx7Nb4j>l%VKC1))V$w9zD8Qm1eVL20%Zz|7c>Qm1eVLk zOM&T_jfGf&r|~HM!7n(5Z}A)cE_dB?!FT|ei&wA?&*H)VY49Qr;4}P`;L2F402W~j zUc;>H=6W)H88a~l4{`g)Q+#%!Q|lvqfvZ&n6#&m*M`w@an1(-b1P5_8t@1!xYZ=xj znCSUj*ZfxOpDX}jn_zKeGJ6T{;w$`%n|+PNjD#8iF4PL*uHkw7SOGDN0>SEM@bjSODSV0-Q-#g>_n`H6 zJU0x0mpkdd$+Y=0)##7Lxc9l7gP*g}-WSI_Y{$bmjJJ}E2!g-Hf@Bx~A9QK*KK{e1 zF7pFKujdzFcb783bfnIq9QN1&qh~&j<4K&!XJUuMuK0MO0fc>C&m?)X&-+2hKD?cS zI@-(X%>NkXh}0$6ivSx57IgtI{(ows0eqed>ohhYEHZk+5=Zm%-ad9^j7FSp!{WY$ z7Ygp|qWHaxqVqdeBBt+nFs*k^H_Ajbj0ir zxPTjdorU+~3t!mkN)GUt*pK@r0>GFUtUlZTR2i(+HwCH;R_mJrRR*i|O@S(d)%vDD umBDI#Q=rOVwZ17(Ww2V`6sR&-t-l3xQf)DnmXqcH0000Px$aY;l$R9Hvt)W1tsQ5?tdmx_q!pbjDm27wMaWs6e|;iBLo7|jjh=Ah8fmJn!d zx#*BnQ;4GY7X*PgGz3CFAP9031rY^N&w(>Mi258gc@XZM?mhS3@8|PU9W2;c2`?>p8JQtYQNHu45$EKqHngkUCw) zHyoe~qv#0c{^A*a=9y~1002ovPDHLkV1mTPy37Co diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xhdpi/ic_step_over.png b/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xhdpi/ic_step_over.png deleted file mode 100644 index 5a1b26c72a425cbf0b3db979da3aaff15d3e7afa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 908 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-HD>V0QC#aSW-5 zdppDXgm0k8@%s6DPHDg2BkU=1s-cmGqjQRoFx!+Qm8B~EJQF4|Iw`T8a1c^u(@0uj z!{#KXC{#J+$=g3SpKqRf?&rIm-`7>|_e)a89vdbQ0$f;tZa#26ZPLXIre)0S4HFyk_D|Z&uE(&N z@$cS;*EE=ZF}pWZn!0_kQp%Cuu>9EHo!d>D8a^J-OvvHtT0fB|j?urt|A0b5gh5fl{iE_AFSNtKMUGjl z`u7z{wQCPnKe`yk^5U3W#qz&Q)0ot?lsw`u@a|yo`DizvQS90a{o>i8jK5=Eckx?s z>8uxilki}s^o*o%;Rfr{Uw`v=vofxFkZ-eo)t6T+{Jaf$3}qE{D!r*}bv^#Bko97yew_Iy-tkhL)+@tUj>pJ8<=jqY>Z%-bDF_a zddG}UzQT{U_SpJ2K74okd56K@myiG13h%gck41(ptU^JJ**w_clzBlsX>H=;9-Q zD;YhQvJxK$nb|P8E%k6{zN+S+YiM>>LTgXvRu%ne*GkW-IJB?oU!C!@e}4bPe66NS zCDUGd>SmVoFFPxKvBGvy+}q>qrn4F5t_}>}{8wiA!&uAz!Y)UHFE5Y_oiwv^D?8&? zhW_qFZMwqRQjBVjzx|jPpG^@vlX#+`DRzeCoe5;}E~OvHXJ*QB4BW$Y8<@QqJYD@< J);T3K0RV9HjQ#)s diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xxhdpi/ic_step_over.png b/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xxhdpi/ic_step_over.png deleted file mode 100644 index fa30e23a241fa895dab38e365c48d54ab40c748b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1670 zcmchY>pRm60LQoanay2MvFTYcBy-E?B+9KUv8Bu`zkaM;Fi{(o`XQ(hY9X3r;>x`i<4e1h41J+#O5A-7m?3onW+Xa zOKtOT%&$%POq}j6nU-(lOZ8XB^NbBwecp$v)&8%+bUs2v2)MXJE z2wnp_@P~dFNl%JNVtw&FCJ8m&e*!>Eu7fPF&uMVct#wL}VMVusX2_K(0Hrg9F%>>Y zQK4{pQ>1*-%FD`JZ4Yn?#A2PaPIOZP>n_8+$oWO3zi@h*_;f#kt2Ew` zrGth|8rpc!G9f+pnv1d~G#CCF&ows7x+9dXf$?+#e;pKIJ_g`{{Dz?9+6VpzBx+yG zQY9Pnb+lz(fbKxskO_jaC0Ucw>@90fwENbL`3!aBi@Q|Gst4IqgX0ds^=CR5H8_Jo%YD^l@Dm66_GLw% zyT6pS^3m4W`8kcrKDP4w42$YK78NJGrQydggENDU!P1^(Z@m?teQ0m}GVGy%nlhpT z=4Y9qmslnUjx4a8R&k}&}O%I3yrrz)*vQVFiMe2)$9^oCd4mme=Ac7>D5k}owT#4yh6V6m_74O6$*-sif zTJO`8S9{~S_w4M;e?H=i`w`0?McPfv^rLeya0s00(hehYY*^@h%)Z!z0z9K2u-aw5f=72Wd(mrcYmXt zUPi^O;+SWnD^3oxTtQtoy7-kaE2zcM*Fi0e#ux&-B|1t6z^Bg+!~A m-M_i1N|U_*L!kd^;0*{-JRRD33QONS76`$^$GyQdB=c`0>;HlP diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xxxhdpi/ic_step_over.png b/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable-xxxhdpi/ic_step_over.png deleted file mode 100644 index f708d64dd37bc5b271df59346945fde475e791cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2059 zcmdUw`6Js01IE8elQ`DU2x?Nto4A@eH#Ah+Op_*#W)g`~FH&n)ty|sZm9JIRO_|Y3 zQH;dBRx_rWDXK;0zUqit(IVw_1)*=>KVv^U&*$^o^W&4^LZcuRH5CB>Ksr!KjL+o! zKk|sr{o?GEp3i{XVo>aXI?;*u03g@tK>C&$?Y+v4SPCQ`dwK3Ji6lrBgj{#(vVqPd)FVZc5JVNT#{q%l-L>6Vtn* zonDbh6cdav^}w0q{FkSri-5vhp@JCJeFE(5+mZig3RMZ5;ADU%;1;OH(Fc>j7|6k) z^4jS&+?v&z#TtGMwkE$899EU5k>?02fRC$=qsMjJZvt|MkSXXC+zu|Y7P=2q(`+FN zh^IghJbwvT4TeH!5DDZz61J>S+2$2&-1fFK4un%Uj~=x{gwwbJ|8iGnEM#+ZRxZGG zWw8vl^3FFcCNM8I(q^n2MU0bek?qIyO4W#GxuAl3Aq;;j|0Fzn82y1?$`>UyKINcUfdEI41Th+^rU$|6{<;hBy;Yfd(hC<1yy(!Hj ztYROG)X$x0sX@_;Hl0G%xNfYl<`Ul*Am+*I)Bsq2=*o+1naO1^^WK?2RLe6=lQGgx zTcYh&UFa^z`70|nG=J9@C$tix)b98dPs5}8eOI!>t$~LMWS$MaYl!>j%=!EELsxvU z!W!Z6(xu1INu7>e;cYsC6PNSKt4B+XDr`x^Drkt3LLcT7vt-L*U+udzKzg4iT?SnPU^KkhiY-^&=c;ep067iWLm`Dw^t{`4bNgVsZ3IAn9w${ zu5!fI?ausxFi1bmt9KOd47&h`XqYv_kLTbtR6o( z5WZi9p`-+1E}4FixBb_WI{l&vc5Yk`0bL?&UB4*3@vnWX$o~N2A5Ulb>T)FSBH}#_KEMeg&OM=yIW(H0OCQp5crk)z8gFiZ68n9tMoU! zR7Uk=Y}I@A;Xj;BwKoQkadV18ieuNX4U>`5D(~QFpYN8Ir7TPO?Ln^ukAX_0LCdns z7(-R%2!v@`3+=E6M&@c?UKrWEz8ym$oGfH!y0E0YTl~zV!K_~s%n{IG@P}Qm_;|(n ziz>ezu1AE+>aH>}Dsi*=WRU# z9tL90RvQc>F|7wf$jY$#1;%Cpjj1-={AuHk|CbZr^U%bxp1ttay3>mj{q0R?bLuyh zPqnxoBLw|E7=oFs41GPLx7x(Okqac+r#zVKW@gRS)LWN8bI%&k&m_3dN_oZW<8Lt# zt9$r)AB!g~@uTf#xHwBW=w>3%yoThwxVvK?HzB8mt@X`2`vdE78coS7USOWB(2Qd1 zHl)99Cpa$lXd7|{s(Dp55XO4>fRZ5x^*eL82;fBz`X!@<^8d!)q;Z&bH=evuV8cw+ ztPF|xhnACbFmvcHsrS*kYTs$DhCnqyCvu-ccB)}UBmt5xta!8lqju(AI9&u>5Hskv mpyh8J%Cu+zF65s%vwbe9W&reCiZA~B?tlZCMyj)CC;ks)Si$@N diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable/paused_in_debugger_background.xml b/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable/paused_in_debugger_background.xml new file mode 100644 index 000000000000..5b1da238fc48 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/res/devsupport/drawable/paused_in_debugger_background.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + diff --git a/packages/react-native/ReactAndroid/src/main/res/devsupport/layout/paused_in_debugger_view.xml b/packages/react-native/ReactAndroid/src/main/res/devsupport/layout/paused_in_debugger_view.xml index ce9ca6745655..9d250308b050 100644 --- a/packages/react-native/ReactAndroid/src/main/res/devsupport/layout/paused_in_debugger_view.xml +++ b/packages/react-native/ReactAndroid/src/main/res/devsupport/layout/paused_in_debugger_view.xml @@ -5,12 +5,9 @@ android:id="@+id/layout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="#ffffc1" - android:divider="#cacaca" android:gravity="center" android:layoutDirection="ltr" android:orientation="horizontal" - android:showDividers="middle" tools:ignore="MissingDefaultResource" > @@ -18,10 +15,10 @@ android:id="@+id/paused_text" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingHorizontal="12dp" + android:paddingStart="14dp" android:text="" android:textColor="@android:color/black" - android:textSize="14sp" + android:textSize="16sp" android:textStyle="bold" app:autoSizeTextType="uniform" /> @@ -36,15 +33,4 @@ android:paddingVertical="8dp" android:src="@drawable/ic_resume" /> - - From 8743922e8565b7575ca60b4d186587e30e176669 Mon Sep 17 00:00:00 2001 From: Moti Zilberman Date: Wed, 17 Apr 2024 03:44:33 -0700 Subject: [PATCH 5/5] Internal API for Activity-less "Paused in debugger" overlay (#44132) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/44132 Changelog: [Breaking][Android] `DevSupportManagerFactory.create()` changed to take an additional parameter of type `PausedInDebuggerOverlayManager` (nullable) Enables integrators of React Native Android to supply their own implementation of the Fusebox "paused in debugger" overlay. This is primarily intended for legacy Meta-internal integrations that can't use the built-in implementation based on `Dialog`. **The API will likely go away once those integrations have been migrated.** Reviewed By: javache Differential Revision: D56215119 --- .../ReactAndroid/api/ReactAndroid.api | 15 +++- .../facebook/react/ReactInstanceManager.java | 7 +- .../react/ReactInstanceManagerBuilder.java | 11 ++- .../com/facebook/react/ReactNativeHost.java | 8 +- .../devsupport/BridgeDevSupportManager.java | 7 +- .../DefaultDevSupportManagerFactory.kt | 13 +++- .../devsupport/DevSupportManagerBase.java | 55 +++++--------- .../devsupport/DevSupportManagerFactory.java | 4 +- .../PausedInDebuggerOverlayDialogManager.java | 75 +++++++++++++++++++ .../PausedInDebuggerOverlayManager.kt | 19 +++++ .../runtime/BridgelessDevSupportManager.java | 3 +- 11 files changed, 163 insertions(+), 54 deletions(-) create mode 100644 packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/PausedInDebuggerOverlayDialogManager.java create mode 100644 packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/PausedInDebuggerOverlayManager.kt diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index aadda62ceda4..de9e205a7fca 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -297,6 +297,7 @@ public class com/facebook/react/ReactInstanceManagerBuilder { public fun setLazyViewManagersEnabled (Z)Lcom/facebook/react/ReactInstanceManagerBuilder; public fun setMinNumShakes (I)Lcom/facebook/react/ReactInstanceManagerBuilder; public fun setMinTimeLeftInFrameForNonBatchedOperationMs (I)Lcom/facebook/react/ReactInstanceManagerBuilder; + public fun setPausedInDebuggerOverlayManager (Lcom/facebook/react/devsupport/interfaces/PausedInDebuggerOverlayManager;)Lcom/facebook/react/ReactInstanceManagerBuilder; public fun setReactPackageTurboModuleManagerDelegateBuilder (Lcom/facebook/react/ReactPackageTurboModuleManagerDelegate$Builder;)Lcom/facebook/react/ReactInstanceManagerBuilder; public fun setRedBoxHandler (Lcom/facebook/react/devsupport/interfaces/RedBoxHandler;)Lcom/facebook/react/ReactInstanceManagerBuilder; public fun setRequireActivity (Z)Lcom/facebook/react/ReactInstanceManagerBuilder; @@ -321,6 +322,7 @@ public abstract class com/facebook/react/ReactNativeHost { protected fun getJavaScriptExecutorFactory ()Lcom/facebook/react/bridge/JavaScriptExecutorFactory; public fun getLazyViewManagersEnabled ()Z protected abstract fun getPackages ()Ljava/util/List; + protected fun getPausedInDebuggerOverlayManager ()Lcom/facebook/react/devsupport/interfaces/PausedInDebuggerOverlayManager; public fun getReactInstanceManager ()Lcom/facebook/react/ReactInstanceManager; protected fun getReactPackageTurboModuleManagerDelegateBuilder ()Lcom/facebook/react/ReactPackageTurboModuleManagerDelegate$Builder; protected fun getRedBoxHandler ()Lcom/facebook/react/devsupport/interfaces/RedBoxHandler; @@ -2031,7 +2033,7 @@ public final class com/facebook/react/defaults/DefaultTurboModuleManagerDelegate } public final class com/facebook/react/devsupport/BridgeDevSupportManager : com/facebook/react/devsupport/DevSupportManagerBase { - public fun (Landroid/content/Context;Lcom/facebook/react/devsupport/ReactInstanceDevHelper;Ljava/lang/String;ZLcom/facebook/react/devsupport/interfaces/RedBoxHandler;Lcom/facebook/react/devsupport/interfaces/DevBundleDownloadListener;ILjava/util/Map;Lcom/facebook/react/common/SurfaceDelegateFactory;Lcom/facebook/react/devsupport/interfaces/DevLoadingViewManager;)V + public fun (Landroid/content/Context;Lcom/facebook/react/devsupport/ReactInstanceDevHelper;Ljava/lang/String;ZLcom/facebook/react/devsupport/interfaces/RedBoxHandler;Lcom/facebook/react/devsupport/interfaces/DevBundleDownloadListener;ILjava/util/Map;Lcom/facebook/react/common/SurfaceDelegateFactory;Lcom/facebook/react/devsupport/interfaces/DevLoadingViewManager;Lcom/facebook/react/devsupport/interfaces/PausedInDebuggerOverlayManager;)V public fun handleReloadJS ()V public fun loadSplitBundleFromServer (Ljava/lang/String;Lcom/facebook/react/devsupport/interfaces/DevSplitBundleCallback;)V } @@ -2061,7 +2063,7 @@ public class com/facebook/react/devsupport/DefaultDevLoadingViewImplementation : public final class com/facebook/react/devsupport/DefaultDevSupportManagerFactory : com/facebook/react/devsupport/DevSupportManagerFactory { public fun ()V public final fun create (Landroid/content/Context;Lcom/facebook/react/devsupport/ReactInstanceDevHelper;Ljava/lang/String;ZI)Lcom/facebook/react/devsupport/interfaces/DevSupportManager; - public fun create (Landroid/content/Context;Lcom/facebook/react/devsupport/ReactInstanceDevHelper;Ljava/lang/String;ZLcom/facebook/react/devsupport/interfaces/RedBoxHandler;Lcom/facebook/react/devsupport/interfaces/DevBundleDownloadListener;ILjava/util/Map;Lcom/facebook/react/common/SurfaceDelegateFactory;Lcom/facebook/react/devsupport/interfaces/DevLoadingViewManager;)Lcom/facebook/react/devsupport/interfaces/DevSupportManager; + public fun create (Landroid/content/Context;Lcom/facebook/react/devsupport/ReactInstanceDevHelper;Ljava/lang/String;ZLcom/facebook/react/devsupport/interfaces/RedBoxHandler;Lcom/facebook/react/devsupport/interfaces/DevBundleDownloadListener;ILjava/util/Map;Lcom/facebook/react/common/SurfaceDelegateFactory;Lcom/facebook/react/devsupport/interfaces/DevLoadingViewManager;Lcom/facebook/react/devsupport/interfaces/PausedInDebuggerOverlayManager;)Lcom/facebook/react/devsupport/interfaces/DevSupportManager; } public class com/facebook/react/devsupport/DevServerHelper { @@ -2101,7 +2103,7 @@ public final class com/facebook/react/devsupport/DevSettingsActivity : android/p } public abstract class com/facebook/react/devsupport/DevSupportManagerBase : com/facebook/react/devsupport/interfaces/DevSupportManager { - public fun (Landroid/content/Context;Lcom/facebook/react/devsupport/ReactInstanceDevHelper;Ljava/lang/String;ZLcom/facebook/react/devsupport/interfaces/RedBoxHandler;Lcom/facebook/react/devsupport/interfaces/DevBundleDownloadListener;ILjava/util/Map;Lcom/facebook/react/common/SurfaceDelegateFactory;Lcom/facebook/react/devsupport/interfaces/DevLoadingViewManager;)V + public fun (Landroid/content/Context;Lcom/facebook/react/devsupport/ReactInstanceDevHelper;Ljava/lang/String;ZLcom/facebook/react/devsupport/interfaces/RedBoxHandler;Lcom/facebook/react/devsupport/interfaces/DevBundleDownloadListener;ILjava/util/Map;Lcom/facebook/react/common/SurfaceDelegateFactory;Lcom/facebook/react/devsupport/interfaces/DevLoadingViewManager;Lcom/facebook/react/devsupport/interfaces/PausedInDebuggerOverlayManager;)V public fun addCustomDevOption (Ljava/lang/String;Lcom/facebook/react/devsupport/interfaces/DevOptionHandler;)V public fun createRootView (Ljava/lang/String;)Landroid/view/View; public fun createSurfaceDelegate (Ljava/lang/String;)Lcom/facebook/react/common/SurfaceDelegate; @@ -2164,7 +2166,7 @@ public abstract interface class com/facebook/react/devsupport/DevSupportManagerB } public abstract interface class com/facebook/react/devsupport/DevSupportManagerFactory { - public abstract fun create (Landroid/content/Context;Lcom/facebook/react/devsupport/ReactInstanceDevHelper;Ljava/lang/String;ZLcom/facebook/react/devsupport/interfaces/RedBoxHandler;Lcom/facebook/react/devsupport/interfaces/DevBundleDownloadListener;ILjava/util/Map;Lcom/facebook/react/common/SurfaceDelegateFactory;Lcom/facebook/react/devsupport/interfaces/DevLoadingViewManager;)Lcom/facebook/react/devsupport/interfaces/DevSupportManager; + public abstract fun create (Landroid/content/Context;Lcom/facebook/react/devsupport/ReactInstanceDevHelper;Ljava/lang/String;ZLcom/facebook/react/devsupport/interfaces/RedBoxHandler;Lcom/facebook/react/devsupport/interfaces/DevBundleDownloadListener;ILjava/util/Map;Lcom/facebook/react/common/SurfaceDelegateFactory;Lcom/facebook/react/devsupport/interfaces/DevLoadingViewManager;Lcom/facebook/react/devsupport/interfaces/PausedInDebuggerOverlayManager;)Lcom/facebook/react/devsupport/interfaces/DevSupportManager; } public final class com/facebook/react/devsupport/DoubleTapReloadRecognizer { @@ -2461,6 +2463,11 @@ public abstract interface class com/facebook/react/devsupport/interfaces/Package public abstract fun onPackagerStatusFetched (Z)V } +public abstract interface class com/facebook/react/devsupport/interfaces/PausedInDebuggerOverlayManager { + public abstract fun hidePausedInDebuggerOverlay ()V + public abstract fun showPausedInDebuggerOverlay (Ljava/lang/String;Lcom/facebook/react/devsupport/interfaces/DevSupportManager$PausedInDebuggerOverlayCommandListener;)V +} + public abstract interface class com/facebook/react/devsupport/interfaces/RedBoxHandler { public abstract fun handleRedbox (Ljava/lang/String;[Lcom/facebook/react/devsupport/interfaces/StackFrame;Lcom/facebook/react/devsupport/interfaces/ErrorType;)V public abstract fun isReportEnabled ()Z 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 c12e171c69a8..59263ec77652 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 @@ -89,6 +89,7 @@ import com.facebook.react.devsupport.interfaces.DevSupportManager; import com.facebook.react.devsupport.interfaces.DevSupportManager.PausedInDebuggerOverlayCommandListener; import com.facebook.react.devsupport.interfaces.PackagerStatusCallback; +import com.facebook.react.devsupport.interfaces.PausedInDebuggerOverlayManager; import com.facebook.react.devsupport.interfaces.RedBoxHandler; import com.facebook.react.internal.AndroidChoreographerProvider; import com.facebook.react.internal.ChoreographerProvider; @@ -244,7 +245,8 @@ public static ReactInstanceManagerBuilder builder() { @Nullable ReactPackageTurboModuleManagerDelegate.Builder tmmDelegateBuilder, @Nullable SurfaceDelegateFactory surfaceDelegateFactory, @Nullable DevLoadingViewManager devLoadingViewManager, - @Nullable ChoreographerProvider choreographerProvider) { + @Nullable ChoreographerProvider choreographerProvider, + @Nullable PausedInDebuggerOverlayManager pausedInDebuggerOverlayManager) { FLog.d(TAG, "ReactInstanceManager.ctor()"); initializeSoLoaderIfNecessary(applicationContext); @@ -274,7 +276,8 @@ public static ReactInstanceManagerBuilder builder() { minNumShakes, customPackagerCommandHandlers, surfaceDelegateFactory, - devLoadingViewManager); + devLoadingViewManager, + pausedInDebuggerOverlayManager); Systrace.endSection(TRACE_TAG_REACT_JAVA_BRIDGE); mBridgeIdleDebugListener = bridgeIdleDebugListener; mLifecycleState = initialLifecycleState; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java index 018a15b3e894..87f399a979aa 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java @@ -31,6 +31,7 @@ import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener; import com.facebook.react.devsupport.interfaces.DevLoadingViewManager; import com.facebook.react.devsupport.interfaces.DevSupportManager; +import com.facebook.react.devsupport.interfaces.PausedInDebuggerOverlayManager; import com.facebook.react.devsupport.interfaces.RedBoxHandler; import com.facebook.react.internal.ChoreographerProvider; import com.facebook.react.jscexecutor.JSCExecutor; @@ -75,6 +76,7 @@ public class ReactInstanceManagerBuilder { private @Nullable DevLoadingViewManager mDevLoadingViewManager; private @Nullable JSEngineResolutionAlgorithm mJSEngineResolutionAlgorithm = null; private @Nullable ChoreographerProvider mChoreographerProvider = null; + private @Nullable PausedInDebuggerOverlayManager mPausedInDebuggerOverlayManager = null; /* package protected */ ReactInstanceManagerBuilder() {} @@ -235,6 +237,12 @@ public ReactInstanceManagerBuilder setDevLoadingViewManager( return this; } + public ReactInstanceManagerBuilder setPausedInDebuggerOverlayManager( + @Nullable PausedInDebuggerOverlayManager pausedInDebuggerOverlayManager) { + mPausedInDebuggerOverlayManager = pausedInDebuggerOverlayManager; + return this; + } + /** * Sets the initial lifecycle state of the host. For example, if the host is already resumed at * creation time, we wouldn't expect an onResume call until we get an onPause call. @@ -365,7 +373,8 @@ public ReactInstanceManager build() { mTMMDelegateBuilder, mSurfaceDelegateFactory, mDevLoadingViewManager, - mChoreographerProvider); + mChoreographerProvider, + mPausedInDebuggerOverlayManager); } private JavaScriptExecutorFactory getDefaultJSExecutorFactory( diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactNativeHost.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactNativeHost.java index 34ff53fdf83b..5566ce27603d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactNativeHost.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactNativeHost.java @@ -20,6 +20,7 @@ import com.facebook.react.common.annotations.DeprecatedInNewArchitecture; import com.facebook.react.devsupport.DevSupportManagerFactory; import com.facebook.react.devsupport.interfaces.DevLoadingViewManager; +import com.facebook.react.devsupport.interfaces.PausedInDebuggerOverlayManager; import com.facebook.react.devsupport.interfaces.RedBoxHandler; import com.facebook.react.internal.ChoreographerProvider; import java.util.List; @@ -96,7 +97,8 @@ protected ReactInstanceManagerBuilder getBaseReactInstanceManagerBuilder() { .setReactPackageTurboModuleManagerDelegateBuilder( getReactPackageTurboModuleManagerDelegateBuilder()) .setJSEngineResolutionAlgorithm(getJSEngineResolutionAlgorithm()) - .setChoreographerProvider(getChoreographerProvider()); + .setChoreographerProvider(getChoreographerProvider()) + .setPausedInDebuggerOverlayManager(getPausedInDebuggerOverlayManager()); for (ReactPackage reactPackage : getPackages()) { builder.addPackage(reactPackage); @@ -171,6 +173,10 @@ public SurfaceDelegateFactory getSurfaceDelegateFactory() { return null; } + protected @Nullable PausedInDebuggerOverlayManager getPausedInDebuggerOverlayManager() { + return null; + } + /** * Returns the name of the main module. Determines the URL used to fetch the JS bundle from Metro. * It is only used when dev support is enabled. This is the first file to be executed once the diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/BridgeDevSupportManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/BridgeDevSupportManager.java index e0f831b7a87e..923ebb4727b8 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/BridgeDevSupportManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/BridgeDevSupportManager.java @@ -29,6 +29,7 @@ import com.facebook.react.devsupport.interfaces.DevLoadingViewManager; import com.facebook.react.devsupport.interfaces.DevOptionHandler; import com.facebook.react.devsupport.interfaces.DevSplitBundleCallback; +import com.facebook.react.devsupport.interfaces.PausedInDebuggerOverlayManager; import com.facebook.react.devsupport.interfaces.RedBoxHandler; import com.facebook.react.packagerconnection.RequestHandler; import java.io.File; @@ -74,7 +75,8 @@ public BridgeDevSupportManager( int minNumShakes, @Nullable Map customPackagerCommandHandlers, @Nullable SurfaceDelegateFactory surfaceDelegateFactory, - @Nullable DevLoadingViewManager devLoadingViewManager) { + @Nullable DevLoadingViewManager devLoadingViewManager, + @Nullable PausedInDebuggerOverlayManager pausedInDebuggerOverlayManager) { super( applicationContext, reactInstanceManagerHelper, @@ -85,7 +87,8 @@ public BridgeDevSupportManager( minNumShakes, customPackagerCommandHandlers, surfaceDelegateFactory, - devLoadingViewManager); + devLoadingViewManager, + pausedInDebuggerOverlayManager); if (getDevSettings().isStartSamplingProfilerOnInit()) { // Only start the profiler. If its already running, there is an error diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DefaultDevSupportManagerFactory.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DefaultDevSupportManagerFactory.kt index 3338df014f06..ac7d5daabe8b 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DefaultDevSupportManagerFactory.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DefaultDevSupportManagerFactory.kt @@ -12,6 +12,7 @@ import com.facebook.react.common.SurfaceDelegateFactory import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener import com.facebook.react.devsupport.interfaces.DevLoadingViewManager import com.facebook.react.devsupport.interfaces.DevSupportManager +import com.facebook.react.devsupport.interfaces.PausedInDebuggerOverlayManager import com.facebook.react.devsupport.interfaces.RedBoxHandler import com.facebook.react.packagerconnection.RequestHandler @@ -25,7 +26,7 @@ public class DefaultDevSupportManagerFactory : DevSupportManagerFactory { @Deprecated( "in favor of the customisable create for DevSupportManagerFactory", ReplaceWith( - "create(applicationContext, reactInstanceManagerHelper, packagerPathForJSBundleName, enableOnCreate, redBoxHandler, devBundleDownloadListener, minNumShakes, customPackagerCommandHandlers, surfaceDelegateFactory, devLoadingViewManager)")) + "create(applicationContext, reactInstanceManagerHelper, packagerPathForJSBundleName, enableOnCreate, redBoxHandler, devBundleDownloadListener, minNumShakes, customPackagerCommandHandlers, surfaceDelegateFactory, devLoadingViewManager, pausedInDebuggerOverlayManager)")) public fun create( applicationContext: Context, reactInstanceDevHelper: ReactInstanceDevHelper, @@ -43,6 +44,7 @@ public class DefaultDevSupportManagerFactory : DevSupportManagerFactory { minNumShakes, null, null, + null, null) } @@ -56,7 +58,8 @@ public class DefaultDevSupportManagerFactory : DevSupportManagerFactory { minNumShakes: Int, customPackagerCommandHandlers: Map?, surfaceDelegateFactory: SurfaceDelegateFactory?, - devLoadingViewManager: DevLoadingViewManager? + devLoadingViewManager: DevLoadingViewManager?, + pausedInDebuggerOverlayManager: PausedInDebuggerOverlayManager? ): DevSupportManager { return if (!enableOnCreate) { ReleaseDevSupportManager() @@ -88,7 +91,8 @@ public class DefaultDevSupportManagerFactory : DevSupportManagerFactory { Int::class.javaPrimitiveType, MutableMap::class.java, SurfaceDelegateFactory::class.java, - DevLoadingViewManager::class.java) + DevLoadingViewManager::class.java, + PausedInDebuggerOverlayManager::class.java) constructor.newInstance( applicationContext, reactInstanceManagerHelper, @@ -99,7 +103,8 @@ public class DefaultDevSupportManagerFactory : DevSupportManagerFactory { minNumShakes, customPackagerCommandHandlers, surfaceDelegateFactory, - devLoadingViewManager) as DevSupportManager + devLoadingViewManager, + pausedInDebuggerOverlayManager) as DevSupportManager } catch (e: Exception) { PerftestDevSupportManager(applicationContext) } 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 a877ec1c30ac..0b66d61b407d 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 @@ -10,7 +10,6 @@ import android.app.Activity; import android.app.ActivityManager; import android.app.AlertDialog; -import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; @@ -23,10 +22,8 @@ import android.os.Build; import android.util.Pair; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.Window; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.LinearLayout; @@ -60,6 +57,7 @@ import com.facebook.react.devsupport.interfaces.ErrorCustomizer; import com.facebook.react.devsupport.interfaces.ErrorType; import com.facebook.react.devsupport.interfaces.PackagerStatusCallback; +import com.facebook.react.devsupport.interfaces.PausedInDebuggerOverlayManager; import com.facebook.react.devsupport.interfaces.RedBoxHandler; import com.facebook.react.devsupport.interfaces.StackFrame; import com.facebook.react.modules.core.RCTNativeAppEventEmitter; @@ -101,6 +99,7 @@ public interface CallbackWithBundleLoader { private final File mJSSplitBundlesDir; private final DefaultJSExceptionHandler mDefaultJSExceptionHandler; private final DevLoadingViewManager mDevLoadingViewManager; + private final PausedInDebuggerOverlayManager mPausedInDebuggerOverlayManager; private @Nullable SurfaceDelegate mRedBoxSurfaceDelegate; private @Nullable AlertDialog mDevOptionsDialog; @@ -136,7 +135,8 @@ public DevSupportManagerBase( int minNumShakes, @Nullable Map customPackagerCommandHandlers, @Nullable SurfaceDelegateFactory surfaceDelegateFactory, - @Nullable DevLoadingViewManager devLoadingViewManager) { + @Nullable DevLoadingViewManager devLoadingViewManager, + @Nullable PausedInDebuggerOverlayManager pausedInDebuggerOverlayManager) { mReactInstanceDevHelper = reactInstanceDevHelper; mApplicationContext = applicationContext; mJSAppBundleName = packagerPathForJSBundleName; @@ -193,6 +193,17 @@ public void onReceive(Context context, Intent intent) { ? devLoadingViewManager : new DefaultDevLoadingViewImplementation(reactInstanceDevHelper); mSurfaceDelegateFactory = surfaceDelegateFactory; + mPausedInDebuggerOverlayManager = + pausedInDebuggerOverlayManager != null + ? pausedInDebuggerOverlayManager + : new PausedInDebuggerOverlayDialogManager( + () -> { + Activity context = mReactInstanceDevHelper.getCurrentActivity(); + if (context == null || context.isFinishing()) { + return null; + } + return context; + }); } ; @@ -1168,46 +1179,14 @@ public void openDebugger() { mCurrentContext, mApplicationContext.getString(R.string.catalyst_open_debugger_error)); } - private @Nullable Dialog mPausedInDebuggerDialog; - @Override public void showPausedInDebuggerOverlay( String message, PausedInDebuggerOverlayCommandListener listener) { - UiThreadUtil.runOnUiThread( - () -> { - if (mPausedInDebuggerDialog != null) { - mPausedInDebuggerDialog.dismiss(); - } - Activity context = mReactInstanceDevHelper.getCurrentActivity(); - if (context == null || context.isFinishing()) { - return; - } - View dialogView = - LayoutInflater.from(context).inflate(R.layout.paused_in_debugger_view, null); - mPausedInDebuggerDialog = new Dialog(context); - mPausedInDebuggerDialog.setContentView(dialogView); - mPausedInDebuggerDialog.setCancelable(false); - TextView pausedText = Assertions.assertNotNull(dialogView.findViewById(R.id.paused_text)); - pausedText.setText(message); - View resumeButton = Assertions.assertNotNull(dialogView.findViewById(R.id.resume_button)); - resumeButton.setOnClickListener((v) -> listener.onResume()); - Window dialogWindow = mPausedInDebuggerDialog.getWindow(); - if (dialogWindow != null) { - dialogWindow.setGravity(Gravity.TOP); - dialogWindow.setBackgroundDrawableResource(R.drawable.paused_in_debugger_background); - } - mPausedInDebuggerDialog.show(); - }); + mPausedInDebuggerOverlayManager.showPausedInDebuggerOverlay(message, listener); } @Override public void hidePausedInDebuggerOverlay() { - UiThreadUtil.runOnUiThread( - () -> { - if (mPausedInDebuggerDialog != null) { - mPausedInDebuggerDialog.dismiss(); - mPausedInDebuggerDialog = null; - } - }); + mPausedInDebuggerOverlayManager.hidePausedInDebuggerOverlay(); } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerFactory.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerFactory.java index fea7416c11c2..9d0d120a16b6 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerFactory.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerFactory.java @@ -13,6 +13,7 @@ import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener; import com.facebook.react.devsupport.interfaces.DevLoadingViewManager; import com.facebook.react.devsupport.interfaces.DevSupportManager; +import com.facebook.react.devsupport.interfaces.PausedInDebuggerOverlayManager; import com.facebook.react.devsupport.interfaces.RedBoxHandler; import com.facebook.react.packagerconnection.RequestHandler; import java.util.Map; @@ -28,5 +29,6 @@ DevSupportManager create( int minNumShakes, @Nullable Map customPackagerCommandHandlers, @Nullable SurfaceDelegateFactory surfaceDelegateFactory, - @Nullable DevLoadingViewManager devLoadingViewManager); + @Nullable DevLoadingViewManager devLoadingViewManager, + @Nullable PausedInDebuggerOverlayManager pausedInDebuggerOverlayManager); } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/PausedInDebuggerOverlayDialogManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/PausedInDebuggerOverlayDialogManager.java new file mode 100644 index 000000000000..d3e9acef2dc9 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/PausedInDebuggerOverlayDialogManager.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.devsupport; + +import android.app.Dialog; +import android.content.Context; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.Window; +import android.widget.TextView; +import androidx.annotation.Nullable; +import androidx.core.util.Supplier; +import com.facebook.infer.annotation.Assertions; +import com.facebook.react.R; +import com.facebook.react.bridge.UiThreadUtil; +import com.facebook.react.devsupport.interfaces.DevSupportManager; +import com.facebook.react.devsupport.interfaces.PausedInDebuggerOverlayManager; + +/* internal */ class PausedInDebuggerOverlayDialogManager + implements PausedInDebuggerOverlayManager { + + private final Supplier mContextSupplier; + private @Nullable Dialog mPausedInDebuggerDialog; + + public PausedInDebuggerOverlayDialogManager(Supplier contextSupplier) { + mContextSupplier = contextSupplier; + } + + @Override + public void showPausedInDebuggerOverlay( + String message, DevSupportManager.PausedInDebuggerOverlayCommandListener listener) { + UiThreadUtil.runOnUiThread( + () -> { + if (mPausedInDebuggerDialog != null) { + mPausedInDebuggerDialog.dismiss(); + } + @Nullable Context context = mContextSupplier.get(); + if (context == null) { + return; + } + View dialogView = + LayoutInflater.from(context).inflate(R.layout.paused_in_debugger_view, null); + mPausedInDebuggerDialog = new Dialog(context); + mPausedInDebuggerDialog.setContentView(dialogView); + mPausedInDebuggerDialog.setCancelable(false); + TextView pausedText = Assertions.assertNotNull(dialogView.findViewById(R.id.paused_text)); + pausedText.setText(message); + View resumeButton = Assertions.assertNotNull(dialogView.findViewById(R.id.resume_button)); + resumeButton.setOnClickListener((v) -> listener.onResume()); + Window dialogWindow = mPausedInDebuggerDialog.getWindow(); + if (dialogWindow != null) { + dialogWindow.setGravity(Gravity.TOP); + dialogWindow.setBackgroundDrawableResource(R.drawable.paused_in_debugger_background); + } + 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/interfaces/PausedInDebuggerOverlayManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/PausedInDebuggerOverlayManager.kt new file mode 100644 index 000000000000..36f39e09ef46 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/PausedInDebuggerOverlayManager.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.devsupport.interfaces + +public interface PausedInDebuggerOverlayManager { + /** Shows the "paused in debugger" overlay with the given message. */ + public fun showPausedInDebuggerOverlay( + message: String, + listener: DevSupportManager.PausedInDebuggerOverlayCommandListener + ) + + /** Hides the "paused in debugger" overlay, if currently shown. */ + public fun hidePausedInDebuggerOverlay() +} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/BridgelessDevSupportManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/BridgelessDevSupportManager.java index e71937dd6d7f..fea7944e71c0 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/BridgelessDevSupportManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/BridgelessDevSupportManager.java @@ -51,7 +51,8 @@ public BridgelessDevSupportManager( 2 /* minNumShakes */, null /* customPackagerCommandHandlers */, null /* surfaceDelegateFactory */, - null /* devLoadingViewManager */); + null /* devLoadingViewManager */, + null /* pausedInDebuggerOverlayManager */); mReactHost = host; }