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
|
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())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
|||||||
@@ -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,
|
|
||||||
)) {}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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? {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
|
||||||
)) {}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
) {}
|
) {}
|
||||||
|
|||||||
@@ -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?)
|
|
||||||
|
|||||||
@@ -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"))))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user