Skip to content

Commit a91a35f

Browse files
committed
replay: avoid initializing singlePixelBitmap in MaskRenderer.close(); recycle only if initialized and used. Update unit test to initialize via ImageView masking path before asserting recycling.
1 parent ee833e6 commit a91a35f

File tree

2 files changed

+13
-8
lines changed

2 files changed

+13
-8
lines changed

sentry-android-replay/src/main/java/io/sentry/android/replay/util/MaskRenderer.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ internal class MaskRenderer : Closeable {
2626
}
2727

2828
// Single pixel bitmap for dominant color sampling (averaging the region)
29-
internal val singlePixelBitmap: Bitmap by
29+
private val singlePixelBitmapLazy by lazy(NONE) {
3030
lazy(NONE) { Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888) }
31+
}
32+
internal val singlePixelBitmap: Bitmap by singlePixelBitmapLazy
3133
private val singlePixelBitmapCanvas: Canvas by lazy(NONE) { Canvas(singlePixelBitmap) }
3234
private val maskingPaint by lazy(NONE) { Paint() }
3335

@@ -110,8 +112,10 @@ internal class MaskRenderer : Closeable {
110112

111113
/** Releases resources. Call when done with this renderer. */
112114
override fun close() {
113-
if (!singlePixelBitmap.isRecycled) {
114-
singlePixelBitmap.recycle()
115+
if (singlePixelBitmapLazy.isInitialized()) {
116+
if (!singlePixelBitmap.isRecycled) {
117+
singlePixelBitmap.recycle()
118+
}
115119
}
116120
}
117121
}

sentry-android-replay/src/test/java/io/sentry/android/replay/util/MaskRendererTest.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -317,21 +317,22 @@ class MaskRendererTest {
317317
@Test
318318
fun `close recycles internal bitmap`() {
319319
val renderer = MaskRenderer()
320-
// Trigger lazy initialization by calling renderMasks
320+
// Ensure lazy bitmap is initialized by masking an ImageView node (dominant color path)
321321
val bitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888)
322-
val node =
323-
GenericViewHierarchyNode(
322+
bitmap.eraseColor(Color.GREEN)
323+
val imageNode =
324+
ImageViewHierarchyNode(
324325
x = 0f,
325326
y = 0f,
326327
width = 10,
327328
height = 10,
328329
elevation = 0f,
329330
distance = 0,
330-
shouldMask = false,
331+
shouldMask = true,
331332
isVisible = true,
332333
visibleRect = Rect(0, 0, 10, 10),
333334
)
334-
renderer.renderMasks(bitmap, node, null)
335+
renderer.renderMasks(bitmap, imageNode, null)
335336

336337
renderer.close()
337338
assertTrue(renderer.singlePixelBitmap.isRecycled)

0 commit comments

Comments
 (0)