From d28ee162e38a792cb8b919e6536740a72b5a35aa Mon Sep 17 00:00:00 2001 From: Alex Hunt Date: Fri, 12 Sep 2025 06:51:53 -0700 Subject: [PATCH] Restore background tracing touch target (#53753) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/53753 Changelog: [Internal] Reviewed By: rubennorte Differential Revision: D82302063 fbshipit-source-id: 25c99c2449fd72b81ce3ac25473c41304993cbc1 --- .../react/devsupport/DevSupportManagerBase.kt | 1 + .../perfmonitor/PerfMonitorOverlayManager.kt | 18 +++++++++++++++++- .../perfmonitor/PerfMonitorOverlayView.kt | 16 +++------------- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.kt index 6cd5ec9d1d0..dd5540b41e5 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.kt @@ -229,6 +229,7 @@ public abstract class DevSupportManagerBase( } context }, + { openDebugger(DebuggerFrontendPanelName.PERFORMANCE.toString()) }, ) } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayManager.kt index 23e47b9e114..fd2ccd83707 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayManager.kt @@ -15,10 +15,12 @@ import javax.inject.Provider internal class PerfMonitorOverlayManager( private val devHelper: PerfMonitorDevHelper, private val contextProvider: Provider, + private val onRequestOpenDevTools: () -> Unit, ) : PerfMonitorUpdateListener { private var enabled: Boolean = false private var initialized: Boolean = false private var view: PerfMonitorOverlayView? = null + private var tracingState: TracingState = TracingState.ENABLEDINCDPMODE private fun init() { if (initialized || !enabled) { @@ -27,7 +29,7 @@ internal class PerfMonitorOverlayManager( UiThreadUtil.runOnUiThread { val context = contextProvider.get() ?: return@runOnUiThread - view = PerfMonitorOverlayView(context) + view = PerfMonitorOverlayView(context, ::handleRecordingButtonPress) // Start background tracing devHelper.inspectorTarget?.resumeBackgroundTrace() @@ -59,6 +61,20 @@ internal class PerfMonitorOverlayManager( } override fun onRecordingStateChanged(state: TracingState) { + tracingState = state view?.updateRecordingState(state) } + + private fun handleRecordingButtonPress() { + when (tracingState) { + TracingState.ENABLEDINBACKGROUNDMODE -> { + devHelper.inspectorTarget?.pauseAndAnalyzeBackgroundTrace() + onRequestOpenDevTools() + } + TracingState.DISABLED -> { + devHelper.inspectorTarget?.resumeBackgroundTrace() + } + TracingState.ENABLEDINCDPMODE -> Unit + } + } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayView.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayView.kt index 381f0d27de0..e0b2fbd1c27 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayView.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayView.kt @@ -27,6 +27,7 @@ import com.facebook.react.uimanager.PixelUtil internal class PerfMonitorOverlayView( private val context: Context, + private val onButtonPress: () -> Unit, ) { private val dialog: Dialog private lateinit var statusLabel: TextView @@ -101,22 +102,11 @@ internal class PerfMonitorOverlayView( textContainer.addView(tooltipLabel) val containerLayout = createInnerLayout() + containerLayout.setOnClickListener { onButtonPress() } containerLayout.addView(statusIndicator) containerLayout.addView(textContainer) - val dialog = - createAnchoredDialog(dpToPx(12f), dpToPx(12f)).apply { setContentView(containerLayout) } - dialog.window?.apply { - attributes = - attributes?.apply { - flags = - flags or - WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE or - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE - } - } - - return dialog + return createAnchoredDialog(dpToPx(12f), dpToPx(12f)).apply { setContentView(containerLayout) } } private fun createAnchoredDialog(offsetX: Float, offsetY: Float): Dialog {