diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/LithoDescriptors.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/LithoDescriptors.kt index c106cee2d..685ab171d 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/LithoDescriptors.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/LithoDescriptors.kt @@ -9,7 +9,9 @@ package com.facebook.flipper.plugins.uidebugger.litho import com.facebook.flipper.plugins.uidebugger.common.InspectableObject import com.facebook.flipper.plugins.uidebugger.descriptors.BaseTags +import com.facebook.flipper.plugins.uidebugger.descriptors.DescriptorRegister import com.facebook.flipper.plugins.uidebugger.descriptors.NodeDescriptor +import com.facebook.flipper.plugins.uidebugger.descriptors.SectionName import com.facebook.flipper.plugins.uidebugger.model.Bounds import com.facebook.litho.DebugComponent import com.facebook.litho.LithoView @@ -39,7 +41,37 @@ object LithoViewDescriptor : NodeDescriptor { const val LithoTag = "Litho" -object DebugComponentDescriptor : NodeDescriptor { +/** a drawable or view that is mounted, along with the correct descriptor */ +class MountedObject(val obj: Any, val descriptor: NodeDescriptor) + +object MountedObjectDescriptor : NodeDescriptor { + override fun getId(node: MountedObject): String = node.descriptor.getId(node.obj) + + override fun getBounds(node: MountedObject): Bounds? { + val bounds = node.descriptor.getBounds(node.obj) + + /** + * When we ask android for the bounds the x,y offset is w.r.t to the nearest android parent view + * group. From UI debuggers perspective using the raw android offset will double the total + * offset of this native view as the offset is included by the litho components between the + * mounted view and its native parent + */ + return bounds?.copy(x = 0, y = 0) + } + + override fun getName(node: MountedObject): String = node.descriptor.getName(node.obj) + + override fun getChildren(node: MountedObject): List = node.descriptor.getChildren(node.obj) + + override fun getActiveChild(node: MountedObject): Any? = node.descriptor.getActiveChild(node.obj) + + override fun getData(node: MountedObject): Map = + node.descriptor.getData(node.obj) + + override fun getTags(node: MountedObject): Set = node.descriptor.getTags(node.obj) +} + +class DebugComponentDescriptor(val register: DescriptorRegister) : NodeDescriptor { override fun getId(node: DebugComponent): String = System.identityHashCode(node).toString() override fun getName(node: DebugComponent): String { @@ -53,9 +85,12 @@ object DebugComponentDescriptor : NodeDescriptor { val mountedDrawable = node.mountedDrawable if (mountedView != null) { - result.add(mountedView) + val descriptor: NodeDescriptor = register.descriptorForClassUnsafe(mountedView.javaClass) + result.add(MountedObject(mountedView, descriptor)) } else if (mountedDrawable != null) { - result.add(mountedDrawable) + val descriptor: NodeDescriptor = + register.descriptorForClassUnsafe(mountedDrawable.javaClass) + result.add(MountedObject(mountedDrawable, descriptor)) } else { for (child in node.childComponents) { result.add(child) diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/UIDebuggerLithoSupport.kt b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/UIDebuggerLithoSupport.kt index 2be140361..7b34d4894 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/UIDebuggerLithoSupport.kt +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/uidebugger/litho/UIDebuggerLithoSupport.kt @@ -16,7 +16,8 @@ object UIDebuggerLithoSupport { fun addDescriptors(register: DescriptorRegister) { register.register(LithoView::class.java, LithoViewDescriptor) - register.register(DebugComponent::class.java, DebugComponentDescriptor) + register.register(MountedObject::class.java, MountedObjectDescriptor) + register.register(DebugComponent::class.java, DebugComponentDescriptor(register)) } fun addObserver(observerFactory: TreeObserverFactory) {