From 05cd5972c21ebcacf3cd5952e92f121a84b5c9a9 Mon Sep 17 00:00:00 2001 From: Harang Date: Wed, 5 Nov 2025 20:43:24 +0900 Subject: [PATCH] fix(android): prevent duplicate `onVideoEnd` callback on prop changes (#4762) --- .../brentvatne/exoplayer/ReactExoplayerView.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index f175dece..539ecfd1 100644 --- a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -227,6 +227,7 @@ public class ReactExoplayerView extends FrameLayout implements */ private boolean isSeeking = false; private long seekPosition = -1; + private boolean hasVideoEnded = false; // Props from React private Source source = new Source(); @@ -1411,6 +1412,7 @@ public class ReactExoplayerView extends FrameLayout implements break; case Player.STATE_READY: text += "ready"; + hasVideoEnded = false; eventEmitter.onReadyForDisplay.invoke(); onBuffering(false); clearProgressMessageHandler(); // ensure there is no other message @@ -1429,7 +1431,10 @@ public class ReactExoplayerView extends FrameLayout implements case Player.STATE_ENDED: text += "ended"; updateProgress(); - eventEmitter.onVideoEnd.invoke(); + if (!hasVideoEnded) { + hasVideoEnded = true; + eventEmitter.onVideoEnd.invoke(); + } onStopPlayback(); setKeepScreenOn(false); break; @@ -1819,7 +1824,10 @@ public class ReactExoplayerView extends FrameLayout implements if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION && player.getRepeatMode() == Player.REPEAT_MODE_ONE) { updateProgress(); - eventEmitter.onVideoEnd.invoke(); + if (!hasVideoEnded) { + hasVideoEnded = true; + eventEmitter.onVideoEnd.invoke(); + } } } @@ -2030,6 +2038,7 @@ public class ReactExoplayerView extends FrameLayout implements } if (!isSourceEqual) { + hasVideoEnded = false; playerNeedsSource = true; initializePlayer(); }