SIGN IN SIGN UP

fix(replay): Fix VerifyError in Compose masking under DexGuard/R8 obfuscation (#5507)

* fix(replay): Fix VerifyError in Compose masking under DexGuard/R8 obfuscation

ComposeViewHierarchyNode.boundsInWindow returned an android.graphics.Rect
while the surrounding code carried it as androidx.compose.ui.geometry.Rect,
mixing the two Rect types in the same method. Under aggressive obfuscation
(DexGuard 9.13.2 / R8 full mode) this could be rejected at class load with
a VerifyError, crashing Replay when traversing the Compose tree.

Make boundsInWindow return androidx.compose.ui.geometry.Rect throughout and
add a Rect.toRect() extension to convert to android.graphics.Rect only at
the boundary where the view-hierarchy node needs it.

Fixes #5497

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* changelog

* fix(replay): Round Compose mask bounds outward to avoid zero-area masks

isVisible/shouldMask are derived from the sub-pixel float bounds, but the
android.graphics.Rect stored on the node (and drawn by MaskRenderer) used
truncating toInt(). A sub-pixel node could be marked visible+maskable yet
store a zero-width/height rect, so the mask wasn't drawn and sensitive
content leaked. Round outward (floor min, ceil max) so a non-empty float
rect always yields a non-empty integer rect, biasing toward over-masking.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
R
Roman Zavarnitsyn committed
8c7718c4199deb7d801a643ba768d97f499ec156
Parent: abcd889
Committed by GitHub <noreply@github.com> on 6/8/2026, 3:51:12 PM