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 e6ac477e44c..f6f4faa3bf6 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 @@ -78,7 +78,6 @@ import java.io.File import java.net.MalformedURLException import java.net.URL import java.util.Locale -import javax.inject.Provider public abstract class DevSupportManagerBase( protected val applicationContext: Context, @@ -185,6 +184,7 @@ public abstract class DevSupportManagerBase( } private var perfMonitorOverlayManager: PerfMonitorOverlayManager? = null + private var perfMonitorInitialized = false private var tracingStateProvider: TracingStateProvider? = null init { @@ -222,13 +222,6 @@ public abstract class DevSupportManagerBase( perfMonitorOverlayManager = PerfMonitorOverlayManager( reactInstanceDevHelper, - Provider { - val context = reactInstanceDevHelper.currentActivity - if (context == null || context.isFinishing) { - return@Provider null - } - context - }, { openDebugger(DebuggerFrontendPanelName.PERFORMANCE.toString()) }, ) } @@ -552,14 +545,16 @@ public abstract class DevSupportManagerBase( } override fun onNewReactContextCreated(reactContext: ReactContext) { - resetCurrentContext(reactContext) - - if (reactInstanceDevHelper is PerfMonitorDevHelper) { + if (!perfMonitorInitialized && reactInstanceDevHelper is PerfMonitorDevHelper) { perfMonitorOverlayManager?.let { manager -> reactInstanceDevHelper.inspectorTarget?.addPerfMonitorListener(manager) } perfMonitorOverlayManager?.enable() + perfMonitorOverlayManager?.startBackgroundTrace() + perfMonitorInitialized = true } + + resetCurrentContext(reactContext) } override fun onReactInstanceDestroyed(reactContext: ReactContext) { @@ -877,8 +872,6 @@ public abstract class DevSupportManagerBase( devLoadingViewManager?.showMessage("Reloading...") } - perfMonitorOverlayManager?.reset() - devServerHelper.openPackagerConnection( javaClass.simpleName, object : PackagerCommandListener { @@ -928,7 +921,7 @@ public abstract class DevSupportManagerBase( hideRedboxDialog() hideDevOptionsDialog() devLoadingViewManager?.hide() - perfMonitorOverlayManager?.reset() + perfMonitorOverlayManager?.disable() devServerHelper.closePackagerConnection() } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorDevHelper.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorDevHelper.kt index 86e39ad3921..8d24ff3154f 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorDevHelper.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorDevHelper.kt @@ -7,11 +7,15 @@ package com.facebook.react.devsupport.perfmonitor +import android.app.Activity + /** * Interface implemented by [com.facebook.react.runtime.ReactHostImplDevHelper] exposing additional * hooks used to implement the V2 Perf Monitor overlay (experimental). */ internal interface PerfMonitorDevHelper { + public val currentActivity: Activity? + /** * The inspector target object. Matches the lifetime of the ReactHost. May be null if modern JS * debugging is disabled. 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 9773eb34cb1..9442152e3c9 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 @@ -7,42 +7,24 @@ package com.facebook.react.devsupport.perfmonitor -import android.content.Context import com.facebook.react.bridge.UiThreadUtil import com.facebook.react.devsupport.interfaces.TracingState -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) { - return - } - - UiThreadUtil.runOnUiThread { - val context = contextProvider.get() ?: return@runOnUiThread - view = PerfMonitorOverlayView(context, ::handleRecordingButtonPress) - - // Start background tracing - devHelper.inspectorTarget?.resumeBackgroundTrace() - - view?.show() - initialized = true - } - } - - /** Enable the Perf Monitor overlay. Will be shown when updates are received. */ + /** Enable the Perf Monitor overlay. */ fun enable() { enabled = true - init() + UiThreadUtil.runOnUiThread { + val context = devHelper.currentActivity ?: return@runOnUiThread + view = PerfMonitorOverlayView(context, ::handleRecordingButtonPress) + } } /** Disable the Perf Monitor overlay. Will remain hidden when updates are received. */ @@ -52,24 +34,31 @@ internal class PerfMonitorOverlayManager( enabled = false } - /** Reset the Perf Monitor overlay, e.g. after a reload. */ - fun reset() { - // Update with current recording state - onRecordingStateChanged( - devHelper.inspectorTarget?.getTracingState() ?: TracingState.ENABLEDINCDPMODE - ) + /** Start background trace recording. */ + fun startBackgroundTrace() { + if (!enabled) { + return + } + + devHelper.inspectorTarget?.let { target -> + target.resumeBackgroundTrace() + onRecordingStateChanged(target.getTracingState()) + } } override fun onRecordingStateChanged(state: TracingState) { tracingState = state - view?.updateRecordingState(state) + UiThreadUtil.runOnUiThread { + view?.updateRecordingState(state) + view?.show() + } } private fun handleRecordingButtonPress() { when (tracingState) { TracingState.ENABLEDINBACKGROUNDMODE -> { - devHelper.inspectorTarget?.let { - if (!it.pauseAndAnalyzeBackgroundTrace()) { + devHelper.inspectorTarget?.let { target -> + if (!target.pauseAndAnalyzeBackgroundTrace()) { onRequestOpenDevTools() } }