Skip to content

Commit 5e119af

Browse files
committed
Merge branch 'rz/feat/session-replay' into rz/feat/session-replay-breadcrumbs-v2
2 parents 6f83386 + 0af0984 commit 5e119af

File tree

4 files changed

+28
-9
lines changed

4 files changed

+28
-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
@@ -31,7 +31,7 @@ import io.sentry.transport.ICurrentDateProvider
3131
import io.sentry.util.FileUtils
3232
import java.io.File
3333
import java.util.Date
34-
import java.util.concurrent.CopyOnWriteArrayList
34+
import java.util.LinkedList
3535
import java.util.concurrent.Executors
3636
import java.util.concurrent.ScheduledExecutorService
3737
import java.util.concurrent.ThreadFactory
@@ -72,7 +72,8 @@ internal abstract class BaseCaptureStrategy(
7272
override val currentSegment = AtomicInteger(0)
7373
override val replayCacheDir: File? get() = cache?.replayCacheDir
7474

75-
protected val currentEvents = CopyOnWriteArrayList<RRWebEvent>()
75+
protected val currentEvents = LinkedList<RRWebEvent>()
76+
private val currentEventsLock = Any()
7677
private val currentPositions = mutableListOf<Position>()
7778
private var touchMoveBaseline = 0L
7879
private var lastCapturedMoveEvent = 0L
@@ -295,11 +296,11 @@ internal abstract class BaseCaptureStrategy(
295296
}
296297
}
297298
}
298-
currentEvents.removeAll {
299-
if (it.timestamp > segmentTimestamp.time && it.timestamp < endTimestamp.time) {
300-
recordingPayload += it
299+
300+
rotateCurrentEvents(endTimestamp.time) { event ->
301+
if (event.timestamp >= segmentTimestamp.time) {
302+
recordingPayload += event
301303
}
302-
it.timestamp < endTimestamp.time
303304
}
304305

305306
val recording = ReplayRecording().apply {
@@ -321,14 +322,30 @@ internal abstract class BaseCaptureStrategy(
321322
override fun onTouchEvent(event: MotionEvent) {
322323
val rrwebEvent = event.toRRWebIncrementalSnapshotEvent()
323324
if (rrwebEvent != null) {
324-
currentEvents += rrwebEvent
325+
synchronized(currentEventsLock) {
326+
currentEvents += rrwebEvent
327+
}
325328
}
326329
}
327330

328331
override fun close() {
329332
replayExecutor.gracefullyShutdown(options)
330333
}
331334

335+
protected fun rotateCurrentEvents(
336+
until: Long,
337+
callback: ((RRWebEvent) -> Unit)? = null
338+
) {
339+
synchronized(currentEventsLock) {
340+
var event = currentEvents.peek()
341+
while (event != null && event.timestamp <= until) {
342+
callback?.invoke(event)
343+
currentEvents.remove()
344+
event = currentEvents.peek()
345+
}
346+
}
347+
}
348+
332349
private class ReplayExecutorServiceThreadFactory : ThreadFactory {
333350
private var cnt = 0
334351
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
}

sentry/src/main/java/io/sentry/ReplayRecording.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ public static final class Deserializer implements JsonDeserializer<ReplayRecordi
148148
final RRWebEventType type = RRWebEventType.values()[(int) value];
149149
switch (type) {
150150
case IncrementalSnapshot:
151+
@Nullable
151152
Map<String, Object> incrementalData =
152153
(Map<String, Object>) eventMap.get("data");
153154
if (incrementalData == null) {
@@ -187,6 +188,7 @@ public static final class Deserializer implements JsonDeserializer<ReplayRecordi
187188
payload.add(metaEvent);
188189
break;
189190
case Custom:
191+
@Nullable
190192
Map<String, Object> customData = (Map<String, Object>) eventMap.get("data");
191193
if (customData == null) {
192194
customData = Collections.emptyMap();

0 commit comments

Comments
 (0)