diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt index 48160e2ec..421210d55 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/ComponentPropExtractor.kt @@ -39,13 +39,6 @@ object ComponentPropExtractor { declaredField.isAccessible = true val name = declaredField.name - - val metadata = MetadataRegister.get(component.simpleName, name) - val identifier = - metadata?.id - ?: MetadataRegister.registerDynamic( - MetadataRegister.TYPE_ATTRIBUTE, component.simpleName, name) - val declaredFieldAnnotation = declaredField.getAnnotation(Prop::class.java) // Only expose `@Prop` annotated fields for Spec components @@ -64,10 +57,12 @@ object ComponentPropExtractor { val resType = declaredFieldAnnotation.resType if (resType == ResType.COLOR) { if (prop != null) { + val identifier = getMetadataId(component.simpleName, name) props[identifier] = InspectableValue.Color(Color.fromColor(prop as Int)) } continue } else if (resType == ResType.DRAWABLE) { + val identifier = getMetadataId(component.simpleName, name) props[identifier] = fromDrawable(prop as Drawable?) continue } @@ -77,18 +72,42 @@ object ComponentPropExtractor { EditorRegistry.read(declaredField.type, declaredField, component) if (editorValue != null) { - props[identifier] = toInspectable(name, editorValue) + addProp(props, component.simpleName, name, editorValue) } } return props } - private fun fromDrawable(d: Drawable?): Inspectable = - when (d) { - is ColorDrawable -> InspectableValue.Color(Color.fromColor(d.color)) - else -> InspectableValue.Unknown(d.toString()) - } + private fun getMetadataId( + namespace: String, + key: String, + mutable: Boolean = false, + possibleValues: Set? = emptySet() + ): MetadataId { + val metadata = MetadataRegister.get(namespace, key) + val identifier = + metadata?.id + ?: MetadataRegister.registerDynamic( + MetadataRegister.TYPE_ATTRIBUTE, namespace, key, mutable, possibleValues) + return identifier + } + + private fun addProp( + props: MutableMap, + namespace: String, + name: String, + value: EditorValue + ) { + var possibleValues: MutableSet? = null + if (value is EditorPick) { + possibleValues = mutableSetOf() + value.values.forEach { possibleValues.add(InspectableValue.Text(it)) } + } + + val identifier = getMetadataId(namespace, name, false, possibleValues) + props[identifier] = toInspectable(name, value) + } private fun toInspectable(name: String, editorValue: EditorValue): Inspectable { return editorValue.`when`( @@ -97,13 +116,16 @@ object ComponentPropExtractor { val fields = mutableMapOf() shape.value.entries.forEach { entry -> - val metadata = MetadataRegister.get(name, entry.key) - val identifier = - metadata?.id - ?: MetadataRegister.registerDynamic( - MetadataRegister.TYPE_LAYOUT, name, entry.key) - val value = toInspectable(entry.key, entry.value) + + val shapeEditorValue = entry.value + var possibleValues: MutableSet? = null + if (shapeEditorValue is EditorPick) { + possibleValues = mutableSetOf() + shapeEditorValue.values.forEach { possibleValues.add(InspectableValue.Text(it)) } + } + + val identifier = getMetadataId(name, entry.key, false, possibleValues) fields[identifier] = value } @@ -116,7 +138,7 @@ object ComponentPropExtractor { } override fun isPick(pick: EditorPick?): Inspectable = - InspectableValue.Enum(Enumeration(pick?.values ?: setOf(), pick?.selected)) + InspectableValue.Enum(Enumeration(pick?.selected)) override fun isNumber(number: EditorNumber): Inspectable = InspectableValue.Number(number.value) @@ -130,4 +152,10 @@ object ComponentPropExtractor { override fun isBool(bool: EditorBool): Inspectable = InspectableValue.Boolean(bool.value) }) } + + private fun fromDrawable(d: Drawable?): Inspectable = + when (d) { + is ColorDrawable -> InspectableValue.Color(Color.fromColor(d.color)) + else -> InspectableValue.Unknown(d.toString()) + } } diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt index 936b4d8cb..4c30f6663 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/descriptors/props/LayoutPropExtractor.kt @@ -9,6 +9,7 @@ package com.facebook.flipper.plugins.uidebugger.litho.descriptors.props import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable +import com.facebook.flipper.plugins.uidebugger.common.enumToInspectableSet import com.facebook.flipper.plugins.uidebugger.descriptors.MetadataRegister import com.facebook.flipper.plugins.uidebugger.model.* import com.facebook.litho.DebugComponent @@ -23,19 +24,54 @@ object LayoutPropExtractor { MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "foreground") private val DirectionId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "direction") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "direction", + false, + enumToInspectableSet()) private val FlexDirectionId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "flexDirection") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "flexDirection", + false, + enumToInspectableSet()) private val JustifyContentId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "justifyContent") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "justifyContent", + false, + enumToInspectableSet()) private val AlignItemsId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "alignItems") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "alignItems", + false, + enumToInspectableSet()) private val AlignSelfId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "alignSelf") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "alignSelf", + false, + enumToInspectableSet()) private val AlignContentId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "alignContent") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "alignContent", + false, + enumToInspectableSet()) private val PositionTypeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "positionType") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "positionType", + false, + enumToInspectableSet()) private val FlexGrowId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "flexGrow") @@ -94,22 +130,14 @@ object LayoutPropExtractor { layout.background?.let { drawable -> props[BackgroundId] = fromDrawable(drawable) } layout.foreground?.let { drawable -> props[ForegroundId] = fromDrawable(drawable) } - props[DirectionId] = - InspectableValue.Enum(Enumeration(enumToSet(), layout.layoutDirection.name)) + props[DirectionId] = InspectableValue.Enum(Enumeration(layout.layoutDirection.name)) - props[FlexDirectionId] = - InspectableValue.Enum( - Enumeration(enumToSet(), layout.flexDirection.name)) - props[JustifyContentId] = - InspectableValue.Enum(Enumeration(enumToSet(), layout.justifyContent.name)) - props[AlignItemsId] = - InspectableValue.Enum(Enumeration(enumToSet(), layout.alignItems.name)) - props[AlignSelfId] = - InspectableValue.Enum(Enumeration(enumToSet(), layout.alignSelf.name)) - props[AlignContentId] = - InspectableValue.Enum(Enumeration(enumToSet(), layout.alignContent.name)) - props[PositionTypeId] = - InspectableValue.Enum(Enumeration(enumToSet(), layout.positionType.name)) + props[FlexDirectionId] = InspectableValue.Enum(Enumeration(layout.flexDirection.name)) + props[JustifyContentId] = InspectableValue.Enum(Enumeration(layout.justifyContent.name)) + props[AlignItemsId] = InspectableValue.Enum(Enumeration(layout.alignItems.name)) + props[AlignSelfId] = InspectableValue.Enum(Enumeration(layout.alignSelf.name)) + props[AlignContentId] = InspectableValue.Enum(Enumeration(layout.alignContent.name)) + props[PositionTypeId] = InspectableValue.Enum(Enumeration(layout.positionType.name)) props[FlexGrowId] = InspectableValue.Text(layout.flexGrow.toString()) props[FlexShrinkId] = InspectableValue.Text(layout.flexShrink.toString()) @@ -199,12 +227,4 @@ object LayoutPropExtractor { is ColorDrawable -> InspectableValue.Color(Color.fromColor(d.color)) else -> InspectableValue.Unknown(d.toString()) } - - private inline fun > enumerator(): Iterator = enumValues().iterator() - private inline fun > enumToSet(): Set { - val set = mutableSetOf() - val values = enumerator() - values.forEach { set.add(it.name) } - return set - } } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/common/EnumMapping.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/common/EnumMapping.kt index bb191b175..a6e1666aa 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/common/EnumMapping.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/common/EnumMapping.kt @@ -33,10 +33,39 @@ open class EnumMapping(private val mapping: Map) { "Could not convert string $key to enum value, possible values ${mapping.entries} ") } + fun getInspectableValues(): Set { + val set: MutableSet = mutableSetOf() + mapping.entries.forEach { set.add(InspectableValue.Text(it.key)) } + return set + } + fun toInspectable(value: T): InspectableValue.Enum { - return InspectableValue.Enum(Enumeration(mapping.keys, getStringRepresentation(value))) + return InspectableValue.Enum(Enumeration(getStringRepresentation(value))) } companion object { const val NoMapping = "__UNKNOWN_ENUM_VALUE__" } } + +inline fun > enumerator(): Iterator = enumValues().iterator() + +inline fun > enumToSet(): Set { + val set = mutableSetOf() + val values = enumerator() + values.forEach { set.add(it.name) } + return set +} + +inline fun > enumToInspectableSet(): Set { + val set = mutableSetOf() + val values = enumerator() + values.forEach { set.add(InspectableValue.Text(it.name)) } + return set +} + +inline fun > enumMapping(): EnumMapping { + val map = mutableMapOf() + val values = enumerator() + values.forEach { map[it.name] = it } + return EnumMapping(map) +} diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ImageViewDescriptor.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ImageViewDescriptor.kt index 0d968df7a..475041910 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ImageViewDescriptor.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/ImageViewDescriptor.kt @@ -10,6 +10,8 @@ package com.facebook.flipper.plugins.uidebugger.descriptors import android.widget.ImageView import android.widget.ImageView.ScaleType import com.facebook.flipper.plugins.uidebugger.common.EnumMapping +import com.facebook.flipper.plugins.uidebugger.common.enumMapping +import com.facebook.flipper.plugins.uidebugger.common.enumToInspectableSet import com.facebook.flipper.plugins.uidebugger.model.Inspectable import com.facebook.flipper.plugins.uidebugger.model.InspectableObject import com.facebook.flipper.plugins.uidebugger.model.MetadataId @@ -21,7 +23,12 @@ object ImageViewDescriptor : ChainedDescriptor() { private var SectionId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, NAMESPACE) private var ScaleTypeAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "scaleType") + MetadataRegister.register( + MetadataRegister.TYPE_ATTRIBUTE, + NAMESPACE, + "scaleType", + false, + enumToInspectableSet()) override fun onGetName(node: ImageView): String = node.javaClass.simpleName @@ -35,17 +42,5 @@ object ImageViewDescriptor : ChainedDescriptor() { attributeSections[SectionId] = InspectableObject(props) } - private val scaleTypeMapping: EnumMapping = - object : - EnumMapping( - mapOf( - "CENTER" to ScaleType.CENTER, - "CENTER_CROP" to ScaleType.CENTER_CROP, - "CENTER_INSIDE" to ScaleType.CENTER_INSIDE, - "FIT_CENTER" to ScaleType.FIT_CENTER, - "FIT_END" to ScaleType.FIT_END, - "FIT_START" to ScaleType.FIT_START, - "FIT_XY" to ScaleType.FIT_XY, - "MATRIX" to ScaleType.MATRIX, - )) {} + private val scaleTypeMapping: EnumMapping = enumMapping() } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt index fd80ad99c..5282d28c4 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/descriptors/MetadataRegister.kt @@ -7,6 +7,7 @@ package com.facebook.flipper.plugins.uidebugger.descriptors +import com.facebook.flipper.plugins.uidebugger.model.InspectableValue import com.facebook.flipper.plugins.uidebugger.model.Metadata import com.facebook.flipper.plugins.uidebugger.model.MetadataId @@ -34,7 +35,8 @@ object MetadataRegister { type: String, namespace: String, name: String, - mutable: Boolean + mutable: Boolean, + possibleValues: Set? ): MetadataId { val key = key(namespace, name) metadata[key]?.let { m -> @@ -42,7 +44,7 @@ object MetadataRegister { } val identifier = ++generator - metadata[key] = Metadata(identifier, type, namespace, name, mutable) + metadata[key] = Metadata(identifier, type, namespace, name, mutable, possibleValues) return identifier } @@ -50,18 +52,20 @@ object MetadataRegister { type: String, namespace: String, name: String, - mutable: Boolean = false + mutable: Boolean = false, + possibleValues: Set? = emptySet() ): MetadataId { - return register(staticMetadata, type, namespace, name, mutable) + return register(staticMetadata, type, namespace, name, mutable, possibleValues) } fun registerDynamic( type: String, namespace: String, name: String, - mutable: Boolean = false + mutable: Boolean = false, + possibleValues: Set? = emptySet() ): MetadataId { - return register(dynamicMetadata, type, namespace, name, mutable) + return register(dynamicMetadata, type, namespace, name, mutable, possibleValues) } fun get(namespace: String, name: String): Metadata? { 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 db44c039f..4d9fb81c6 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 @@ -29,6 +29,111 @@ import java.lang.reflect.Field object ViewDescriptor : ChainedDescriptor() { + private val LayoutParamsMapping: EnumMapping = + object : + EnumMapping( + mapOf( + "WRAP_CONTENT" to ViewGroup.LayoutParams.WRAP_CONTENT, + "MATCH_PARENT" to ViewGroup.LayoutParams.MATCH_PARENT, + "FILL_PARENT" to ViewGroup.LayoutParams.FILL_PARENT, + )) {} + + private val VisibilityMapping: EnumMapping = + object : + EnumMapping( + mapOf( + "VISIBLE" to View.VISIBLE, + "INVISIBLE" to View.INVISIBLE, + "GONE" to View.GONE, + )) {} + + private val LayoutDirectionMapping: EnumMapping = + when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> { + object : + EnumMapping( + mapOf( + "LAYOUT_DIRECTION_INHERIT" to View.LAYOUT_DIRECTION_INHERIT, + "LAYOUT_DIRECTION_LOCALE" to View.LAYOUT_DIRECTION_LOCALE, + "LAYOUT_DIRECTION_LTR" to View.LAYOUT_DIRECTION_LTR, + "LAYOUT_DIRECTION_RTL" to View.LAYOUT_DIRECTION_RTL, + )) {} + } + else -> { + object : EnumMapping(emptyMap()) {} + } + } + + private val TextDirectionMapping: EnumMapping = + when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> { + object : + EnumMapping( + mapOf( + "TEXT_DIRECTION_INHERIT" to View.TEXT_DIRECTION_INHERIT, + "TEXT_DIRECTION_FIRST_STRONG" to View.TEXT_DIRECTION_FIRST_STRONG, + "TEXT_DIRECTION_ANY_RTL" to View.TEXT_DIRECTION_ANY_RTL, + "TEXT_DIRECTION_LTR" to View.TEXT_DIRECTION_LTR, + "TEXT_DIRECTION_RTL" to View.TEXT_DIRECTION_RTL, + "TEXT_DIRECTION_LOCALE" to View.TEXT_DIRECTION_LOCALE, + )) {} + } + Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> { + object : + EnumMapping( + mapOf( + "TEXT_DIRECTION_INHERIT" to View.TEXT_DIRECTION_INHERIT, + "TEXT_DIRECTION_FIRST_STRONG" to View.TEXT_DIRECTION_FIRST_STRONG, + "TEXT_DIRECTION_ANY_RTL" to View.TEXT_DIRECTION_ANY_RTL, + "TEXT_DIRECTION_LTR" to View.TEXT_DIRECTION_LTR, + "TEXT_DIRECTION_RTL" to View.TEXT_DIRECTION_RTL, + "TEXT_DIRECTION_LOCALE" to View.TEXT_DIRECTION_LOCALE, + "TEXT_DIRECTION_FIRST_STRONG_LTR" to View.TEXT_DIRECTION_FIRST_STRONG_LTR, + "TEXT_DIRECTION_FIRST_STRONG_RTL" to View.TEXT_DIRECTION_FIRST_STRONG_RTL, + )) {} + } + else -> { + object : EnumMapping(emptyMap()) {} + } + } + + private val TextAlignmentMapping: EnumMapping = + when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> { + object : + EnumMapping( + mapOf( + "TEXT_ALIGNMENT_INHERIT" to View.TEXT_ALIGNMENT_INHERIT, + "TEXT_ALIGNMENT_GRAVITY" to View.TEXT_ALIGNMENT_GRAVITY, + "TEXT_ALIGNMENT_TEXT_START" to View.TEXT_ALIGNMENT_TEXT_START, + "TEXT_ALIGNMENT_TEXT_END" to View.TEXT_ALIGNMENT_TEXT_END, + "TEXT_ALIGNMENT_CENTER" to View.TEXT_ALIGNMENT_CENTER, + "TEXT_ALIGNMENT_VIEW_START" to View.TEXT_ALIGNMENT_VIEW_START, + "TEXT_ALIGNMENT_VIEW_END" to View.TEXT_ALIGNMENT_VIEW_END, + )) {} + } + else -> { + object : EnumMapping(emptyMap()) {} + } + } + + private val GravityMapping = + object : + EnumMapping( + mapOf( + "NONE" to -1, + "NO_GRAVITY" to Gravity.NO_GRAVITY, + "LEFT" to Gravity.LEFT, + "TOP" to Gravity.TOP, + "RIGHT" to Gravity.RIGHT, + "BOTTOM" to Gravity.BOTTOM, + "CENTER" to Gravity.CENTER, + "CENTER_VERTICAL" to Gravity.CENTER_VERTICAL, + "FILL_VERTICAL" to Gravity.FILL_VERTICAL, + "CENTER_HORIZONTAL" to Gravity.CENTER_HORIZONTAL, + "FILL_HORIZONTAL" to Gravity.FILL_HORIZONTAL, + )) {} + private const val NAMESPACE = "View" private var SectionId = @@ -54,13 +159,23 @@ object ViewDescriptor : ChainedDescriptor() { private val LayoutParamsAttributeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "layoutParams") private val LayoutDirectionAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "layoutDirection") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "layoutDirection", + false, + LayoutDirectionMapping.getInspectableValues()) private val TranslationAttributeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "translation") private val ElevationAttributeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "elevation") private val VisibilityAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "visibility") + MetadataRegister.register( + MetadataRegister.TYPE_ATTRIBUTE, + NAMESPACE, + "visibility", + false, + VisibilityMapping.getInspectableValues()) private val BackgroundAttributeId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "background") @@ -82,9 +197,19 @@ object ViewDescriptor : ChainedDescriptor() { MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "selected") private val TextDirectionAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "textDirection") + MetadataRegister.register( + MetadataRegister.TYPE_ATTRIBUTE, + NAMESPACE, + "textDirection", + false, + TextDirectionMapping.getInspectableValues()) private val TextAlignmentAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "textAlignment") + MetadataRegister.register( + MetadataRegister.TYPE_ATTRIBUTE, + NAMESPACE, + "textAlignment", + false, + TextAlignmentMapping.getInspectableValues()) private val TagAttributeId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "tag") @@ -92,16 +217,31 @@ object ViewDescriptor : ChainedDescriptor() { MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "keyedTags") private val WidthAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "width") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "width", + false, + LayoutParamsMapping.getInspectableValues()) private val HeightAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "height") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "height", + false, + LayoutParamsMapping.getInspectableValues()) private val MarginAttributeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "margin") private val WeightAttributeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "weight") private val GravityAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "gravity") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "gravity", + false, + GravityMapping.getInspectableValues()) override fun onGetName(node: View): String = node.javaClass.simpleName @@ -310,111 +450,6 @@ object ViewDescriptor : ChainedDescriptor() { return tags } - private val LayoutParamsMapping: EnumMapping = - object : - EnumMapping( - mapOf( - "WRAP_CONTENT" to ViewGroup.LayoutParams.WRAP_CONTENT, - "MATCH_PARENT" to ViewGroup.LayoutParams.MATCH_PARENT, - "FILL_PARENT" to ViewGroup.LayoutParams.FILL_PARENT, - )) {} - - private val VisibilityMapping: EnumMapping = - object : - EnumMapping( - mapOf( - "VISIBLE" to View.VISIBLE, - "INVISIBLE" to View.INVISIBLE, - "GONE" to View.GONE, - )) {} - - private val LayoutDirectionMapping: EnumMapping = - when { - Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> { - object : - EnumMapping( - mapOf( - "LAYOUT_DIRECTION_INHERIT" to View.LAYOUT_DIRECTION_INHERIT, - "LAYOUT_DIRECTION_LOCALE" to View.LAYOUT_DIRECTION_LOCALE, - "LAYOUT_DIRECTION_LTR" to View.LAYOUT_DIRECTION_LTR, - "LAYOUT_DIRECTION_RTL" to View.LAYOUT_DIRECTION_RTL, - )) {} - } - else -> { - object : EnumMapping(emptyMap()) {} - } - } - - private val TextDirectionMapping: EnumMapping = - when { - Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> { - object : - EnumMapping( - mapOf( - "TEXT_DIRECTION_INHERIT" to View.TEXT_DIRECTION_INHERIT, - "TEXT_DIRECTION_FIRST_STRONG" to View.TEXT_DIRECTION_FIRST_STRONG, - "TEXT_DIRECTION_ANY_RTL" to View.TEXT_DIRECTION_ANY_RTL, - "TEXT_DIRECTION_LTR" to View.TEXT_DIRECTION_LTR, - "TEXT_DIRECTION_RTL" to View.TEXT_DIRECTION_RTL, - "TEXT_DIRECTION_LOCALE" to View.TEXT_DIRECTION_LOCALE, - )) {} - } - Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> { - object : - EnumMapping( - mapOf( - "TEXT_DIRECTION_INHERIT" to View.TEXT_DIRECTION_INHERIT, - "TEXT_DIRECTION_FIRST_STRONG" to View.TEXT_DIRECTION_FIRST_STRONG, - "TEXT_DIRECTION_ANY_RTL" to View.TEXT_DIRECTION_ANY_RTL, - "TEXT_DIRECTION_LTR" to View.TEXT_DIRECTION_LTR, - "TEXT_DIRECTION_RTL" to View.TEXT_DIRECTION_RTL, - "TEXT_DIRECTION_LOCALE" to View.TEXT_DIRECTION_LOCALE, - "TEXT_DIRECTION_FIRST_STRONG_LTR" to View.TEXT_DIRECTION_FIRST_STRONG_LTR, - "TEXT_DIRECTION_FIRST_STRONG_RTL" to View.TEXT_DIRECTION_FIRST_STRONG_RTL, - )) {} - } - else -> { - object : EnumMapping(emptyMap()) {} - } - } - - private val TextAlignmentMapping: EnumMapping = - when { - Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> { - object : - EnumMapping( - mapOf( - "TEXT_ALIGNMENT_INHERIT" to View.TEXT_ALIGNMENT_INHERIT, - "TEXT_ALIGNMENT_GRAVITY" to View.TEXT_ALIGNMENT_GRAVITY, - "TEXT_ALIGNMENT_TEXT_START" to View.TEXT_ALIGNMENT_TEXT_START, - "TEXT_ALIGNMENT_TEXT_END" to View.TEXT_ALIGNMENT_TEXT_END, - "TEXT_ALIGNMENT_CENTER" to View.TEXT_ALIGNMENT_CENTER, - "TEXT_ALIGNMENT_VIEW_START" to View.TEXT_ALIGNMENT_VIEW_START, - "TEXT_ALIGNMENT_VIEW_END" to View.TEXT_ALIGNMENT_VIEW_END, - )) {} - } - else -> { - object : EnumMapping(emptyMap()) {} - } - } - - private val GravityMapping = - object : - EnumMapping( - mapOf( - "NONE" to -1, - "NO_GRAVITY" to Gravity.NO_GRAVITY, - "LEFT" to Gravity.LEFT, - "TOP" to Gravity.TOP, - "RIGHT" to Gravity.RIGHT, - "BOTTOM" to Gravity.BOTTOM, - "CENTER" to Gravity.CENTER, - "CENTER_VERTICAL" to Gravity.CENTER_VERTICAL, - "FILL_VERTICAL" to Gravity.FILL_VERTICAL, - "CENTER_HORIZONTAL" to Gravity.CENTER_HORIZONTAL, - "FILL_HORIZONTAL" to Gravity.FILL_HORIZONTAL, - )) {} - private var KeyedTagsField: Field? = null private var ListenerInfoField: Field? = null private var OnClickListenerField: Field? = null 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 97ee6db19..7e6bee089 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 @@ -17,6 +17,14 @@ import com.facebook.flipper.plugins.uidebugger.model.* object ViewGroupDescriptor : ChainedDescriptor() { + private val LayoutModeMapping: EnumMapping = + object : + EnumMapping( + mapOf( + "LAYOUT_MODE_CLIP_BOUNDS" to ViewGroupCompat.LAYOUT_MODE_CLIP_BOUNDS, + "LAYOUT_MODE_OPTICAL_BOUNDS" to ViewGroupCompat.LAYOUT_MODE_OPTICAL_BOUNDS, + )) {} + private const val NAMESPACE = "ViewGroup" private var SectionId = MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, NAMESPACE) @@ -41,9 +49,14 @@ object ViewGroupDescriptor : ChainedDescriptor() { } private val LayoutModeAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "layoutMode") + MetadataRegister.register( + MetadataRegister.TYPE_LAYOUT, + NAMESPACE, + "layoutMode", + false, + LayoutModeMapping.getInspectableValues()) private val ClipChildrenAttributeId = - MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "layoutMode") + MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "clipChildren") private val ClipToPaddingAttributeId = MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "clipToPadding") @@ -63,12 +76,4 @@ object ViewGroupDescriptor : ChainedDescriptor() { attributeSections[SectionId] = InspectableObject(props) } - - private val LayoutModeMapping: EnumMapping = - object : - EnumMapping( - mapOf( - "LAYOUT_MODE_CLIP_BOUNDS" to ViewGroupCompat.LAYOUT_MODE_CLIP_BOUNDS, - "LAYOUT_MODE_OPTICAL_BOUNDS" to ViewGroupCompat.LAYOUT_MODE_OPTICAL_BOUNDS, - )) {} } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Metadata.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Metadata.kt index 58716453f..b77db7c26 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Metadata.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Metadata.kt @@ -21,5 +21,6 @@ data class Metadata( val namespace: String, val name: String, val mutable: kotlin.Boolean, + val possibleValues: Set? = emptySet(), val tags: List? = emptyList() ) {} diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Types.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Types.kt index 89eaa47f1..03edf021e 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Types.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Types.kt @@ -63,5 +63,4 @@ data class Size( @Serializable(with = NumberSerializer::class) val height: Number ) {} -@kotlinx.serialization.Serializable -data class Enumeration(val values: Set, val value: String?) +@kotlinx.serialization.Serializable data class Enumeration(val value: String?) diff --git a/android/src/test/java/com/facebook/flipper/plugins/uidebugger/EnumMappingTest.kt b/android/src/test/java/com/facebook/flipper/plugins/uidebugger/EnumMappingTest.kt index 770932633..115cf36ae 100644 --- a/android/src/test/java/com/facebook/flipper/plugins/uidebugger/EnumMappingTest.kt +++ b/android/src/test/java/com/facebook/flipper/plugins/uidebugger/EnumMappingTest.kt @@ -39,7 +39,6 @@ class EnumMappingTest { @Test fun testTurnsIntoEnumInspectable() { assertThat( - visibility.toInspectable(View.GONE), - equalTo(InspectableValue.Enum(Enumeration(setOf("VISIBLE", "INVISIBLE", "GONE"), "GONE")))) + visibility.toInspectable(View.GONE), equalTo(InspectableValue.Enum(Enumeration("GONE")))) } }