Add queue behavior options

Add options for whether to remember the shuffle toggle & what to do when a playlist ends.
This commit is contained in:
OxygenCobalt 2020-12-13 12:18:43 -07:00
parent 6882722201
commit c7549d6bfa
8 changed files with 127 additions and 41 deletions

View file

@ -23,7 +23,6 @@ import org.oxycblt.auxio.music.processing.MusicLoaderResponse
* @author OxygenCobalt * @author OxygenCobalt
*/ */
class LoadingFragment : Fragment(R.layout.fragment_loading) { class LoadingFragment : Fragment(R.layout.fragment_loading) {
private val loadingModel: LoadingViewModel by activityViewModels { private val loadingModel: LoadingViewModel by activityViewModels {
LoadingViewModel.Factory(requireActivity().application) LoadingViewModel.Factory(requireActivity().application)
} }

View file

@ -8,7 +8,6 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Build import android.os.Build
import android.support.v4.media.session.MediaSessionCompat import android.support.v4.media.session.MediaSessionCompat
import android.util.Log
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.media.app.NotificationCompat.MediaStyle import androidx.media.app.NotificationCompat.MediaStyle
import org.oxycblt.auxio.MainActivity import org.oxycblt.auxio.MainActivity
@ -172,8 +171,6 @@ private fun newAction(action: String, context: Context): NotificationCompat.Acti
} }
NotificationUtils.ACTION_SHUFFLE -> { NotificationUtils.ACTION_SHUFFLE -> {
Log.d("A function", "Jesus christ does this even call???")
if (playbackManager.isShuffling) { if (playbackManager.isShuffling) {
R.drawable.ic_shuffle R.drawable.ic_shuffle
} else { } else {

View file

@ -155,10 +155,14 @@ class PlaybackStateManager private constructor() {
resetLoopMode() resetLoopMode()
updatePlayback(song) updatePlayback(song)
if (mIsShuffling) { if (settingsManager.keepShuffle) {
genShuffle(true) if (mIsShuffling) {
genShuffle(true)
} else {
resetShuffle()
}
} else { } else {
resetShuffle() setShuffleStatus(false)
} }
mIndex = mQueue.indexOf(song) 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 mSong = song
mPosition = 0 mPosition = 0
if (!mIsPlaying) { if (!mIsPlaying && !dontPlay) {
setPlayingStatus(true) setPlayingStatus(true)
} }
@ -260,9 +264,7 @@ class PlaybackStateManager private constructor() {
if (mIndex < mQueue.lastIndex) { if (mIndex < mQueue.lastIndex) {
mIndex = mIndex.inc() mIndex = mIndex.inc()
} else { } else {
// TODO: Implement option to make the playlist loop instead of stop handlePlaylistEnd()
mQueue = mutableListOf()
mSong = null
return 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 { fun removeQueueItem(index: Int): Boolean {
Log.d(this::class.simpleName, "Removing item ${mQueue[index].name}.") Log.d(this::class.simpleName, "Removing item ${mQueue[index].name}.")

View file

@ -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 val rewindWithPrev: Boolean
get() = sharedPrefs.getBoolean(Keys.KEY_PREV_REWIND, true) 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() get() = (sharedPrefs.getInt(Keys.KEY_REWIND_THRESHOLD, 5) * 1000).toLong()
var librarySortMode: SortMode var librarySortMode: SortMode
get() { get() = SortMode.fromInt(
return SortMode.fromInt( sharedPrefs.getInt(
sharedPrefs.getInt( Keys.KEY_LIBRARY_SORT_MODE,
Keys.KEY_LIBRARY_SORT_MODE, SortMode.CONSTANT_ALPHA_DOWN
SortMode.CONSTANT_ALPHA_DOWN )
) ) ?: SortMode.ALPHA_DOWN
) ?: SortMode.ALPHA_DOWN
}
set(value) { set(value) {
sharedPrefs.edit() sharedPrefs.edit()
.putInt(Keys.KEY_LIBRARY_SORT_MODE, value.toInt()) .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_AUDIO_FOCUS = "KEY_AUDIO_FOCUS"
const val KEY_PLUG_MANAGEMENT = "KEY_PLUG_MGT" const val KEY_PLUG_MANAGEMENT = "KEY_PLUG_MGT"
const val KEY_SONG_PLAYBACK_MODE = "KEY_SONG_PLAY_MODE" 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_PREV_REWIND = "KEY_PREV_REWIND"
const val KEY_REWIND_THRESHOLD = "KEY_REWIND_THRESHOLD" 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_AUTO = "AUTO"
const val THEME_LIGHT = "LIGHT" const val THEME_LIGHT = "LIGHT"
const val THEME_DARK = "DARK" 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"
} }
/** /**

View file

@ -1,38 +1,50 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<array name="theme_entries"> <array name="entires_theme">
<item>@string/setting_theme_auto</item> <item>@string/setting_theme_auto</item>
<item>@string/setting_theme_day</item> <item>@string/setting_theme_day</item>
<item>@string/setting_theme_night</item> <item>@string/setting_theme_night</item>
</array> </array>
<array name="theme_values"> <array name="values_theme">
<item>AUTO</item> <item>AUTO</item>
<item>LIGHT</item> <item>LIGHT</item>
<item>DARK</item> <item>DARK</item>
</array> </array>
<array name="lib_display_entries"> <array name="entries_lib_display">
<item>@string/label_genres</item> <item>@string/label_genres</item>
<item>@string/label_artists</item> <item>@string/label_artists</item>
<item>@string/label_albums</item> <item>@string/label_albums</item>
</array> </array>
<array name="lib_display_values"> <array name="values_lib_display">
<item>SHOW_GENRES</item> <item>SHOW_GENRES</item>
<item>SHOW_ARTISTS</item> <item>SHOW_ARTISTS</item>
<item>SHOW_ALBUMS</item> <item>SHOW_ALBUMS</item>
</array> </array>
<array name="song_playback_mode_entries"> <array name="entries_song_playback_mode">
<item>@string/label_play_all_songs</item> <item>@string/label_play_all_songs</item>
<item>@string/label_play_artist</item> <item>@string/label_play_artist</item>
<item>@string/label_play_album</item> <item>@string/label_play_album</item>
</array> </array>
<array name="song_playback_mode_values"> <array name="values_song_playback_mode">
<item>ALL_SONGS</item> <item>ALL_SONGS</item>
<item>IN_ARTIST</item> <item>IN_ARTIST</item>
<item>IN_ALBUM</item> <item>IN_ALBUM</item>
</array> </array>
<array name="entries_at_end">
<item>@string/setting_behavior_end_loop_pause</item>
<item>@string/setting_behavior_end_loop</item>
<item>@string/setting_behavior_end_stop</item>
</array>
<array name="values_at_end">
<item>LOOP_PAUSE</item>
<item>LOOP</item>
<item>STOP</item>
</array>
</resources> </resources>

View file

@ -69,7 +69,15 @@
<string name="setting_playback_plug_mgt_desc">Play/Pause when headset connection changes</string> <string name="setting_playback_plug_mgt_desc">Play/Pause when headset connection changes</string>
<string name="setting_behavior">Behavior</string> <string name="setting_behavior">Behavior</string>
<string name="setting_behavior_song_play">When a song is selected</string> <string name="setting_behavior_song_playback_mode">When a song is selected</string>
<string name="setting_behavior_at_end">When a playlist ends</string>
<string name="setting_behavior_end_loop">Loop</string>
<string name="setting_behavior_end_stop">Stop</string>
<string name="setting_behavior_end_loop_pause">Loop &amp; Pause</string>
<string name="setting_behavior_keep_shuffle">Remember shuffle</string>
<string name="setting_behavior_keep_shuffle_desc">Keep shuffle on when playing a new song</string>
<string name="setting_behavior_rewind_prev">Rewind before skipping back</string> <string name="setting_behavior_rewind_prev">Rewind before skipping back</string>
<string name="setting_behavior_rewind_prev_desc">Rewind before skipping to the previous song</string> <string name="setting_behavior_rewind_prev_desc">Rewind before skipping to the previous song</string>

View file

@ -8,8 +8,8 @@
app:key="KEY_THEME" app:key="KEY_THEME"
android:title="@string/setting_theme" android:title="@string/setting_theme"
android:icon="@drawable/ic_day" android:icon="@drawable/ic_day"
android:entries="@array/theme_entries" android:entries="@array/entires_theme"
android:entryValues="@array/theme_values" android:entryValues="@array/values_theme"
app:defaultValue="AUTO" app:defaultValue="AUTO"
app:useSimpleSummaryProvider="true" /> app:useSimpleSummaryProvider="true" />
@ -36,8 +36,8 @@
app:key="KEY_LIBRARY_DISPLAY_MODE" app:key="KEY_LIBRARY_DISPLAY_MODE"
android:title="@string/setting_lib_display" android:title="@string/setting_lib_display"
android:icon="@drawable/ic_artist" android:icon="@drawable/ic_artist"
app:entries="@array/lib_display_entries" app:entries="@array/entries_lib_display"
app:entryValues="@array/lib_display_values" app:entryValues="@array/values_lib_display"
app:defaultValue="SHOW_ARTISTS" app:defaultValue="SHOW_ARTISTS"
app:useSimpleSummaryProvider="true" /> app:useSimpleSummaryProvider="true" />
@ -86,13 +86,29 @@
<ListPreference <ListPreference
app:key="KEY_SONG_PLAY_MODE" app:key="KEY_SONG_PLAY_MODE"
android:title="@string/setting_behavior_song_play" android:title="@string/setting_behavior_song_playback_mode"
app:defaultValue="ALL_SONGS" app:defaultValue="ALL_SONGS"
app:entries="@array/song_playback_mode_entries" app:entries="@array/entries_song_playback_mode"
app:entryValues="@array/song_playback_mode_values" app:entryValues="@array/values_song_playback_mode"
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:useSimpleSummaryProvider="true" /> app:useSimpleSummaryProvider="true" />
<ListPreference
app:key="KEY_AT_END"
android:title="@string/setting_behavior_at_end"
app:defaultValue="LOOP_PAUSE"
app:entries="@array/entries_at_end"
app:entryValues="@array/values_at_end"
app:iconSpaceReserved="false"
app:useSimpleSummaryProvider="true" />
<SwitchPreferenceCompat
app:key="KEY_KEEP_SHUFFLE"
android:title="@string/setting_behavior_keep_shuffle"
app:summary="@string/setting_behavior_keep_shuffle_desc"
app:defaultValue="false"
app:iconSpaceReserved="false" />
<SwitchPreference <SwitchPreference
app:key="KEY_PREV_REWIND" app:key="KEY_PREV_REWIND"
android:title="@string/setting_behavior_rewind_prev" android:title="@string/setting_behavior_rewind_prev"

View file

@ -8,8 +8,8 @@
app:key="KEY_THEME" app:key="KEY_THEME"
android:title="@string/setting_theme" android:title="@string/setting_theme"
android:icon="@drawable/ic_day" android:icon="@drawable/ic_day"
android:entries="@array/theme_entries" android:entries="@array/entires_theme"
android:entryValues="@array/theme_values" android:entryValues="@array/values_theme"
app:defaultValue="AUTO" app:defaultValue="AUTO"
app:useSimpleSummaryProvider="true" /> app:useSimpleSummaryProvider="true" />
@ -28,8 +28,8 @@
app:key="KEY_LIBRARY_DISPLAY_MODE" app:key="KEY_LIBRARY_DISPLAY_MODE"
android:title="@string/setting_lib_display" android:title="@string/setting_lib_display"
android:icon="@drawable/ic_artist" android:icon="@drawable/ic_artist"
app:entries="@array/lib_display_entries" app:entries="@array/entries_lib_display"
app:entryValues="@array/lib_display_values" app:entryValues="@array/values_lib_display"
app:defaultValue="SHOW_ARTISTS" app:defaultValue="SHOW_ARTISTS"
app:useSimpleSummaryProvider="true" /> app:useSimpleSummaryProvider="true" />
@ -77,10 +77,19 @@
<ListPreference <ListPreference
app:key="KEY_SONG_PLAY_MODE" app:key="KEY_SONG_PLAY_MODE"
android:title="@string/setting_behavior_song_play" android:title="@string/setting_behavior_song_playback_mode"
app:defaultValue="ALL_SONGS" app:defaultValue="ALL_SONGS"
app:entries="@array/song_playback_mode_entries" app:entries="@array/entries_song_playback_mode"
app:entryValues="@array/song_playback_mode_values" app:entryValues="@array/values_song_playback_mode"
app:iconSpaceReserved="false"
app:useSimpleSummaryProvider="true" />
<ListPreference
app:key="KEY_AT_END"
android:title="@string/setting_behavior_at_end"
app:defaultValue="LOOP_PAUSE"
app:entries="@array/entries_at_end"
app:entryValues="@array/values_at_end"
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:useSimpleSummaryProvider="true" /> app:useSimpleSummaryProvider="true" />