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:
committed by
Facebook GitHub Bot
parent
0ebedc9c49
commit
0ac8c2a6b3
@@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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>()
|
||||
}
|
||||
|
||||
@@ -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? {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
)) {}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
) {}
|
||||
|
||||
@@ -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?)
|
||||
|
||||
@@ -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"))))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user