From ed662d2468c46f286c18409f08f5721b5d458052 Mon Sep 17 00:00:00 2001 From: Luke De Feo Date: Thu, 22 Sep 2022 04:26:18 -0700 Subject: [PATCH] Fixed bounds for native views mounted by litho Summary: We had an issue where the offset for a native view was effectively caclculated twice and summed, once by litho and once by android. Given the UI debugger expects a nodes bounds to be w.r.t its parent the android systems x,y offset is 'wrong' from ui debuggers perspective, we set it to 0,0 and rely on the calculated offsets by the litho component hierachy Reviewed By: lblasa Differential Revision: D39695663 fbshipit-source-id: d9c2be950fc68bc2286359a62746356e89299cfd --- .../uidebugger/litho/LithoDescriptors.kt | 41 +++++++++++++++++-- .../litho/UIDebuggerLithoSupport.kt | 3 +- 2 files changed, 40 insertions(+), 4 deletions(-) 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) {