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
This commit is contained in:
Luke De Feo
2022-09-22 04:26:18 -07:00
committed by Facebook GitHub Bot
parent 31fb3dd5be
commit ed662d2468
2 changed files with 40 additions and 4 deletions

View File

@@ -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<LithoView> {
const val LithoTag = "Litho"
object DebugComponentDescriptor : NodeDescriptor<DebugComponent> {
/** a drawable or view that is mounted, along with the correct descriptor */
class MountedObject(val obj: Any, val descriptor: NodeDescriptor<Any>)
object MountedObjectDescriptor : NodeDescriptor<MountedObject> {
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<Any> = node.descriptor.getChildren(node.obj)
override fun getActiveChild(node: MountedObject): Any? = node.descriptor.getActiveChild(node.obj)
override fun getData(node: MountedObject): Map<SectionName, InspectableObject> =
node.descriptor.getData(node.obj)
override fun getTags(node: MountedObject): Set<String> = node.descriptor.getTags(node.obj)
}
class DebugComponentDescriptor(val register: DescriptorRegister) : NodeDescriptor<DebugComponent> {
override fun getId(node: DebugComponent): String = System.identityHashCode(node).toString()
override fun getName(node: DebugComponent): String {
@@ -53,9 +85,12 @@ object DebugComponentDescriptor : NodeDescriptor<DebugComponent> {
val mountedDrawable = node.mountedDrawable
if (mountedView != null) {
result.add(mountedView)
val descriptor: NodeDescriptor<Any> = register.descriptorForClassUnsafe(mountedView.javaClass)
result.add(MountedObject(mountedView, descriptor))
} else if (mountedDrawable != null) {
result.add(mountedDrawable)
val descriptor: NodeDescriptor<Any> =
register.descriptorForClassUnsafe(mountedDrawable.javaClass)
result.add(MountedObject(mountedDrawable, descriptor))
} else {
for (child in node.childComponents) {
result.add(child)

View File

@@ -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) {