From 38109eccff95750638bf86c295296568d41c9b11 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 25 Oct 2022 03:09:00 -0700 Subject: [PATCH] Active children and fragments bug Summary: Getting the active child was only ever returning the actual active View. This is correct. However, if the View is backed by a Fragment, then the child is reported as Fragment instead of the actual View. This was an issue as effectively, the reported children (fragments) were never going to match the active child (view). Additionally in this change, report back the name of the node even if not active. Reviewed By: LukeDefeo Differential Revision: D40632526 fbshipit-source-id: 3560b193b370f19ceabe66980fe23f55ec887274 --- .../descriptors/ColorDrawableDescriptor.kt | 5 +-- .../uidebugger/descriptors/ViewDescriptor.kt | 5 +-- .../descriptors/ViewGroupDescriptor.kt | 1 + .../descriptors/ViewPagerDescriptor.kt | 10 ++++- .../descriptors/WindowDescriptor.kt | 8 ++-- .../traversal/PartialLayoutTraversal.kt | 38 +++++++++++++------ 6 files changed, 43 insertions(+), 24 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ColorDrawableDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ColorDrawableDescriptor.kt index 78fc0c566..4a3c95b24 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ColorDrawableDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ColorDrawableDescriptor.kt @@ -8,7 +8,6 @@ package com.facebook.flipper.plugins.uidebugger.descriptors import android.graphics.drawable.ColorDrawable -import android.os.Build import com.facebook.flipper.plugins.uidebugger.model.Color import com.facebook.flipper.plugins.uidebugger.model.Inspectable import com.facebook.flipper.plugins.uidebugger.model.InspectableObject @@ -23,9 +22,7 @@ object ColorDrawableDescriptor : ChainedDescriptor() { attributeSections: MutableMap ) { val props = mutableMapOf() - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - props["color"] = InspectableValue.Color(Color.fromColor(node.color), mutable = true) - } + props["color"] = InspectableValue.Color(Color.fromColor(node.color), mutable = true) attributeSections["ColorDrawable"] = InspectableObject(props.toMap()) } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt index 0a8567644..035b6281b 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewDescriptor.kt @@ -108,10 +108,7 @@ object ViewDescriptor : ChainedDescriptor() { fromDrawable(node.foreground)?.let { foreground -> props["foreground"] = foreground } } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - props["alpha"] = InspectableValue.Number(node.alpha, mutable = true) - } - + props["alpha"] = InspectableValue.Number(node.alpha, mutable = true) props["state"] = InspectableObject( mapOf( diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewGroupDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewGroupDescriptor.kt index cf70ce776..7eeb9ae47 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewGroupDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewGroupDescriptor.kt @@ -28,6 +28,7 @@ object ViewGroupDescriptor : ChainedDescriptor() { for (i in 0..count) { val child: View = node.getChildAt(i) val fragment = FragmentTracker.getFragment(child) + if (fragment != null) { children.add(fragment) } else children.add(child) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewPagerDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewPagerDescriptor.kt index e89161d26..da548b7c6 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewPagerDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ViewPagerDescriptor.kt @@ -8,6 +8,7 @@ package com.facebook.flipper.plugins.uidebugger.descriptors import androidx.viewpager.widget.ViewPager +import com.facebook.flipper.plugins.uidebugger.core.FragmentTracker import com.facebook.flipper.plugins.uidebugger.model.InspectableObject import com.facebook.flipper.plugins.uidebugger.model.InspectableValue @@ -15,7 +16,14 @@ object ViewPagerDescriptor : ChainedDescriptor() { override fun onGetName(node: ViewPager): String = node.javaClass.simpleName - override fun onGetActiveChild(node: ViewPager): Any? = node.getChildAt(node.currentItem) + override fun onGetActiveChild(node: ViewPager): Any? { + val child = node.getChildAt(node.currentItem) + val fragment = FragmentTracker.getFragment(child) + if (fragment != null) { + return fragment + } + return child + } override fun onGetData( node: ViewPager, diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/WindowDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/WindowDescriptor.kt index 42a85ea26..fae88b9fd 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/WindowDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/WindowDescriptor.kt @@ -87,9 +87,11 @@ object WindowDescriptor : ChainedDescriptor() { else -> { if (typedValue.type >= TypedValue.TYPE_FIRST_COLOR_INT && typedValue.type <= TypedValue.TYPE_LAST_COLOR_INT) { - val hexColor = "#" + Integer.toHexString(typedValue.data) - val color = android.graphics.Color.parseColor(hexColor) - props[name] = InspectableValue.Color(Color.fromColor(color)) + try { + val hexColor = "#" + Integer.toHexString(typedValue.data) + val color = android.graphics.Color.parseColor(hexColor) + props[name] = InspectableValue.Color(Color.fromColor(color)) + } catch (e: Exception) {} } else if (typedValue.type >= TypedValue.TYPE_FIRST_INT && typedValue.type <= TypedValue.TYPE_LAST_INT) { props[name] = InspectableValue.Number(typedValue.data) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt index 480ff996b..6bf42a909 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/traversal/PartialLayoutTraversal.kt @@ -38,6 +38,8 @@ class PartialLayoutTraversal( val stack = mutableListOf() stack.add(root) + val shallow = mutableSetOf() + while (stack.isNotEmpty()) { val node = stack.removeLast() @@ -49,28 +51,40 @@ class PartialLayoutTraversal( } val descriptor = descriptorRegister.descriptorForClassUnsafe(node::class.java).asAny() + + if (shallow.contains(node)) { + visited.add( + Node( + node.nodeId(), + descriptor.getName(node), + emptyMap(), + null, + emptySet(), + emptyList(), + null)) + + shallow.remove(node) + continue + } + val children = descriptor.getChildren(node) + val activeChild = descriptor.getActiveChild(node) + var activeChildId: Id? = null + if (activeChild != null) { + activeChildId = activeChild.nodeId() + } val childrenIds = mutableListOf() children.forEach { child -> - // 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(child.nodeId()) + stack.add(child) // If there is an active child then don't traverse it - if (activeChild == null) { - stack.add(child) + if (activeChild != null && activeChild != child) { + shallow.add(child) } } - var activeChildId: Id? = null - if (activeChild != null) { - stack.add(activeChild) - activeChildId = activeChild.nodeId() - } - val attributes = descriptor.getData(node) val bounds = descriptor.getBounds(node) val tags = descriptor.getTags(node)