Add option to rewind before skipping back
Add an option to rewind before skipping to prevous song, depending on the user-defined threshhold.
This commit is contained in:
parent
aaa1ad1a3d
commit
6882722201
7 changed files with 75 additions and 14 deletions
|
@ -14,6 +14,7 @@ import org.oxycblt.auxio.music.Genre
|
|||
import org.oxycblt.auxio.music.Header
|
||||
import org.oxycblt.auxio.music.MusicStore
|
||||
import org.oxycblt.auxio.music.Song
|
||||
import org.oxycblt.auxio.settings.SettingsManager
|
||||
import kotlin.random.Random
|
||||
|
||||
/**
|
||||
|
@ -100,6 +101,8 @@ class PlaybackStateManager private constructor() {
|
|||
val isRestored: Boolean get() = mIsRestored
|
||||
val hasPlayed: Boolean get() = mHasPlayed
|
||||
|
||||
private val settingsManager = SettingsManager.getInstance()
|
||||
|
||||
// --- CALLBACKS ---
|
||||
|
||||
private val callbacks = mutableListOf<Callback>()
|
||||
|
@ -252,7 +255,7 @@ class PlaybackStateManager private constructor() {
|
|||
|
||||
forceUserQueueUpdate()
|
||||
} else {
|
||||
// If not in the user queue, then increment the current index
|
||||
// Increment the index.
|
||||
// If it cant be incremented anymore, end playback or loop depending on the setting.
|
||||
if (mIndex < mQueue.lastIndex) {
|
||||
mIndex = mIndex.inc()
|
||||
|
@ -271,18 +274,24 @@ class PlaybackStateManager private constructor() {
|
|||
|
||||
/**
|
||||
* Go to the previous song, doing any checks that are needed.
|
||||
* TODO: Implement option to rewind before skipping back
|
||||
*/
|
||||
fun prev() {
|
||||
if (mIndex > 0 && !mIsInUserQueue) {
|
||||
mIndex = mIndex.dec()
|
||||
// If enabled, rewind before skipping back if the position is past the threshold set.
|
||||
if (settingsManager.rewindWithPrev && mPosition >= settingsManager.rewindThreshold) {
|
||||
seekTo(0)
|
||||
} else {
|
||||
// Only decrement the index if there's a song to move back to AND if we are not exiting
|
||||
// the user queue.
|
||||
if (mIndex > 0 && !mIsInUserQueue) {
|
||||
mIndex = mIndex.dec()
|
||||
}
|
||||
|
||||
resetLoopMode()
|
||||
|
||||
updatePlayback(mQueue[mIndex])
|
||||
|
||||
forceQueueUpdate()
|
||||
}
|
||||
|
||||
resetLoopMode()
|
||||
|
||||
updatePlayback(mQueue[mIndex])
|
||||
|
||||
forceQueueUpdate()
|
||||
}
|
||||
|
||||
fun removeQueueItem(index: Int): Boolean {
|
||||
|
|
|
@ -73,6 +73,12 @@ class SettingsManager private constructor(context: Context) :
|
|||
)
|
||||
)
|
||||
|
||||
val rewindWithPrev: Boolean
|
||||
get() = sharedPrefs.getBoolean(Keys.KEY_PREV_REWIND, true)
|
||||
|
||||
val rewindThreshold: Long
|
||||
get() = (sharedPrefs.getInt(Keys.KEY_REWIND_THRESHOLD, 5) * 1000).toLong()
|
||||
|
||||
var librarySortMode: SortMode
|
||||
get() {
|
||||
return SortMode.fromInt(
|
||||
|
@ -145,7 +151,7 @@ class SettingsManager private constructor(context: Context) :
|
|||
*/
|
||||
fun getInstance(): SettingsManager {
|
||||
check(::INSTANCE.isInitialized) {
|
||||
"PrefsManager must be initialized with init() before getting its instance."
|
||||
"SettingsManager must be initialized with init() before getting its instance."
|
||||
}
|
||||
return INSTANCE
|
||||
}
|
||||
|
@ -161,6 +167,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_PREV_REWIND = "KEY_PREV_REWIND"
|
||||
const val KEY_REWIND_THRESHOLD = "KEY_REWIND_THRESHOLD"
|
||||
|
||||
const val KEY_LIBRARY_SORT_MODE = "KEY_LIBRARY_SORT_MODE"
|
||||
}
|
||||
|
|
|
@ -8,7 +8,6 @@ import android.os.Build
|
|||
import android.text.SpannableString
|
||||
import android.text.Spanned
|
||||
import android.text.style.ForegroundColorSpan
|
||||
import android.util.Log
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.view.Window
|
||||
|
@ -150,8 +149,6 @@ fun PopupMenu.setupSongActions(song: Song, context: Context, playbackModel: Play
|
|||
else -> -1
|
||||
}
|
||||
|
||||
Log.d(this::class.simpleName, (idToRemove == R.id.action_play_album).toString())
|
||||
|
||||
menu.findItem(idToRemove)?.isVisible = false
|
||||
}
|
||||
|
||||
|
|
6
app/src/main/res/values/integers.xml
Normal file
6
app/src/main/res/values/integers.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<integer name="rewind_threshold_min">1</integer>
|
||||
<integer name="rewind_threshold_max">30</integer>
|
||||
<integer name="rewind_threshold_default">5</integer>
|
||||
</resources>
|
|
@ -71,6 +71,11 @@
|
|||
<string name="setting_behavior">Behavior</string>
|
||||
<string name="setting_behavior_song_play">When a song is selected</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_threshold">Rewind threshold</string>
|
||||
<string name="setting_behavior_rewind_threshold_desc">Progress at which a rewind should occur (seconds)</string>
|
||||
|
||||
<!-- Debug Namespace | Debug labels -->
|
||||
<string name="debug_state_saved">State saved</string>
|
||||
|
||||
|
|
|
@ -93,5 +93,23 @@
|
|||
app:iconSpaceReserved="false"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
|
||||
<SwitchPreference
|
||||
app:key="KEY_PREV_REWIND"
|
||||
android:title="@string/setting_behavior_rewind_prev"
|
||||
app:summary="@string/setting_behavior_rewind_prev_desc"
|
||||
app:iconSpaceReserved="false"
|
||||
app:defaultValue="true" />
|
||||
|
||||
<SeekBarPreference
|
||||
app:key="KEY_REWIND_THRESHOLD"
|
||||
android:title="@string/setting_behavior_rewind_threshold"
|
||||
android:defaultValue="@integer/rewind_threshold_default"
|
||||
android:max="@integer/rewind_threshold_max"
|
||||
app:min="@integer/rewind_threshold_min"
|
||||
app:summary="@string/setting_behavior_rewind_threshold_desc"
|
||||
app:showSeekBarValue="true"
|
||||
app:iconSpaceReserved="false"
|
||||
app:dependency="KEY_PREV_REWIND" />
|
||||
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
|
@ -84,5 +84,23 @@
|
|||
app:iconSpaceReserved="false"
|
||||
app:useSimpleSummaryProvider="true" />
|
||||
|
||||
<SwitchPreference
|
||||
app:key="KEY_PREV_REWIND"
|
||||
android:title="@string/setting_behavior_rewind_prev"
|
||||
app:summary="@string/setting_behavior_rewind_prev_desc"
|
||||
app:iconSpaceReserved="false"
|
||||
app:defaultValue="true" />
|
||||
|
||||
<SeekBarPreference
|
||||
app:key="KEY_REWIND_THRESHOLD"
|
||||
android:title="@string/setting_behavior_rewind_threshold"
|
||||
android:defaultValue="@integer/rewind_threshold_default"
|
||||
app:summary="@string/setting_behavior_rewind_threshold_desc"
|
||||
app:showSeekBarValue="true"
|
||||
android:max="@integer/rewind_threshold_max"
|
||||
app:min="@integer/rewind_threshold_min"
|
||||
app:iconSpaceReserved="false"
|
||||
app:dependency="KEY_PREV_REWIND" />
|
||||
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
Loading…
Reference in a new issue