From c76c993ce49f7d5b8c4c4d319f599e05c2df5a31 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 12 Sep 2022 03:48:43 -0700 Subject: [PATCH] Introduced concept of active child Summary: A node can have an active child, if present we assume all others are inactive and we don't traverse them. This means the activities not on top and view pager views not active will not be scanned. Additionally on the desktop we are automatically collapsing these views. The net result is a lot less work done on the main thread Reviewed By: lblasa Differential Revision: D39310126 fbshipit-source-id: ebd0c69d46f2d42fe42e678c8327fcdc73d08385 --- .../uidebugger/core/LayoutTraversal.kt | 22 +++++++++++++-- .../uidebugger/core/NativeScanScheduler.kt | 8 +----- .../descriptors/AbstractChainedDescriptor.kt | 8 ++++++ .../descriptors/ActivityDescriptor.kt | 3 +++ .../descriptors/ApplicationRefDescriptor.kt | 4 ++- .../descriptors/ButtonDescriptor.kt | 3 +++ .../uidebugger/descriptors/Descriptor.kt | 27 ------------------- .../descriptors/DescriptorRegister.kt | 2 ++ .../uidebugger/descriptors/NodeDescriptor.kt | 6 +++++ .../descriptors/ObjectDescriptor.kt | 3 +++ .../descriptors/TextViewDescriptor.kt | 4 +++ .../uidebugger/descriptors/ViewDescriptor.kt | 4 +++ .../descriptors/ViewGroupDescriptor.kt | 4 +++ .../descriptors/ViewPagerDescriptor.kt | 19 +++++++++++++ .../descriptors/WindowDescriptor.kt | 4 +++ .../flipper/plugins/uidebugger/model/Node.kt | 3 ++- .../public/ui-debugger/components/main.tsx | 21 ++++++++++++--- desktop/plugins/public/ui-debugger/types.tsx | 1 + 18 files changed, 104 insertions(+), 42 deletions(-) create mode 100644 android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewPagerDescriptor.kt 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