Migrate enum possible values to metadata

Summary:
Before this change, possible values for an enumeration were embedded within the attribute value itself.

After this change, possible values are located within the attribute metadata.

Reviewed By: LukeDefeo

Differential Revision: D41337003

fbshipit-source-id: cef5654a679e9b961e82993abb201b518fcbcd00
This commit is contained in:
Lorenzo Blasa
2022-11-17 04:42:22 -08:00
committed by Facebook GitHub Bot
parent 0ebedc9c49
commit 0ac8c2a6b3
10 changed files with 312 additions and 197 deletions

View File

@@ -39,13 +39,6 @@ object ComponentPropExtractor {
declaredField.isAccessible = true declaredField.isAccessible = true
val name = declaredField.name 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) val declaredFieldAnnotation = declaredField.getAnnotation(Prop::class.java)
// Only expose `@Prop` annotated fields for Spec components // Only expose `@Prop` annotated fields for Spec components
@@ -64,10 +57,12 @@ object ComponentPropExtractor {
val resType = declaredFieldAnnotation.resType val resType = declaredFieldAnnotation.resType
if (resType == ResType.COLOR) { if (resType == ResType.COLOR) {
if (prop != null) { if (prop != null) {
val identifier = getMetadataId(component.simpleName, name)
props[identifier] = InspectableValue.Color(Color.fromColor(prop as Int)) props[identifier] = InspectableValue.Color(Color.fromColor(prop as Int))
} }
continue continue
} else if (resType == ResType.DRAWABLE) { } else if (resType == ResType.DRAWABLE) {
val identifier = getMetadataId(component.simpleName, name)
props[identifier] = fromDrawable(prop as Drawable?) props[identifier] = fromDrawable(prop as Drawable?)
continue continue
} }
@@ -77,18 +72,42 @@ object ComponentPropExtractor {
EditorRegistry.read(declaredField.type, declaredField, component) EditorRegistry.read(declaredField.type, declaredField, component)
if (editorValue != null) { if (editorValue != null) {
props[identifier] = toInspectable(name, editorValue) addProp(props, component.simpleName, name, editorValue)
} }
} }
return props return props
} }
private fun fromDrawable(d: Drawable?): Inspectable = private fun getMetadataId(
when (d) { namespace: String,
is ColorDrawable -> InspectableValue.Color(Color.fromColor(d.color)) key: String,
else -> InspectableValue.Unknown(d.toString()) mutable: Boolean = false,
} possibleValues: Set<InspectableValue>? = 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<MetadataId, Inspectable>,
namespace: String,
name: String,
value: EditorValue
) {
var possibleValues: MutableSet<InspectableValue>? = 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 { private fun toInspectable(name: String, editorValue: EditorValue): Inspectable {
return editorValue.`when`( return editorValue.`when`(
@@ -97,13 +116,16 @@ object ComponentPropExtractor {
val fields = mutableMapOf<MetadataId, Inspectable>() val fields = mutableMapOf<MetadataId, Inspectable>()
shape.value.entries.forEach { entry -> 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 value = toInspectable(entry.key, entry.value)
val shapeEditorValue = entry.value
var possibleValues: MutableSet<InspectableValue>? = 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 fields[identifier] = value
} }
@@ -116,7 +138,7 @@ object ComponentPropExtractor {
} }
override fun isPick(pick: EditorPick?): Inspectable = 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 = override fun isNumber(number: EditorNumber): Inspectable =
InspectableValue.Number(number.value) InspectableValue.Number(number.value)
@@ -130,4 +152,10 @@ object ComponentPropExtractor {
override fun isBool(bool: EditorBool): Inspectable = InspectableValue.Boolean(bool.value) 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())
}
} }

View File

@@ -9,6 +9,7 @@ package com.facebook.flipper.plugins.uidebugger.litho.descriptors.props
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable 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.descriptors.MetadataRegister
import com.facebook.flipper.plugins.uidebugger.model.* import com.facebook.flipper.plugins.uidebugger.model.*
import com.facebook.litho.DebugComponent import com.facebook.litho.DebugComponent
@@ -23,19 +24,54 @@ object LayoutPropExtractor {
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "foreground") MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "foreground")
private val DirectionId = private val DirectionId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "direction") MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"direction",
false,
enumToInspectableSet<YogaDirection>())
private val FlexDirectionId = private val FlexDirectionId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "flexDirection") MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"flexDirection",
false,
enumToInspectableSet<YogaFlexDirection>())
private val JustifyContentId = private val JustifyContentId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "justifyContent") MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"justifyContent",
false,
enumToInspectableSet<YogaJustify>())
private val AlignItemsId = private val AlignItemsId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "alignItems") MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"alignItems",
false,
enumToInspectableSet<YogaAlign>())
private val AlignSelfId = private val AlignSelfId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "alignSelf") MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"alignSelf",
false,
enumToInspectableSet<YogaAlign>())
private val AlignContentId = private val AlignContentId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "alignContent") MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"alignContent",
false,
enumToInspectableSet<YogaAlign>())
private val PositionTypeId = private val PositionTypeId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "positionType") MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"positionType",
false,
enumToInspectableSet<YogaPositionType>())
private val FlexGrowId = private val FlexGrowId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "flexGrow") MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "flexGrow")
@@ -94,22 +130,14 @@ object LayoutPropExtractor {
layout.background?.let { drawable -> props[BackgroundId] = fromDrawable(drawable) } layout.background?.let { drawable -> props[BackgroundId] = fromDrawable(drawable) }
layout.foreground?.let { drawable -> props[ForegroundId] = fromDrawable(drawable) } layout.foreground?.let { drawable -> props[ForegroundId] = fromDrawable(drawable) }
props[DirectionId] = props[DirectionId] = InspectableValue.Enum(Enumeration(layout.layoutDirection.name))
InspectableValue.Enum(Enumeration(enumToSet<YogaDirection>(), layout.layoutDirection.name))
props[FlexDirectionId] = props[FlexDirectionId] = InspectableValue.Enum(Enumeration(layout.flexDirection.name))
InspectableValue.Enum( props[JustifyContentId] = InspectableValue.Enum(Enumeration(layout.justifyContent.name))
Enumeration(enumToSet<YogaFlexDirection>(), layout.flexDirection.name)) props[AlignItemsId] = InspectableValue.Enum(Enumeration(layout.alignItems.name))
props[JustifyContentId] = props[AlignSelfId] = InspectableValue.Enum(Enumeration(layout.alignSelf.name))
InspectableValue.Enum(Enumeration(enumToSet<YogaJustify>(), layout.justifyContent.name)) props[AlignContentId] = InspectableValue.Enum(Enumeration(layout.alignContent.name))
props[AlignItemsId] = props[PositionTypeId] = InspectableValue.Enum(Enumeration(layout.positionType.name))
InspectableValue.Enum(Enumeration(enumToSet<YogaAlign>(), layout.alignItems.name))
props[AlignSelfId] =
InspectableValue.Enum(Enumeration(enumToSet<YogaAlign>(), layout.alignSelf.name))
props[AlignContentId] =
InspectableValue.Enum(Enumeration(enumToSet<YogaAlign>(), layout.alignContent.name))
props[PositionTypeId] =
InspectableValue.Enum(Enumeration(enumToSet<YogaPositionType>(), layout.positionType.name))
props[FlexGrowId] = InspectableValue.Text(layout.flexGrow.toString()) props[FlexGrowId] = InspectableValue.Text(layout.flexGrow.toString())
props[FlexShrinkId] = InspectableValue.Text(layout.flexShrink.toString()) props[FlexShrinkId] = InspectableValue.Text(layout.flexShrink.toString())
@@ -199,12 +227,4 @@ object LayoutPropExtractor {
is ColorDrawable -> InspectableValue.Color(Color.fromColor(d.color)) is ColorDrawable -> InspectableValue.Color(Color.fromColor(d.color))
else -> InspectableValue.Unknown(d.toString()) else -> InspectableValue.Unknown(d.toString())
} }
private inline fun <reified T : Enum<T>> enumerator(): Iterator<T> = enumValues<T>().iterator()
private inline fun <reified T : Enum<T>> enumToSet(): Set<String> {
val set = mutableSetOf<String>()
val values = enumerator<T>()
values.forEach { set.add(it.name) }
return set
}
} }

