Improve getSnapshot

Summary: Addresses a few issues with the existing implementation.

Reviewed By: LukeDefeo

Differential Revision: D39812624

fbshipit-source-id: 6f955f62bc5a7943558541e4cf7b4ccba4fd9be3
This commit is contained in:
Lorenzo Blasa
2022-09-27 13:00:04 -07:00
committed by Facebook GitHub Bot
parent e7742169f5
commit 08b3489201
2 changed files with 38 additions and 14 deletions

View File

@@ -19,10 +19,7 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.LinearLayout import android.widget.LinearLayout
import com.facebook.flipper.plugins.uidebugger.common.EnumMapping import com.facebook.flipper.plugins.uidebugger.common.*
import com.facebook.flipper.plugins.uidebugger.common.Inspectable
import com.facebook.flipper.plugins.uidebugger.common.InspectableObject
import com.facebook.flipper.plugins.uidebugger.common.InspectableValue
import com.facebook.flipper.plugins.uidebugger.model.Bounds import com.facebook.flipper.plugins.uidebugger.model.Bounds
import com.facebook.flipper.plugins.uidebugger.util.ResourcesUtil import com.facebook.flipper.plugins.uidebugger.util.ResourcesUtil
import java.lang.reflect.Field import java.lang.reflect.Field
@@ -108,20 +105,24 @@ object ViewDescriptor : ChainedDescriptor<View>() {
} }
override fun onGetSnapshot(node: View, bitmap: Bitmap?): Bitmap? { override fun onGetSnapshot(node: View, bitmap: Bitmap?): Bitmap? {
if (node.width <= 0 || node.height <= 0) {
return null
}
var workingBitmap = bitmap var workingBitmap = bitmap
try { try {
if (workingBitmap == null) { val differentSize =
if (bitmap != null) (node.width != bitmap.width || node.height != bitmap.height)
else false
if (workingBitmap == null || differentSize) {
val viewWidth: Int = node.width val viewWidth: Int = node.width
val viewHeight: Int = node.height val viewHeight: Int = node.height
workingBitmap = Bitmap.createBitmap(viewWidth, viewHeight, Bitmap.Config.RGB_565) workingBitmap = BitmapPool.createBitmapWithDefaultConfig(viewWidth, viewHeight)
} }
workingBitmap?.let { b -> val canvas = Canvas(workingBitmap)
val canvas = Canvas(b) node.draw(canvas)
node.draw(canvas)
}
} catch (e: OutOfMemoryError) {} } catch (e: OutOfMemoryError) {}
return workingBitmap return workingBitmap

View File

@@ -7,14 +7,13 @@
package com.facebook.flipper.plugins.uidebugger.descriptors package com.facebook.flipper.plugins.uidebugger.descriptors
import android.graphics.Bitmap
import android.graphics.Canvas
import android.os.Build import android.os.Build
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.ViewGroupCompat import androidx.core.view.ViewGroupCompat
import com.facebook.flipper.plugins.uidebugger.common.EnumMapping import com.facebook.flipper.plugins.uidebugger.common.*
import com.facebook.flipper.plugins.uidebugger.common.Inspectable
import com.facebook.flipper.plugins.uidebugger.common.InspectableObject
import com.facebook.flipper.plugins.uidebugger.common.InspectableValue
import com.facebook.flipper.plugins.uidebugger.core.FragmentTracker import com.facebook.flipper.plugins.uidebugger.core.FragmentTracker
object ViewGroupDescriptor : ChainedDescriptor<ViewGroup>() { object ViewGroupDescriptor : ChainedDescriptor<ViewGroup>() {
@@ -51,6 +50,30 @@ object ViewGroupDescriptor : ChainedDescriptor<ViewGroup>() {
attributeSections["ViewGroup"] = InspectableObject(viewGroupAttrs) attributeSections["ViewGroup"] = InspectableObject(viewGroupAttrs)
} }
override fun onGetSnapshot(node: ViewGroup, bitmap: Bitmap?): Bitmap? {
if (node.width <= 0 || node.height <= 0) {
return null
}
var workingBitmap = bitmap
try {
val differentSize =
if (bitmap != null) (node.width != bitmap.width || node.height != bitmap.height)
else false
if (workingBitmap == null || differentSize) {
val viewWidth: Int = node.width
val viewHeight: Int = node.height
workingBitmap = BitmapPool.createBitmapWithDefaultConfig(viewWidth, viewHeight)
}
val canvas = Canvas(workingBitmap)
node.draw(canvas)
} catch (e: OutOfMemoryError) {}
return workingBitmap
}
private val LayoutModeMapping: EnumMapping<Int> = private val LayoutModeMapping: EnumMapping<Int> =
object : object :
EnumMapping<Int>( EnumMapping<Int>(