diff --git a/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt b/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt index ee7a52d03..c077eb385 100644 --- a/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt @@ -23,7 +23,6 @@ import org.oxycblt.auxio.music.processing.MusicLoaderResponse * @author OxygenCobalt */ class LoadingFragment : Fragment(R.layout.fragment_loading) { - private val loadingModel: LoadingViewModel by activityViewModels { LoadingViewModel.Factory(requireActivity().application) } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/NotificationUtils.kt b/app/src/main/java/org/oxycblt/auxio/playback/NotificationUtils.kt index ebd2e4d18..dbb8bc3a5 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/NotificationUtils.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/NotificationUtils.kt @@ -8,7 +8,6 @@ import android.content.Context import android.content.Intent import android.os.Build import android.support.v4.media.session.MediaSessionCompat -import android.util.Log import androidx.core.app.NotificationCompat import androidx.media.app.NotificationCompat.MediaStyle import org.oxycblt.auxio.MainActivity @@ -172,8 +171,6 @@ private fun newAction(action: String, context: Context): NotificationCompat.Acti } NotificationUtils.ACTION_SHUFFLE -> { - Log.d("A function", "Jesus christ does this even call???") - if (playbackManager.isShuffling) { R.drawable.ic_shuffle } else { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt index 49423ad5a..736e77c35 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt @@ -155,10 +155,14 @@ class PlaybackStateManager private constructor() { resetLoopMode() updatePlayback(song) - if (mIsShuffling) { - genShuffle(true) + if (settingsManager.keepShuffle) { + if (mIsShuffling) { + genShuffle(true) + } else { + resetShuffle() + } } else { - resetShuffle() + setShuffleStatus(false) } mIndex = mQueue.indexOf(song) @@ -210,11 +214,11 @@ class PlaybackStateManager private constructor() { } } - private fun updatePlayback(song: Song) { + private fun updatePlayback(song: Song, dontPlay: Boolean = false) { mSong = song mPosition = 0 - if (!mIsPlaying) { + if (!mIsPlaying && !dontPlay) { setPlayingStatus(true) } @@ -260,9 +264,7 @@ class PlaybackStateManager private constructor() { if (mIndex < mQueue.lastIndex) { mIndex = mIndex.inc() } else { - // TODO: Implement option to make the playlist loop instead of stop - mQueue = mutableListOf() - mSong = null + handlePlaylistEnd() return } @@ -294,6 +296,37 @@ class PlaybackStateManager private constructor() { } } + /** + * Handle what to do at then end of a playlist. + */ + private fun handlePlaylistEnd() { + when (settingsManager.doAtEnd) { + SettingsManager.EntryNames.AT_END_LOOP_PAUSE -> { + mIndex = 0 + forceQueueUpdate() + + updatePlayback(mQueue[0], dontPlay = true) + setPlayingStatus(false) + } + + SettingsManager.EntryNames.AT_END_LOOP -> { + mIndex = 0 + forceQueueUpdate() + + updatePlayback(mQueue[0]) + } + + SettingsManager.EntryNames.AT_END_STOP -> { + mQueue.clear() + forceQueueUpdate() + + mSong = null + } + } + } + + // --- QUEUE EDITING FUNCTIONS --- + fun removeQueueItem(index: Int): Boolean { Log.d(this::class.simpleName, "Removing item ${mQueue[index].name}.") diff --git a/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt b/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt index 615e6371f..1e9146cb4 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt @@ -73,6 +73,13 @@ class SettingsManager private constructor(context: Context) : ) ) + val doAtEnd: String + get() = sharedPrefs.getString(Keys.KEY_AT_END, EntryNames.AT_END_LOOP_PAUSE) + ?: EntryNames.AT_END_LOOP_PAUSE + + val keepShuffle: Boolean + get() = sharedPrefs.getBoolean(Keys.KEY_KEEP_SHUFFLE, false) + val rewindWithPrev: Boolean get() = sharedPrefs.getBoolean(Keys.KEY_PREV_REWIND, true) @@ -80,14 +87,13 @@ class SettingsManager private constructor(context: Context) : get() = (sharedPrefs.getInt(Keys.KEY_REWIND_THRESHOLD, 5) * 1000).toLong() var librarySortMode: SortMode - get() { - return SortMode.fromInt( - sharedPrefs.getInt( - Keys.KEY_LIBRARY_SORT_MODE, - SortMode.CONSTANT_ALPHA_DOWN - ) - ) ?: SortMode.ALPHA_DOWN - } + get() = SortMode.fromInt( + sharedPrefs.getInt( + Keys.KEY_LIBRARY_SORT_MODE, + SortMode.CONSTANT_ALPHA_DOWN + ) + ) ?: SortMode.ALPHA_DOWN + set(value) { sharedPrefs.edit() .putInt(Keys.KEY_LIBRARY_SORT_MODE, value.toInt()) @@ -167,6 +173,8 @@ class SettingsManager private constructor(context: Context) : const val KEY_AUDIO_FOCUS = "KEY_AUDIO_FOCUS" const val KEY_PLUG_MANAGEMENT = "KEY_PLUG_MGT" const val KEY_SONG_PLAYBACK_MODE = "KEY_SONG_PLAY_MODE" + const val KEY_AT_END = "KEY_AT_END" + const val KEY_KEEP_SHUFFLE = "KEY_KEEP_SHUFFLE" const val KEY_PREV_REWIND = "KEY_PREV_REWIND" const val KEY_REWIND_THRESHOLD = "KEY_REWIND_THRESHOLD" @@ -177,6 +185,10 @@ class SettingsManager private constructor(context: Context) : const val THEME_AUTO = "AUTO" const val THEME_LIGHT = "LIGHT" const val THEME_DARK = "DARK" + + const val AT_END_LOOP_PAUSE = "LOOP_PAUSE" + const val AT_END_LOOP = "LOOP" + const val AT_END_STOP = "STOP" } /** diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 70acb6130..c4080103c 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -1,38 +1,50 @@ - + @string/setting_theme_auto @string/setting_theme_day @string/setting_theme_night - + AUTO LIGHT DARK - + @string/label_genres @string/label_artists @string/label_albums - + SHOW_GENRES SHOW_ARTISTS SHOW_ALBUMS - + @string/label_play_all_songs @string/label_play_artist @string/label_play_album - + ALL_SONGS IN_ARTIST IN_ALBUM + + + @string/setting_behavior_end_loop_pause + @string/setting_behavior_end_loop + @string/setting_behavior_end_stop + + + + LOOP_PAUSE + LOOP + STOP + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2edf4601a..727a4581a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -69,7 +69,15 @@ Play/Pause when headset connection changes Behavior - When a song is selected + When a song is selected + + When a playlist ends + Loop + Stop + Loop & Pause + + Remember shuffle + Keep shuffle on when playing a new song Rewind before skipping back Rewind before skipping to the previous song diff --git a/app/src/main/res/xml-v27/prefs_main.xml b/app/src/main/res/xml-v27/prefs_main.xml index bfc9e4990..6af2d8d77 100644 --- a/app/src/main/res/xml-v27/prefs_main.xml +++ b/app/src/main/res/xml-v27/prefs_main.xml @@ -8,8 +8,8 @@ app:key="KEY_THEME" android:title="@string/setting_theme" android:icon="@drawable/ic_day" - android:entries="@array/theme_entries" - android:entryValues="@array/theme_values" + android:entries="@array/entires_theme" + android:entryValues="@array/values_theme" app:defaultValue="AUTO" app:useSimpleSummaryProvider="true" /> @@ -36,8 +36,8 @@ app:key="KEY_LIBRARY_DISPLAY_MODE" android:title="@string/setting_lib_display" android:icon="@drawable/ic_artist" - app:entries="@array/lib_display_entries" - app:entryValues="@array/lib_display_values" + app:entries="@array/entries_lib_display" + app:entryValues="@array/values_lib_display" app:defaultValue="SHOW_ARTISTS" app:useSimpleSummaryProvider="true" /> @@ -86,13 +86,29 @@ + + + + @@ -28,8 +28,8 @@ app:key="KEY_LIBRARY_DISPLAY_MODE" android:title="@string/setting_lib_display" android:icon="@drawable/ic_artist" - app:entries="@array/lib_display_entries" - app:entryValues="@array/lib_display_values" + app:entries="@array/entries_lib_display" + app:entryValues="@array/values_lib_display" app:defaultValue="SHOW_ARTISTS" app:useSimpleSummaryProvider="true" /> @@ -77,10 +77,19 @@ + +