diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt index 76dc83319..003c51d8b 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/UIDebuggerFlipperPlugin.kt @@ -49,6 +49,8 @@ class UIDebuggerFlipperPlugin(val context: UIDContext) : FlipperPlugin { MetadataUpdateEvent(MetadataRegister.extractPendingMetadata()))) context.treeObserverManager.start() + + context.connectionListeners.forEach { it.onConnect() } } @Throws(Exception::class) @@ -59,6 +61,8 @@ class UIDebuggerFlipperPlugin(val context: UIDContext) : FlipperPlugin { context.treeObserverManager.stop() context.bitmapPool.recycleAll() + context.connectionListeners.forEach { it.onDisconnect() } + context.clearFrameworkEvents() } override fun runInBackground(): Boolean { diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/UIDContext.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/UIDContext.kt index 3142b0193..83ed3f111 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/UIDContext.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/UIDContext.kt @@ -11,19 +11,29 @@ import android.app.Application import com.facebook.flipper.core.FlipperConnection import com.facebook.flipper.plugins.uidebugger.common.BitmapPool import com.facebook.flipper.plugins.uidebugger.descriptors.DescriptorRegister +import com.facebook.flipper.plugins.uidebugger.model.FrameworkEvent import com.facebook.flipper.plugins.uidebugger.model.FrameworkEventMetadata import com.facebook.flipper.plugins.uidebugger.observers.TreeObserverFactory import com.facebook.flipper.plugins.uidebugger.observers.TreeObserverManager import com.facebook.flipper.plugins.uidebugger.scheduler.SharedThrottle import com.facebook.flipper.plugins.uidebugger.traversal.PartialLayoutTraversal -data class UIDContext( +interface ConnectionListener { + fun onConnect() + + fun onDisconnect() +} + +class UIDContext( val applicationRef: ApplicationRef, val connectionRef: ConnectionRef, val descriptorRegister: DescriptorRegister, val observerFactory: TreeObserverFactory, - val frameworkEventMetadata: MutableList + val frameworkEventMetadata: MutableList, + val connectionListeners: MutableList, + private val pendingFrameworkEvents: MutableList ) { + val layoutTraversal: PartialLayoutTraversal = PartialLayoutTraversal(descriptorRegister, observerFactory) @@ -31,6 +41,22 @@ data class UIDContext( val sharedThrottle: SharedThrottle = SharedThrottle() val bitmapPool = BitmapPool() + fun addFrameworkEvent(frameworkEvent: FrameworkEvent) { + synchronized(pendingFrameworkEvents) { pendingFrameworkEvents.add(frameworkEvent) } + } + + fun extractPendingFrameworkEvents(): List { + synchronized(pendingFrameworkEvents) { + val copy = pendingFrameworkEvents.toList() + pendingFrameworkEvents.clear() + return copy + } + } + + fun clearFrameworkEvents() { + synchronized(pendingFrameworkEvents) { pendingFrameworkEvents.clear() } + } + companion object { fun create(application: Application): UIDContext { return UIDContext( @@ -38,7 +64,9 @@ data class UIDContext( ConnectionRef(null), descriptorRegister = DescriptorRegister.withDefaults(), observerFactory = TreeObserverFactory.withDefaults(), - frameworkEventMetadata = mutableListOf()) + frameworkEventMetadata = mutableListOf(), + connectionListeners = mutableListOf(), + pendingFrameworkEvents = mutableListOf()) } } } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/FrameworkEvents.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/FrameworkEvents.kt index 76ebbea04..c23bd0782 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/FrameworkEvents.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/FrameworkEvents.kt @@ -20,4 +20,5 @@ data class FrameworkEvent( val nodeId: Id, val type: String, val timestamp: Long, + val thread: String ) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt index 0d3722267..141adbb36 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt @@ -108,7 +108,7 @@ class TreeObserverManager(val context: UIDContext) { val workerThreadStartTimestamp = System.currentTimeMillis() val nodes = batchedUpdate.updates.flatMap { it.deferredNodes.map { it.value() } } - val frameworkEvents = batchedUpdate.updates.flatMap { it.frameworkEvents ?: listOf() } + val frameworkEvents = context.extractPendingFrameworkEvents() val snapshotUpdate = batchedUpdate.updates.find { it.snapshot != null } val deferredComputationEndTimestamp = System.currentTimeMillis()