diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/LayoutTraversal.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/LayoutTraversal.kt index 31de1cd28..e90f4f58a 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/LayoutTraversal.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/LayoutTraversal.kt @@ -40,19 +40,37 @@ class LayoutTraversal( descriptor.getChildren(node, children) val childrenIds = mutableListOf() + + val activeChild = descriptor.getActiveChild(node) for (child in children) { // it might make sense one day to remove id from the descriptor since its always the // hash code val childDescriptor = descriptorRegister.descriptorForClassUnsafe(child::class.java).asAny() childrenIds.add(childDescriptor.getId(child)) - stack.add(child) + // if there is an active child then dont traverse it + if (activeChild == null) { + stack.add(child) + } + } + + var activeChildId: String? = null + if (activeChild != null) { + stack.add(activeChild) + activeChildId = + descriptorRegister.descriptorForClassUnsafe(activeChild.javaClass).getId(activeChild) } val attributes = mutableMapOf() descriptor.getData(node, attributes) - result.add(Node(descriptor.getId(node), descriptor.getName(node), attributes, childrenIds)) + result.add( + Node( + descriptor.getId(node), + descriptor.getName(node), + attributes, + childrenIds, + activeChildId)) } catch (exception: Exception) { Log.e(LogTag, "Error while processing node ${node.javaClass.name} ${node} ", exception) } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt index ca64f169a..0406d2803 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/core/NativeScanScheduler.kt @@ -33,13 +33,7 @@ class NativeScanScheduler(val context: Context) : Scheduler.Task { Log.d( "LAYOUT_SCHEDULER", - Thread.currentThread().name + - Looper.myLooper() + - ", produced: " + - { - nodes.count() - } + - " nodes") + "${Thread.currentThread().name}${Looper.myLooper()} produced: ${nodes.count()} nodes") return ScanResult(txId++, start, scanEnd, nodes) } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/AbstractChainedDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/AbstractChainedDescriptor.kt index 2d57d301b..51896a363 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/AbstractChainedDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/AbstractChainedDescriptor.kt @@ -34,6 +34,12 @@ abstract class AbstractChainedDescriptor : Descriptor(), ChainedDescriptor open fun onInit() {} + final override fun getActiveChild(node: T): Any? { + // ask each descriptor in the chain for an active child, if none available look up the chain + // until no more super descriptors + return onGetActiveChild(node) ?: mSuper?.getActiveChild(node) + } + /** * A globally unique ID used to identify a node in a hierarchy. If your node does not have a * globally unique ID it is fine to rely on [System.identityHashCode]. @@ -52,6 +58,8 @@ abstract class AbstractChainedDescriptor : Descriptor(), ChainedDescriptor return onGetName(node) } + abstract fun onGetActiveChild(node: T): Any? + abstract fun onGetName(node: T): String /** The children this node exposes in the inspector. */ diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ActivityDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ActivityDescriptor.kt index dcb8089a0..69d958979 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ActivityDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ActivityDescriptor.kt @@ -13,6 +13,9 @@ import com.facebook.flipper.plugins.uidebugger.stetho.FragmentCompat class ActivityDescriptor : AbstractChainedDescriptor() { override fun onInit() {} + override fun onGetActiveChild(node: Activity): Any? { + return null + } override fun onGetId(activity: Activity): String { return Integer.toString(System.identityHashCode(activity)) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt index 8fe43684f..19d6e4b68 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ApplicationRefDescriptor.kt @@ -16,6 +16,9 @@ class ApplicationRefDescriptor : AbstractChainedDescriptor() { val rootResolver = RootViewResolver() override fun onInit() {} + override fun onGetActiveChild(node: ApplicationRef): Any? { + return if (node.activitiesStack.size > 0) node.activitiesStack.last() else null + } override fun onGetId(applicationRef: ApplicationRef): String { return applicationRef.application.packageName @@ -38,7 +41,6 @@ class ApplicationRefDescriptor : AbstractChainedDescriptor() { if (activity.window.decorView == root.view) { children.add(activity) added = true - break } } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ButtonDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ButtonDescriptor.kt index e7c3af119..740e4a548 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ButtonDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ButtonDescriptor.kt @@ -26,4 +26,7 @@ class ButtonDescriptor : AbstractChainedDescriptor