From 6411eb2c0f1d1832c2cda75308fb14e129efd633 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Mon, 9 Nov 2026 12:53:11 +0100 Subject: [PATCH] fix(player): mode Signed-off-by: alperozturk96 --- .../player/media3/session/MediaSessionFactory.kt | 16 +++++++++++++++- .../client/player/model/PlaybackSettings.kt | 3 ++- .../player/ui/control/PlayerControlView.kt | 2 +- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/player/media3/session/MediaSessionFactory.kt b/app/src/main/java/com/nextcloud/client/player/media3/session/MediaSessionFactory.kt index 8892293e50aa..e004566f2ef4 100644 --- a/app/src/main/java/com/nextcloud/client/player/media3/session/MediaSessionFactory.kt +++ b/app/src/main/java/com/nextcloud/client/player/media3/session/MediaSessionFactory.kt @@ -40,9 +40,19 @@ class MediaSessionFactory @Inject constructor( } } + private val pauseAtEndOfMediaItemsListener = object : Player.Listener { + override fun onEvents(player: Player, events: Player.Events) { + if (events.containsAny(Player.EVENT_REPEAT_MODE_CHANGED, Player.EVENT_SHUFFLE_MODE_ENABLED_CHANGED)) { + (player as? ExoPlayer)?.updatePauseAtEndOfMediaItems() + } + } + } + fun create(): MediaSession { val player = createPlayer() + player.updatePauseAtEndOfMediaItems() player.addListener(resumptionPlayerListener) + player.addListener(pauseAtEndOfMediaItemsListener) return MediaSession .Builder(context, player) .setBitmapLoader(bitmapLoader) @@ -51,13 +61,17 @@ class MediaSessionFactory @Inject constructor( .build() } - private fun createPlayer(): Player = ExoPlayer.Builder(context) + private fun createPlayer(): ExoPlayer = ExoPlayer.Builder(context) .setMediaSourceFactory(DefaultMediaSourceFactory(dataSourceFactory)) .setAudioAttributes(AudioAttributes.DEFAULT, true) .setHandleAudioBecomingNoisy(true) .setSeekForwardIncrementMs(SEEK_FORWARD_INCREMENT_IN_MILLISECONDS) .build() + private fun ExoPlayer.updatePauseAtEndOfMediaItems() { + pauseAtEndOfMediaItems = repeatMode == Player.REPEAT_MODE_OFF && !shuffleModeEnabled + } + private fun createCustomLayout(): List = listOf( CommandButton .Builder() diff --git a/app/src/main/java/com/nextcloud/client/player/model/PlaybackSettings.kt b/app/src/main/java/com/nextcloud/client/player/model/PlaybackSettings.kt index 9b8c7a97a2c3..c0a067a58412 100644 --- a/app/src/main/java/com/nextcloud/client/player/model/PlaybackSettings.kt +++ b/app/src/main/java/com/nextcloud/client/player/model/PlaybackSettings.kt @@ -17,7 +17,7 @@ class PlaybackSettings @Inject constructor(context: Context) { private const val PREFERENCES_FILE_NAME = "playback_settings" private const val REPEAT_MODE_ID_KEY = "repeat_mode_id" private const val SHUFFLE_KEY = "shuffle" - private val DEFAULT_REPEAT_MODE = RepeatMode.ALL + private val DEFAULT_REPEAT_MODE = RepeatMode.OFF } private val preferences = context.getSharedPreferences(PREFERENCES_FILE_NAME, Context.MODE_PRIVATE) @@ -25,6 +25,7 @@ class PlaybackSettings @Inject constructor(context: Context) { val repeatMode: RepeatMode get() = preferences.getInt(REPEAT_MODE_ID_KEY, -1) .let { id -> RepeatMode.entries.firstOrNull { it.id == id } } + ?.takeUnless { it == RepeatMode.ALL } ?: DEFAULT_REPEAT_MODE val isShuffle: Boolean diff --git a/app/src/main/java/com/nextcloud/client/player/ui/control/PlayerControlView.kt b/app/src/main/java/com/nextcloud/client/player/ui/control/PlayerControlView.kt index 9bcae7825819..fbe10e6ade7e 100644 --- a/app/src/main/java/com/nextcloud/client/player/ui/control/PlayerControlView.kt +++ b/app/src/main/java/com/nextcloud/client/player/ui/control/PlayerControlView.kt @@ -175,7 +175,7 @@ class PlayerControlView @JvmOverloads constructor( // Repeat and Random are mutually exclusive playbackModel.setShuffle(false) - playbackModel.setRepeatMode(if (repeatSingle) RepeatMode.SINGLE else RepeatMode.ALL) + playbackModel.setRepeatMode(if (repeatSingle) RepeatMode.SINGLE else RepeatMode.OFF) } binding.ivRandom.setOnClickListener {