From 01b3322e03a6191ee5c1761e766dd79bc81a0594 Mon Sep 17 00:00:00 2001 From: Kat Huang Date: Sat, 17 Aug 2024 17:19:10 -0600 Subject: [PATCH 1/5] Log in seek --- .../brentvatne/common/react/VideoEventEmitter.kt | 7 +++++++ .../brentvatne/exoplayer/ReactExoplayerView.java | 16 +++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/brentvatne/common/react/VideoEventEmitter.kt b/android/src/main/java/com/brentvatne/common/react/VideoEventEmitter.kt index b227bfc1..fa6dd107 100644 --- a/android/src/main/java/com/brentvatne/common/react/VideoEventEmitter.kt +++ b/android/src/main/java/com/brentvatne/common/react/VideoEventEmitter.kt @@ -22,6 +22,7 @@ enum class EventTypes(val eventName: String) { EVENT_BANDWIDTH("onVideoBandwidthUpdate"), EVENT_CONTROLS_VISIBILITY_CHANGE("onControlsVisibilityChange"), EVENT_SEEK("onVideoSeek"), + EVENT_SEEK_COMPLETE("onVideoSeekComplete"), EVENT_END("onVideoEnd"), EVENT_FULLSCREEN_WILL_PRESENT("onVideoFullscreenPlayerWillPresent"), EVENT_FULLSCREEN_DID_PRESENT("onVideoFullscreenPlayerDidPresent"), @@ -71,6 +72,7 @@ class VideoEventEmitter { lateinit var onVideoBandwidthUpdate: (bitRateEstimate: Long, height: Int, width: Int, trackId: String) -> Unit lateinit var onVideoPlaybackStateChanged: (isPlaying: Boolean, isSeeking: Boolean) -> Unit lateinit var onVideoSeek: (currentPosition: Long, seekTime: Long) -> Unit + lateinit var onVideoSeekComplete: (currentPosition: Long) -> Unit lateinit var onVideoEnd: () -> Unit lateinit var onVideoFullscreenPlayerWillPresent: () -> Unit lateinit var onVideoFullscreenPlayerDidPresent: () -> Unit @@ -170,6 +172,11 @@ class VideoEventEmitter { putDouble("seekTime", seekTime / 1000.0) } } + onVideoSeekComplete = { currentPosition -> + event.dispatch(EventTypes.EVENT_SEEK_COMPLETE) { + putDouble("currentTime", currentPosition / 1000.0) + } + } onVideoEnd = { event.dispatch(EventTypes.EVENT_END) } diff --git a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 6f854efb..52757b32 100644 --- a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -23,6 +23,7 @@ import android.os.IBinder; import android.os.Looper; import android.os.Message; import android.text.TextUtils; +import android.util.Log; import android.view.View; import android.view.Window; import android.view.accessibility.CaptioningManager; @@ -303,6 +304,15 @@ public class ReactExoplayerView extends FrameLayout implements } }; + private void handleSeekCompletion() { + if (player != null && player.getPlaybackState() == Player.STATE_READY) { + Log.d("ReactExoplayerView", "onSeekComplete triggered. Current position: " + player.getCurrentPosition()); + eventEmitter.onSeekComplete.invoke(player.getCurrentPosition()); + isSeeking = false; + seekPosition = -1; + } + } + public double getPositionInFirstPeriodMsForCurrentWindow(long currentPosition) { Timeline.Window window = new Timeline.Window(); if(!player.getCurrentTimeline().isEmpty()) { @@ -761,7 +771,8 @@ public class ReactExoplayerView extends FrameLayout implements .setBandwidthMeter(bandwidthMeter) .setLoadControl(loadControl) .setMediaSourceFactory(mediaSourceFactory) - .build(); + .build(); + player.addListener(self); ReactNativeVideoManager.Companion.getInstance().onInstanceCreated(instanceId, player); refreshDebugState(); player.addListener(self); @@ -1371,6 +1382,7 @@ public class ReactExoplayerView extends FrameLayout implements playerControlView.show(); } setKeepScreenOn(preventsDisplaySleepDuringVideoPlayback); + handleSeekCompletion(); break; case Player.STATE_ENDED: text += "ended"; @@ -2137,6 +2149,8 @@ public class ReactExoplayerView extends FrameLayout implements public void seekTo(long positionMs) { if (player != null) { + isSeeking = true; + seekPosition = positionMs; player.seekTo(positionMs); } } -- 2.46.1 From f0db0a68683fa780d60ccdc88a9274c39fcdffd2 Mon Sep 17 00:00:00 2001 From: Kat Huang Date: Sat, 17 Aug 2024 17:33:52 -0600 Subject: [PATCH 2/5] kat wip --- .../main/java/com/brentvatne/exoplayer/ReactExoplayerView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 52757b32..3d4ff996 100644 --- a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -307,7 +307,7 @@ public class ReactExoplayerView extends FrameLayout implements private void handleSeekCompletion() { if (player != null && player.getPlaybackState() == Player.STATE_READY) { Log.d("ReactExoplayerView", "onSeekComplete triggered. Current position: " + player.getCurrentPosition()); - eventEmitter.onSeekComplete.invoke(player.getCurrentPosition()); + eventEmitter.onVideoSeekComplete.invoke(player.getCurrentPosition()); isSeeking = false; seekPosition = -1; } -- 2.46.1 From c7a45d421b168dcc61235ee06c684c9fbbc05eb9 Mon Sep 17 00:00:00 2001 From: Kat Huang Date: Sat, 17 Aug 2024 18:04:24 -0600 Subject: [PATCH 3/5] Only complete seek if seek was in progress --- .../java/com/brentvatne/exoplayer/ReactExoplayerView.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 3d4ff996..ac435dcc 100644 --- a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -229,6 +229,7 @@ public class ReactExoplayerView extends FrameLayout implements */ private boolean isSeeking = false; private long seekPosition = -1; + private boolean isSeekInProgress = false; // Props from React private Source source = new Source(); @@ -310,6 +311,7 @@ public class ReactExoplayerView extends FrameLayout implements eventEmitter.onVideoSeekComplete.invoke(player.getCurrentPosition()); isSeeking = false; seekPosition = -1; + isSeekInProgress = false; } } @@ -1382,7 +1384,9 @@ public class ReactExoplayerView extends FrameLayout implements playerControlView.show(); } setKeepScreenOn(preventsDisplaySleepDuringVideoPlayback); - handleSeekCompletion(); + if (isSeekInProgress) { + handleSeekCompletion(); + } break; case Player.STATE_ENDED: text += "ended"; @@ -2149,6 +2153,7 @@ public class ReactExoplayerView extends FrameLayout implements public void seekTo(long positionMs) { if (player != null) { + isSeekInProgress = true; isSeeking = true; seekPosition = positionMs; player.seekTo(positionMs); -- 2.46.1 From 2dcde42fd64e8cb8db4a15a7d0478254b7a7297c Mon Sep 17 00:00:00 2001 From: Kat Huang Date: Sat, 17 Aug 2024 21:23:13 -0600 Subject: [PATCH 4/5] Add logs --- .../com/brentvatne/exoplayer/ReactExoplayerView.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index ac435dcc..b6cd9106 100644 --- a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -306,9 +306,9 @@ public class ReactExoplayerView extends FrameLayout implements }; private void handleSeekCompletion() { - if (player != null && player.getPlaybackState() == Player.STATE_READY) { - Log.d("ReactExoplayerView", "onSeekComplete triggered. Current position: " + player.getCurrentPosition()); - eventEmitter.onVideoSeekComplete.invoke(player.getCurrentPosition()); + if (player != null && player.getPlaybackState() == Player.STATE_READY && isSeekInProgress) { + Log.d("ReactExoplayerView", "handleSeekCompletion: currentPosition=" + player.getCurrentPosition()); + eventEmitter.onSeekComplete.invoke(player.getCurrentPosition()); isSeeking = false; seekPosition = -1; isSeekInProgress = false; @@ -1351,6 +1351,7 @@ public class ReactExoplayerView extends FrameLayout implements if (events.contains(Player.EVENT_PLAYBACK_STATE_CHANGED) || events.contains(Player.EVENT_PLAY_WHEN_READY_CHANGED)) { int playbackState = player.getPlaybackState(); boolean playWhenReady = player.getPlayWhenReady(); + Log.d("ReactExoplayerView", "onEvents: playbackState=" + playbackState + ", playWhenReady=" + playWhenReady); String text = "onStateChanged: playWhenReady=" + playWhenReady + ", playbackState="; eventEmitter.onPlaybackRateChange.invoke(playWhenReady && playbackState == ExoPlayer.STATE_READY ? 1.0f : 0.0f); switch (playbackState) { @@ -1384,6 +1385,7 @@ public class ReactExoplayerView extends FrameLayout implements playerControlView.show(); } setKeepScreenOn(preventsDisplaySleepDuringVideoPlayback); + Log.d("ReactExoplayerView", "Player STATE_READY: currentPosition=" + player.getCurrentPosition()); if (isSeekInProgress) { handleSeekCompletion(); } @@ -1650,6 +1652,7 @@ public class ReactExoplayerView extends FrameLayout implements @Override public void onPositionDiscontinuity(@NonNull Player.PositionInfo oldPosition, @NonNull Player.PositionInfo newPosition, @Player.DiscontinuityReason int reason) { + Log.d("ReactExoplayerView", "onPositionDiscontinuity: reason=" + reason + ", oldPosition=" + oldPosition.positionMs + ", newPosition=" + newPosition.positionMs); if (reason == Player.DISCONTINUITY_REASON_SEEK) { isSeeking = true; seekPosition = newPosition.positionMs; @@ -2153,6 +2156,7 @@ public class ReactExoplayerView extends FrameLayout implements public void seekTo(long positionMs) { if (player != null) { + Log.d("ReactExoplayerView", "seekTo: positionMs=" + positionMs); isSeekInProgress = true; isSeeking = true; seekPosition = positionMs; -- 2.46.1 From d2ab22b99fc86c25b97dd873863ed2e755afe61d Mon Sep 17 00:00:00 2001 From: Kat Huang Date: Sat, 17 Aug 2024 21:28:29 -0600 Subject: [PATCH 5/5] wip --- .../main/java/com/brentvatne/exoplayer/ReactExoplayerView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index b6cd9106..95eb11b9 100644 --- a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -308,7 +308,7 @@ public class ReactExoplayerView extends FrameLayout implements private void handleSeekCompletion() { if (player != null && player.getPlaybackState() == Player.STATE_READY && isSeekInProgress) { Log.d("ReactExoplayerView", "handleSeekCompletion: currentPosition=" + player.getCurrentPosition()); - eventEmitter.onSeekComplete.invoke(player.getCurrentPosition()); + eventEmitter.onVideoSeekComplete.invoke(player.getCurrentPosition()); isSeeking = false; seekPosition = -1; isSeekInProgress = false; -- 2.46.1