From 00d05cc6fc5742b6e2af2f280a73c74249521b09 Mon Sep 17 00:00:00 2001 From: FuAndTuan Date: Mon, 13 Oct 2025 22:43:27 +1100 Subject: [PATCH] Fix #1795: Persist shuffle and repeat mode across sessions --- .../org/schabi/newpipe/player/Player.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 39f941693..29429e280 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -181,6 +181,8 @@ public final class Player implements PlaybackListener, Listener { public static final int RENDERER_UNAVAILABLE = -1; private static final String PICASSO_PLAYER_THUMBNAIL_TAG = "PICASSO_PLAYER_THUMBNAIL_TAG"; + private static final String PREF_KEY_SHUFFLE_ENABLED = "player_shuffle_enabled"; + private static final String PREF_KEY_REPEAT_MODE = "player_repeat_mode"; /*////////////////////////////////////////////////////////////////////////// // Playback @@ -617,6 +619,22 @@ public final class Player implements PlaybackListener, Listener { playQueue.init(); reloadPlayQueueManager(); + final int persistedRepeat = loadRepeatFromPrefs(); + final boolean persistedShuffle = loadShuffleFromPrefs(); + + simpleExoPlayer.setRepeatMode(persistedRepeat); + simpleExoPlayer.setShuffleModeEnabled(persistedShuffle); + + if (persistedShuffle && !playQueue.isShuffled()) { + playQueue.shuffle(); + } else if (!persistedShuffle && playQueue.isShuffled()) { + playQueue.unshuffle(); + } + + UIs.call(ui -> ui.onRepeatModeChanged(persistedRepeat)); + UIs.call(ui -> ui.onShuffleModeEnabledChanged(persistedShuffle)); + notifyPlaybackUpdateToListeners(); + UIs.call(PlayerUi::initPlayback); simpleExoPlayer.setVolume(isMuted() ? 0 : 1); @@ -1263,6 +1281,23 @@ public final class Player implements PlaybackListener, Listener { //////////////////////////////////////////////////////////////////////////*/ //region Repeat and shuffle + private void saveShuffleToPrefs(final boolean enabled) { + prefs.edit().putBoolean(PREF_KEY_SHUFFLE_ENABLED, enabled).apply(); + } + + private void saveRepeatToPrefs(@RepeatMode final int repeatMode) { + prefs.edit().putInt(PREF_KEY_REPEAT_MODE, repeatMode).apply(); + } + + private boolean loadShuffleFromPrefs() { + return prefs.getBoolean(PREF_KEY_SHUFFLE_ENABLED, false); + } + + @RepeatMode + private int loadRepeatFromPrefs() { + return prefs.getInt(PREF_KEY_REPEAT_MODE, REPEAT_MODE_OFF); + } + @RepeatMode public int getRepeatMode() { return exoPlayerIsNull() ? REPEAT_MODE_OFF : simpleExoPlayer.getRepeatMode(); @@ -1293,6 +1328,9 @@ public final class Player implements PlaybackListener, Listener { Log.d(TAG, "ExoPlayer - onRepeatModeChanged() called with: " + "repeatMode = [" + repeatMode + "]"); } + + saveRepeatToPrefs(repeatMode); + UIs.call(playerUi -> playerUi.onRepeatModeChanged(repeatMode)); notifyPlaybackUpdateToListeners(); } @@ -1304,6 +1342,8 @@ public final class Player implements PlaybackListener, Listener { + "mode = [" + shuffleModeEnabled + "]"); } + saveShuffleToPrefs(shuffleModeEnabled); + if (playQueue != null) { if (shuffleModeEnabled) { playQueue.shuffle();