getsentry / getsentry/sentry-java
Session Replay: consolidate window size detection onto OnLayoutChangeListener
- 主要语言
- Kotlin
- 星标
- 1.4k
- 派生
- 478
- 平均合并
- 2 天 23 小时
- 30 天内合并 PR
- 67
描述
## Summary
`WindowRecorder.determineWindowSize` currently has two detection paths for window size changes:
1. **Synchronous**: if the root already has size at registration time, compare and emit immediately.
2. **Deferred** (`OnPreDrawListener`): if the root has no size yet (typical — Curtains fires `onRootViewsChanged` before the first traversal), register a listener that re-checks on every pre-draw and removes itself once size is known.
[#5333](https://github.com/getsentry/sentry-java/pull/5333) added a third path — an `OnLayoutChangeListener` per tracked root — to detect same-root resizes for activities with `configChanges` (Unity, video players). This listener strictly subsumes the `OnPreDrawListener` path: it fires on the first `View.layout(0, 0, W, H)` (bounds differ from the initial 0/0/0/0), which happens on the same Choreographer frame but before draw.
## Proposed change
Replace the `OnPreDrawListener` path with the `OnLayoutChangeListener`, keeping the synchronous check for the rare case where the root already has size at add time. This would:
- Remove the dual-listener setup (simpler code, one mechanism instead of two).
- Eliminate the per-preDraw iteration that checks `hasSize()` and `root == currentRoot` on every draw until size is known.
- Unify initial detection and subsequent resize detection into a single listener.
The `OnLayoutChangeListener` already has the latest-root guard (`v != rootViews.lastOrNull()?.get()` → skip), matching the `OnPreDrawListener`'s existing `root != currentRoot` guard.
## Why it wasn't done in #5333
The refactor changes behavior for all apps, not just `configChanges` activities. It was kept out of scope to limit regression risk in the SurfaceView capture PR.
贡献指南
评估
这个 Issue 还没有评估数据。