Added inline tree attributes

Summary:
This is temporary solution to get to parity with the old plugin. In future would like to make this more flexible on the desktop side

Additionally getData was renamed to getAttributes for consistency

Reviewed By: lblasa

Differential Revision: D41845248

fbshipit-source-id: 50e94a7712f5d42938229134e212cef5d379475d
This commit is contained in:
Luke De Feo
2022-12-12 07:28:37 -08:00
committed by Facebook GitHub Bot
parent 97cca42822
commit 1a9724d790
22 changed files with 107 additions and 26 deletions

View File

@@ -72,7 +72,9 @@ class DebugComponentDescriptor(val register: DescriptorRegister) : NodeDescripto
private val StateId =
MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "Litho State")
override fun getData(node: DebugComponent): MaybeDeferred<Map<MetadataId, InspectableObject>> {
override fun getAttributes(
node: DebugComponent
): MaybeDeferred<Map<MetadataId, InspectableObject>> {
return Deferred {
val attributeSections = mutableMapOf<MetadataId, InspectableObject>()
@@ -101,4 +103,17 @@ class DebugComponentDescriptor(val register: DescriptorRegister) : NodeDescripto
override fun getTags(node: DebugComponent): Set<String> = setOf(BaseTags.Declarative, LithoTag)
override fun getSnapshot(node: DebugComponent, bitmap: Bitmap?): Bitmap? = null
override fun getInlineAttributes(node: DebugComponent): Map<String, String> {
val attributes = mutableMapOf<String, String>()
val key = node.key
val testKey = node.testKey
if (key != null && key.trim { it <= ' ' }.length > 0) {
attributes["key"] = key
}
if (testKey != null && testKey.trim { it <= ' ' }.length > 0) {
attributes["testKey"] = testKey
}
return attributes
}
}

View File

@@ -36,7 +36,7 @@ object LithoViewDescriptor : ChainedDescriptor<LithoView>() {
MetadataRegister.register(
MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "isIncrementalMountEnabled")
override fun onGetData(
override fun onGetAttributes(
node: LithoView,
attributeSections: MutableMap<MetadataId, InspectableObject>
) {

View File

@@ -25,7 +25,7 @@ object TextDrawableDescriptor : ChainedDescriptor<TextDrawable>() {
private val TextAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "text")
override fun onGetData(
override fun onGetAttributes(
node: TextDrawable,
attributeSections: MutableMap<MetadataId, InspectableObject>
) {

View File

@@ -83,14 +83,14 @@ abstract class ChainedDescriptor<T> : NodeDescriptor<T> {
open fun onGetChildren(node: T): List<Any>? = null
final override fun getData(node: T): MaybeDeferred<Map<MetadataId, InspectableObject>> {
final override fun getAttributes(node: T): MaybeDeferred<Map<MetadataId, InspectableObject>> {
val builder = mutableMapOf<MetadataId, InspectableObject>()
onGetData(node, builder)
onGetAttributes(node, builder)
var curDescriptor: ChainedDescriptor<T>? = mSuper
while (curDescriptor != null) {
curDescriptor.onGetData(node, builder)
curDescriptor.onGetAttributes(node, builder)
curDescriptor = curDescriptor.mSuper
}
@@ -101,7 +101,7 @@ abstract class ChainedDescriptor<T> : NodeDescriptor<T> {
* Get the data to show for this node in the sidebar of the inspector. Each key will be a have its
* own section
*/
open fun onGetData(node: T, attributeSections: MutableMap<MetadataId, InspectableObject>) {}
open fun onGetAttributes(node: T, attributeSections: MutableMap<MetadataId, InspectableObject>) {}
/** Get a snapshot of the node. */
final override fun getSnapshot(node: T, bitmap: Bitmap?): Bitmap? {
@@ -111,4 +111,21 @@ abstract class ChainedDescriptor<T> : NodeDescriptor<T> {
open fun onGetSnapshot(node: T, bitmap: Bitmap?): Bitmap? {
return null
}
final override fun getInlineAttributes(node: T): Map<String, String> {
val builder = mutableMapOf<String, String>()
onGetInlineAttributes(node, builder)
var curDescriptor: ChainedDescriptor<T>? = mSuper
while (curDescriptor != null) {
curDescriptor.onGetInlineAttributes(node, builder)
curDescriptor = curDescriptor.mSuper
}
return builder
}
open fun onGetInlineAttributes(node: T, attributes: MutableMap<String, String>) {}
}

View File

@@ -20,7 +20,7 @@ object ColorDrawableDescriptor : ChainedDescriptor<ColorDrawable>() {
override fun onGetName(node: ColorDrawable): String = node.javaClass.simpleName
override fun onGetData(
override fun onGetAttributes(
node: ColorDrawable,
attributeSections: MutableMap<MetadataId, InspectableObject>
) {

View File

@@ -26,7 +26,7 @@ object DrawableDescriptor : ChainedDescriptor<Drawable>() {
override fun onGetBounds(node: Drawable): Bounds =
Bounds(node.bounds.left, node.bounds.top, node.bounds.width(), node.bounds.height())
override fun onGetData(
override fun onGetAttributes(
node: Drawable,
attributeSections: MutableMap<MetadataId, InspectableObject>
) {

View File

@@ -32,7 +32,7 @@ class FragmentFrameworkDescriptor(val register: DescriptorRegister) :
override fun onGetChildren(node: android.app.Fragment): List<Any> =
node.view?.let { view -> listOf(view) } ?: listOf()
override fun onGetData(
override fun onGetAttributes(
node: android.app.Fragment,
attributeSections: MutableMap<MetadataId, InspectableObject>
) {

View File

@@ -58,7 +58,7 @@ class FragmentSupportDescriptor(val register: DescriptorRegister) :
}
}
override fun onGetData(
override fun onGetAttributes(
node: androidx.fragment.app.Fragment,
attributeSections: MutableMap<MetadataId, InspectableObject>
) {

View File

@@ -32,7 +32,7 @@ object ImageViewDescriptor : ChainedDescriptor<ImageView>() {
override fun onGetName(node: ImageView): String = node.javaClass.simpleName
override fun onGetData(
override fun onGetAttributes(
node: ImageView,
attributeSections: MutableMap<MetadataId, InspectableObject>
) {

View File

@@ -71,14 +71,20 @@ interface NodeDescriptor<T> {
fun getActiveChild(node: T): Any?
/**
* Get the data to show for this node in the sidebar of the inspector. The object will be shown in
* order and with a header matching the given name.
* Get the attribute to show for this node in the sidebar of the inspector. The object first level
* is a section and subsequent objects within are the first level of that section. Nested objects
* will nest in the sidebar
*/
fun getData(node: T): MaybeDeferred<Map<MetadataId, InspectableObject>>
fun getAttributes(node: T): MaybeDeferred<Map<MetadataId, InspectableObject>>
/**
* Set of tags to describe this node in an abstract way for the UI Unfortunately this can't be an
* enum as we have to plugin 3rd party frameworks dynamically
*/
fun getTags(node: T): Set<String>
/**
* These are shown inline in the tree view on the desktop, will likely be removed in the future
*/
fun getInlineAttributes(node: T): Map<String, String> = mutableMapOf()
}

View File

@@ -27,7 +27,7 @@ object ObjectDescriptor : NodeDescriptor<Any> {
override fun getChildren(node: Any) = listOf<Any>()
override fun getData(node: Any) = Immediate(mapOf<MetadataId, InspectableObject>())
override fun getAttributes(node: Any) = Immediate(mapOf<MetadataId, InspectableObject>())
override fun getBounds(node: Any): Bounds = Bounds(0, 0, 0, 0)

View File

@@ -38,8 +38,8 @@ object OffsetChildDescriptor : NodeDescriptor<OffsetChild> {
override fun getActiveChild(node: OffsetChild): Any? = node.descriptor.getActiveChild(node.child)
override fun getData(node: OffsetChild): MaybeDeferred<Map<MetadataId, InspectableObject>> =
node.descriptor.getData(node.child)
override fun getAttributes(node: OffsetChild): MaybeDeferred<Map<MetadataId, InspectableObject>> =
node.descriptor.getAttributes(node.child)
override fun getTags(node: OffsetChild): Set<String> = node.descriptor.getTags(node.child)
override fun getSnapshot(node: OffsetChild, bitmap: Bitmap?): Bitmap? =

View File

@@ -46,7 +46,7 @@ object TextViewDescriptor : ChainedDescriptor<TextView>() {
override fun onGetName(node: TextView): String = node.javaClass.simpleName
override fun onGetData(
override fun onGetAttributes(
node: TextView,
attributeSections: MutableMap<MetadataId, InspectableObject>
) {

View File

@@ -273,7 +273,10 @@ object ViewDescriptor : ChainedDescriptor<View>() {
override fun onGetTags(node: View): Set<String> = BaseTags.NativeAndroid
override fun onGetData(node: View, attributeSections: MutableMap<MetadataId, InspectableObject>) {
override fun onGetAttributes(
node: View,
attributeSections: MutableMap<MetadataId, InspectableObject>
) {
val props = mutableMapOf<Int, Inspectable>()
@@ -365,6 +368,16 @@ object ViewDescriptor : ChainedDescriptor<View>() {
attributeSections[SectionId] = InspectableObject(props.toMap())
}
override fun onGetInlineAttributes(node: View, attributes: MutableMap<String, String>) {
val id = node.id
if (id == View.NO_ID) {
return
}
val value = ResourcesUtil.getIdStringQuietly(node.getContext(), node.getResources(), id)
attributes["id"] = value
}
override fun onGetSnapshot(node: View, bitmap: Bitmap?): Bitmap? {
if (node.width <= 0 || node.height <= 0) {
return null

View File

@@ -60,7 +60,7 @@ object ViewGroupDescriptor : ChainedDescriptor<ViewGroup>() {
private val ClipToPaddingAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_LAYOUT, NAMESPACE, "clipToPadding")
override fun onGetData(
override fun onGetAttributes(
node: ViewGroup,
attributeSections: MutableMap<MetadataId, InspectableObject>
) {

View File

@@ -31,7 +31,7 @@ object ViewPagerDescriptor : ChainedDescriptor<ViewPager>() {
private val CurrentItemIndexAttributeId =
MetadataRegister.register(MetadataRegister.TYPE_ATTRIBUTE, NAMESPACE, "currentItemIndex")
override fun onGetData(
override fun onGetAttributes(
node: ViewPager,
attributeSections: MutableMap<MetadataId, InspectableObject>
) {

View File

@@ -38,7 +38,7 @@ object WindowDescriptor : ChainedDescriptor<Window>() {
override fun onGetChildren(node: Window): List<Any> = listOf(node.decorView)
@SuppressLint("PrivateApi")
override fun onGetData(
override fun onGetAttributes(
node: Window,
attributeSections: MutableMap<MetadataId, InspectableObject>
) {

View File

@@ -15,6 +15,7 @@ data class Node(
val qualifiedName: String,
val name: String,
val attributes: Map<MetadataId, InspectableObject>,
val inlineAttributes: Map<String, String>,
val bounds: Bounds,
val tags: Set<String>,
val children: List<Id>,

View File

@@ -61,6 +61,7 @@ class PartialLayoutTraversal(
descriptor.getQualifiedName(node),
descriptor.getName(node),
emptyMap(),
emptyMap(),
descriptor.getBounds(node),
emptySet(),
emptyList(),
@@ -92,7 +93,7 @@ class PartialLayoutTraversal(
}
}
val attributes = descriptor.getData(node)
val attributes = descriptor.getAttributes(node)
val bounds = descriptor.getBounds(node)
val tags = descriptor.getTags(node)
visited.add(
@@ -102,6 +103,7 @@ class PartialLayoutTraversal(
descriptor.getQualifiedName(node),
descriptor.getName(node),
attrs,
descriptor.getInlineAttributes(node),
bounds,
tags,
childrenIds,