View File

@@ -33,10 +33,39 @@ open class EnumMapping<T>(private val mapping: Map<String, T>) {
"Could not convert string $key to enum value, possible values ${mapping.entries} ") "Could not convert string $key to enum value, possible values ${mapping.entries} ")
} }
fun getInspectableValues(): Set<InspectableValue> {
val set: MutableSet<InspectableValue> = mutableSetOf()
mapping.entries.forEach { set.add(InspectableValue.Text(it.key)) }
return set
}
fun toInspectable(value: T): InspectableValue.Enum { fun toInspectable(value: T): InspectableValue.Enum {
return InspectableValue.Enum(Enumeration(mapping.keys, getStringRepresentation(value))) return InspectableValue.Enum(Enumeration(getStringRepresentation(value)))
} }
companion object { companion object {
const val NoMapping = "__UNKNOWN_ENUM_VALUE__" const val NoMapping = "__UNKNOWN_ENUM_VALUE__"
} }
} }
inline fun <reified T : Enum<T>> enumerator(): Iterator<T> = enumValues<T>().iterator()
inline fun <reified T : Enum<T>> enumToSet(): Set<String> {
val set = mutableSetOf<String>()
val values = enumerator<T>()
values.forEach { set.add(it.name) }
return set
}
inline fun <reified T : Enum<T>> enumToInspectableSet(): Set<InspectableValue> {
val set = mutableSetOf<InspectableValue>()
val values = enumerator<T>()
values.forEach { set.add(InspectableValue.Text(it.name)) }
return set
}
inline fun <reified T : Enum<T>> enumMapping(): EnumMapping<T> {
val map = mutableMapOf<String, T>()
val values = enumerator<T>()
values.forEach { map[it.name] = it }
return EnumMapping<T>(map)
}

