Skip to content

Commit a3d581c

Browse files
committed
Address PR feedback
1 parent 69e5144 commit a3d581c

File tree

3 files changed

+26
-9
lines changed

3 files changed

+26
-9
lines changed

sentry-android-replay/src/main/java/io/sentry/android/replay/WindowRecorder.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ internal class WindowRecorder(
137137
) : FixedWindowCallback(delegate) {
138138
override fun dispatchTouchEvent(event: MotionEvent?): Boolean {
139139
if (event != null) {
140-
val copy: MotionEvent = MotionEvent.obtain(event)
140+
val copy: MotionEvent = MotionEvent.obtainNoHistory(event)
141141
try {
142142
touchRecorderCallback?.onTouchEvent(copy)
143143
} catch (e: Throwable) {

sentry-android-replay/src/main/java/io/sentry/android/replay/capture/BaseCaptureStrategy.kt

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import io.sentry.transport.ICurrentDateProvider
3030
import io.sentry.util.FileUtils
3131
import java.io.File
3232
import java.util.Date
33-
import java.util.concurrent.CopyOnWriteArrayList
33+
import java.util.LinkedList
3434
import java.util.concurrent.Executors
3535
import java.util.concurrent.ScheduledExecutorService
3636
import java.util.concurrent.ThreadFactory
@@ -71,7 +71,8 @@ internal abstract class BaseCaptureStrategy(
7171
override val currentSegment = AtomicInteger(0)
7272
override val replayCacheDir: File? get() = cache?.replayCacheDir
7373

74-
protected val currentEvents = CopyOnWriteArrayList<RRWebEvent>()
74+
protected val currentEvents = LinkedList<RRWebEvent>()
75+
private val currentEventsLock = Any()
7576
private val currentPositions = mutableListOf<Position>()
7677
private var touchMoveBaseline = 0L
7778
private var lastCapturedMoveEvent = 0L
@@ -264,11 +265,11 @@ internal abstract class BaseCaptureStrategy(
264265
}
265266
}
266267
}
267-
currentEvents.removeAll {
268-
if (it.timestamp > segmentTimestamp.time && it.timestamp < endTimestamp.time) {
269-
recordingPayload += it
268+
269+
rotateCurrentEvents(endTimestamp.time) { event ->
270+
if (event.timestamp >= segmentTimestamp.time) {
271+
recordingPayload += event
270272
}
271-
it.timestamp < endTimestamp.time
272273
}
273274

274275
val recording = ReplayRecording().apply {
@@ -290,14 +291,30 @@ internal abstract class BaseCaptureStrategy(
290291
override fun onTouchEvent(event: MotionEvent) {
291292
val rrwebEvent = event.toRRWebIncrementalSnapshotEvent()
292293
if (rrwebEvent != null) {
293-
currentEvents += rrwebEvent
294+
synchronized(currentEventsLock) {
295+
currentEvents += rrwebEvent
296+
}
294297
}
295298
}
296299

297300
override fun close() {
298301
replayExecutor.gracefullyShutdown(options)
299302
}
300303

304+
protected fun rotateCurrentEvents(
305+
until: Long,
306+
callback: ((RRWebEvent) -> Unit)? = null,
307+
) {
308+
synchronized(currentEventsLock) {
309+
var event = currentEvents.peek()
310+
while (event != null && event.timestamp <= until) {
311+
callback?.invoke(event)
312+
currentEvents.remove()
313+
event = currentEvents.peek()
314+
}
315+
}
316+
}
317+
301318
private class ReplayExecutorServiceThreadFactory : ThreadFactory {
302319
private var cnt = 0
303320
override fun newThread(r: Runnable): Thread {

sentry-android-replay/src/main/java/io/sentry/android/replay/capture/BufferCaptureStrategy.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,6 @@ internal class BufferCaptureStrategy(
176176
override fun onTouchEvent(event: MotionEvent) {
177177
super.onTouchEvent(event)
178178
val bufferLimit = dateProvider.currentTimeMillis - options.experimental.sessionReplay.errorReplayDuration
179-
currentEvents.removeAll { it.timestamp < bufferLimit }
179+
rotateCurrentEvents(bufferLimit)
180180
}
181181
}

0 commit comments

Comments
 (0)