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 @@
+
+