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
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,17 +72,41 @@ 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<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 {
@@ -97,13 +116,16 @@ object ComponentPropExtractor {
val fields = mutableMapOf<MetadataId, Inspectable>()
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<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
}
@@ -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())
}
}

View File

@@ -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<YogaDirection>())
private val FlexDirectionId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "flexDirection")
MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"flexDirection",
false,
enumToInspectableSet<YogaFlexDirection>())
private val JustifyContentId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "justifyContent")
MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"justifyContent",
false,
enumToInspectableSet<YogaJustify>())
private val AlignItemsId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "alignItems")
MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"alignItems",
false,
enumToInspectableSet<YogaAlign>())
private val AlignSelfId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "alignSelf")
MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"alignSelf",
false,
enumToInspectableSet<YogaAlign>())
private val AlignContentId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "alignContent")
MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"alignContent",
false,
enumToInspectableSet<YogaAlign>())
private val PositionTypeId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "positionType")
MetadataRegister.register(
MetadataRegister.TYPE_LAYOUT,
NAMESPACE,
"positionType",
false,
enumToInspectableSet<YogaPositionType>())
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<YogaDirection>(), layout.layoutDirection.name))
props[DirectionId] = InspectableValue.Enum(Enumeration(layout.layoutDirection.name))
props[FlexDirectionId] =
InspectableValue.Enum(
Enumeration(enumToSet<YogaFlexDirection>(), layout.flexDirection.name))
props[JustifyContentId] =
InspectableValue.Enum(Enumeration(enumToSet<YogaJustify>(), layout.justifyContent.name))
props[AlignItemsId] =
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[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 <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} ")
}
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 {
return InspectableValue.Enum(Enumeration(mapping.keys, getStringRepresentation(value)))
return InspectableValue.Enum(Enumeration(getStringRepresentation(value)))
}
companion object {
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.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<ImageView>() {
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<ScaleType>())
override fun onGetName(node: ImageView): String = node.javaClass.simpleName
@@ -35,17 +42,5 @@ object ImageViewDescriptor : ChainedDescriptor<ImageView>() {
attributeSections[SectionId] = InspectableObject(props)
}
private val scaleTypeMapping: 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,
)) {}
private val scaleTypeMapping: EnumMapping<ScaleType> = enumMapping<ScaleType>()
}

View File

@@ -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<InspectableValue>?
): 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<InspectableValue>? = 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<InspectableValue>? = emptySet()
): MetadataId {
return register(dynamicMetadata, type, namespace, name, mutable)
return register(dynamicMetadata, type, namespace, name, mutable, possibleValues)
}
fun get(namespace: String, name: String): Metadata? {

View File

@@ -29,6 +29,111 @@ import java.lang.reflect.Field
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 var SectionId =
@@ -54,13 +159,23 @@ object ViewDescriptor : ChainedDescriptor<View>() {
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<View>() {
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<View>() {
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<View>() {
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 ListenerInfoField: Field? = null
private var OnClickListenerField: Field? = null

View File

@@ -17,6 +17,14 @@ import com.facebook.flipper.plugins.uidebugger.model.*
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 var SectionId =
MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, NAMESPACE)
@@ -41,9 +49,14 @@ object ViewGroupDescriptor : ChainedDescriptor<ViewGroup>() {
}
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<ViewGroup>() {
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 name: String,
val mutable: kotlin.Boolean,
val possibleValues: Set<InspectableValue>? = emptySet(),
val tags: List<String>? = emptyList()
) {}

View File

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

View File

@@ -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"))))
}
}