From 413f85964b85e94efd88a8001043c2d63fd5a306 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Mon, 31 Jul 2023 10:53:03 -0700 Subject: [PATCH] Send invisible as hidden attribute Summary: This allows UIDebugger to draw them differently in tree and visualiser Reviewed By: lblasa Differential Revision: D47915505 fbshipit-source-id: a4d2ef9d653233e3ff24bc26cfe8017f9b51dd2b --- .../descriptors/ChainedDescriptor.kt | 28 +++++++++++++++++++ .../uidebugger/descriptors/ViewDescriptor.kt | 9 ++++++ .../descriptors/ViewGroupDescriptor.kt | 1 + 3 files changed, 38 insertions(+) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ChainedDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ChainedDescriptor.kt index 53078f374..ccc9413e6 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ChainedDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ChainedDescriptor.kt @@ -13,6 +13,8 @@ import com.facebook.flipper.plugins.uidebugger.model.InspectableObject import com.facebook.flipper.plugins.uidebugger.model.MetadataId import com.facebook.flipper.plugins.uidebugger.util.Immediate import com.facebook.flipper.plugins.uidebugger.util.MaybeDeferred +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonObject /** * A chained descriptor is a special type of descriptor that models the inheritance hierarchy in @@ -78,6 +80,32 @@ abstract class ChainedDescriptor : NodeDescriptor { open fun onGetBounds(node: T): Bounds? = null + final override fun getHiddenAttributes(node: T): JsonObject? { + + val descriptors = mutableListOf(this) + + var curDescriptor: ChainedDescriptor? = mSuper + + while (curDescriptor != null) { + descriptors.add(curDescriptor) + curDescriptor = curDescriptor.mSuper + } + + // reverse the list so that subclasses can override attributes of the base class if they wish to + descriptors.reverse() + val builder = mutableMapOf() + + descriptors.forEach { it.onGetHiddenAttributes(node, builder) } + + return if (builder.isNotEmpty()) { + JsonObject(builder) + } else { + null + } + } + + open fun onGetHiddenAttributes(node: T, attributes: MutableMap) {} + final override fun getChildren(node: T): List { val children = onGetChildren(node) ?: mSuper?.getChildren(node) return children ?: listOf() 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 f9b54ffbb..0c6a63bf2 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 @@ -25,6 +25,8 @@ import com.facebook.flipper.plugins.uidebugger.common.* import com.facebook.flipper.plugins.uidebugger.model.* import com.facebook.flipper.plugins.uidebugger.util.ResourcesUtil import java.lang.reflect.Field +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonPrimitive object ViewDescriptor : ChainedDescriptor() { @@ -434,6 +436,13 @@ object ViewDescriptor : ChainedDescriptor() { return InspectableObject(params) } + override fun onGetHiddenAttributes(node: View, attributes: MutableMap) { + + if (node.visibility != View.VISIBLE) { + attributes["invisible"] = JsonPrimitive(true) + } + } + private fun getViewTags(node: View): MutableMap { val tags = mutableMapOf() 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 dc199f7ec..bce9d9ce2 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 @@ -65,6 +65,7 @@ object ViewGroupDescriptor : ChainedDescriptor() { node: ViewGroup, attributeSections: MutableMap ) { + val props = mutableMapOf() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { props[LayoutModeAttributeId] = LayoutModeMapping.toInspectable(node.layoutMode)