View File

@@ -10,6 +10,8 @@ package com.facebook.flipper.plugins.uidebugger.descriptors
import android.widget.ImageView import android.widget.ImageView
import android.widget.ImageView.ScaleType 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.enumMapping
import com.facebook.flipper.plugins.uidebugger.common.enumToInspectableSet
import com.facebook.flipper.plugins.uidebugger.model.Inspectable import com.facebook.flipper.plugins.uidebugger.model.Inspectable
import com.facebook.flipper.plugins.uidebugger.model.InspectableObject import com.facebook.flipper.plugins.uidebugger.model.InspectableObject
import com.facebook.flipper.plugins.uidebugger.model.MetadataId import com.facebook.flipper.plugins.uidebugger.model.MetadataId
@@ -21,7 +23,12 @@ object ImageViewDescriptor : ChainedDescriptor<ImageView>() {
private var SectionId = private var SectionId =
MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, NAMESPACE) MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, NAMESPACE)
private var ScaleTypeAttributeId = private var ScaleTypeAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "scaleType") MetadataRegister.register(
MetadataRegister.TYPE_ATTRIBUTE,
NAMESPACE,
"scaleType",
false,
enumToInspectableSet<ScaleType>())
override fun onGetName(node: ImageView): String = node.javaClass.simpleName override fun onGetName(node: ImageView): String = node.javaClass.simpleName
@@ -35,17 +42,5 @@ object ImageViewDescriptor : ChainedDescriptor<ImageView>() {
attributeSections[SectionId] = InspectableObject(props) attributeSections[SectionId] = InspectableObject(props)
} }
private val scaleTypeMapping: EnumMapping<ScaleType> = private val scaleTypeMapping: EnumMapping<ScaleType> = enumMapping<ScaleType>()
object :
EnumMapping<ScaleType>(
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,
)) {}
} }

View File

@@ -7,6 +7,7 @@
package com.facebook.flipper.plugins.uidebugger.descriptors 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.Metadata
import com.facebook.flipper.plugins.uidebugger.model.MetadataId import com.facebook.flipper.plugins.uidebugger.model.MetadataId
@@ -34,7 +35,8 @@ object MetadataRegister {
type: String, type: String,
namespace: String, namespace: String,
name: String, name: String,
mutable: Boolean mutable: Boolean,
possibleValues: Set<InspectableValue>?
): MetadataId { ): MetadataId {
val key = key(namespace, name) val key = key(namespace, name)
metadata[key]?.let { m -> metadata[key]?.let { m ->
@@ -42,7 +44,7 @@ object MetadataRegister {
} }
val identifier = ++generator val identifier = ++generator
metadata[key] = Metadata(identifier, type, namespace, name, mutable) metadata[key] = Metadata(identifier, type, namespace, name, mutable, possibleValues)
return identifier return identifier
} }
@@ -50,18 +52,20 @@ object MetadataRegister {
type: String, type: String,
namespace: String, namespace: String,
name: String, name: String,
mutable: Boolean = false mutable: Boolean = false,
possibleValues: Set<InspectableValue>? = emptySet()
): MetadataId { ): MetadataId {
return register(staticMetadata, type, namespace, name, mutable) return register(staticMetadata, type, namespace, name, mutable, possibleValues)
} }
fun registerDynamic( fun registerDynamic(
type: String, type: String,
namespace: String, namespace: String,
name: String, name: String,
mutable: Boolean = false mutable: Boolean = false,
possibleValues: Set<InspectableValue>? = emptySet()
): MetadataId { ): MetadataId {
return register(dynamicMetadata, type, namespace, name, mutable) return register(dynamicMetadata, type, namespace, name, mutable, possibleValues)
} }
fun get(namespace: String, name: String): Metadata? { fun get(namespace: String, name: String): Metadata? {

View File

@@ -29,6 +29,111 @@ import java.lang.reflect.Field
object ViewDescriptor : ChainedDescriptor<View>() { object ViewDescriptor : ChainedDescriptor<View>() {
private val LayoutParamsMapping: EnumMapping<Int> =
object :
EnumMapping<Int>(
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<Int> =
object :
EnumMapping<Int>(
mapOf(
"VISIBLE" to View.VISIBLE,
"INVISIBLE" to View.INVISIBLE,
"GONE" to View.GONE,
)) {}
private val LayoutDirectionMapping: EnumMapping<Int> =
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> {
object :
EnumMapping<Int>(
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<Int>(emptyMap()) {}
}
}
private val TextDirectionMapping: EnumMapping<Int> =
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> {
object :
EnumMapping<Int>(
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<Int>(
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<Int>(emptyMap()) {}
}
}
private val TextAlignmentMapping: EnumMapping<Int> =
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> {
object :
EnumMapping<Int>(
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<Int>(emptyMap()) {}
}
}
private val GravityMapping =
object :
EnumMapping<Int>(
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 const val NAMESPACE = "View"
private var SectionId = private var SectionId =
@@ -54,13 +159,23 @@ object ViewDescriptor : ChainedDescriptor<View>() {
private val LayoutParamsAttributeId = private val LayoutParamsAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "layoutParams") MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "layoutParams")
private val LayoutDirectionAttributeId = private val LayoutDirectionAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "layoutDirection") MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"layoutDirection",
false,
LayoutDirectionMapping.getInspectableValues())
private val TranslationAttributeId = private val TranslationAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "translation") MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "translation")
private val ElevationAttributeId = private val ElevationAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "elevation") MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "elevation")
private val VisibilityAttributeId = private val VisibilityAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "visibility") MetadataRegister.register(
MetadataRegister.TYPE_ATTRIBUTE,
NAMESPACE,
"visibility",
false,
VisibilityMapping.getInspectableValues())
private val BackgroundAttributeId = private val BackgroundAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "background") MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "background")
@@ -82,9 +197,19 @@ object ViewDescriptor : ChainedDescriptor<View>() {
MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "selected") MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "selected")
private val TextDirectionAttributeId = private val TextDirectionAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "textDirection") MetadataRegister.register(
MetadataRegister.TYPE_ATTRIBUTE,
NAMESPACE,
"textDirection",
false,
TextDirectionMapping.getInspectableValues())
private val TextAlignmentAttributeId = private val TextAlignmentAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "textAlignment") MetadataRegister.register(
MetadataRegister.TYPE_ATTRIBUTE,
NAMESPACE,
"textAlignment",
false,
TextAlignmentMapping.getInspectableValues())
private val TagAttributeId = private val TagAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "tag") MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "tag")
@@ -92,16 +217,31 @@ object ViewDescriptor : ChainedDescriptor<View>() {
MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "keyedTags") MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "keyedTags")
private val WidthAttributeId = private val WidthAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "width") MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"width",
false,
LayoutParamsMapping.getInspectableValues())
private val HeightAttributeId = private val HeightAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "height") MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"height",
false,
LayoutParamsMapping.getInspectableValues())
private val MarginAttributeId = private val MarginAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "margin") MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "margin")
private val WeightAttributeId = private val WeightAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "weight") MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "weight")
private val GravityAttributeId = 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 override fun onGetName(node: View): String = node.javaClass.simpleName
@@ -310,111 +450,6 @@ object ViewDescriptor : ChainedDescriptor<View>() {
return tags return tags
} }
private val LayoutParamsMapping: EnumMapping<Int> =
object :
EnumMapping<Int>(
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<Int> =
object :
EnumMapping<Int>(
mapOf(
"VISIBLE" to View.VISIBLE,
"INVISIBLE" to View.INVISIBLE,
"GONE" to View.GONE,
)) {}
private val LayoutDirectionMapping: EnumMapping<Int> =
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> {
object :
EnumMapping<Int>(
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<Int>(emptyMap()) {}
}
}
private val TextDirectionMapping: EnumMapping<Int> =
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> {
object :
EnumMapping<Int>(
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<Int>(
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<Int>(emptyMap()) {}
}
}
private val TextAlignmentMapping: EnumMapping<Int> =
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> {
object :
EnumMapping<Int>(
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<Int>(emptyMap()) {}
}
}
private val GravityMapping =
object :
EnumMapping<Int>(
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 KeyedTagsField: Field? = null
private var ListenerInfoField: Field? = null private var ListenerInfoField: Field? = null
private var OnClickListenerField: Field? = null private var OnClickListenerField: Field? = null

View File

@@ -17,6 +17,14 @@ import com.facebook.flipper.plugins.uidebugger.model.*
object ViewGroupDescriptor : ChainedDescriptor<ViewGroup>() { object ViewGroupDescriptor : ChainedDescriptor<ViewGroup>() {
private val LayoutModeMapping: EnumMapping<Int> =
object :
EnumMapping<Int>(
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 const val NAMESPACE = "ViewGroup"
private var SectionId = private var SectionId =
MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, NAMESPACE) MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, NAMESPACE)
@@ -41,9 +49,14 @@ object ViewGroupDescriptor : ChainedDescriptor<ViewGroup>() {
} }
private val LayoutModeAttributeId = private val LayoutModeAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "layoutMode") MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"layoutMode",
false,
LayoutModeMapping.getInspectableValues())
private val ClipChildrenAttributeId = private val ClipChildrenAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "layoutMode") MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "clipChildren")
private val ClipToPaddingAttributeId = private val ClipToPaddingAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "clipToPadding") MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "clipToPadding")
@@ -63,12 +76,4 @@ object ViewGroupDescriptor : ChainedDescriptor<ViewGroup>() {
attributeSections[SectionId] = InspectableObject(props) attributeSections[SectionId] = InspectableObject(props)
} }
private val LayoutModeMapping: EnumMapping<Int> =
object :
EnumMapping<Int>(
mapOf(
"LAYOUT_MODE_CLIP_BOUNDS" to ViewGroupCompat.LAYOUT_MODE_CLIP_BOUNDS,
"LAYOUT_MODE_OPTICAL_BOUNDS" to ViewGroupCompat.LAYOUT_MODE_OPTICAL_BOUNDS,
)) {}
} }

View File

@@ -21,5 +21,6 @@ data class Metadata(
val namespace: String, val namespace: String,
val name: String, val name: String,
val mutable: kotlin.Boolean, val mutable: kotlin.Boolean,
val possibleValues: Set<InspectableValue>? = emptySet(),
val tags: List<String>? = emptyList() val tags: List<String>? = emptyList()
) {} ) {}

View File

@@ -63,5 +63,4 @@ data class Size(
@Serializable(with = NumberSerializer::class) val height: Number @Serializable(with = NumberSerializer::class) val height: Number
) {} ) {}
@kotlinx.serialization.Serializable @kotlinx.serialization.Serializable data class Enumeration(val value: String?)
data class Enumeration(val values: Set<String>, val value: String?)

View File

@@ -39,7 +39,6 @@ class EnumMappingTest {
@Test @Test
fun testTurnsIntoEnumInspectable() { fun testTurnsIntoEnumInspectable() {
assertThat( assertThat(
visibility.toInspectable(View.GONE), visibility.toInspectable(View.GONE), equalTo(InspectableValue.Enum(Enumeration("GONE"))))
equalTo(InspectableValue.Enum(Enumeration(setOf("VISIBLE", "INVISIBLE", "GONE"), "GONE"))))
} }
} }