playback: rename loopmode to repeatmode
Rename LoopMode to RepeatMode, which is generally much clearer than the previous name. This changes all non-breaking instances of "loop" in the app with "repeat".
This commit is contained in:
parent
c80af01d5c
commit
8e849feb7d
36 changed files with 174 additions and 166 deletions
|
@ -55,12 +55,12 @@ object IntegerTable {
|
|||
/** Intent request code */
|
||||
const val REQUEST_CODE = 0xA0C0
|
||||
|
||||
/** LoopMode.NONE */
|
||||
const val LOOP_MODE_NONE = 0xA100
|
||||
/** LoopMode.ALL */
|
||||
const val LOOP_MODE_ALL = 0xA101
|
||||
/** LoopMode.TRACK */
|
||||
const val LOOP_MODE_TRACK = 0xA102
|
||||
/** RepeatMode.NONE */
|
||||
const val REPEAT_MODE_NONE = 0xA100
|
||||
/** RepeatMode.ALL */
|
||||
const val REPEAT_MODE_ALL = 0xA101
|
||||
/** RepeatMode.TRACK */
|
||||
const val REPEAT_MODE_TRACK = 0xA102
|
||||
|
||||
/** PlaybackMode.IN_GENRE */
|
||||
const val PLAYBACK_MODE_IN_GENRE = 0xA103
|
||||
|
|
|
@ -37,8 +37,8 @@ import org.oxycblt.auxio.util.getDrawableSafe
|
|||
* doesn't require a whole new icon set.
|
||||
*
|
||||
* This view also enables use of an "indicator", which is a dot that can denote when a button is
|
||||
* active. This is useful for the shuffle/loop buttons, as at times highlighting them is not enough
|
||||
* to differentiate them.
|
||||
* active. This is useful for the shuffle/repeat buttons, as at times highlighting them is not
|
||||
* enough to differentiate them.
|
||||
*/
|
||||
class PlaybackButton
|
||||
@JvmOverloads
|
||||
|
|
|
@ -32,7 +32,7 @@ import org.oxycblt.auxio.databinding.FragmentPlaybackPanelBinding
|
|||
import org.oxycblt.auxio.music.MusicParent
|
||||
import org.oxycblt.auxio.music.Song
|
||||
import org.oxycblt.auxio.music.toDuration
|
||||
import org.oxycblt.auxio.playback.state.LoopMode
|
||||
import org.oxycblt.auxio.playback.state.RepeatMode
|
||||
import org.oxycblt.auxio.ui.MainNavigationAction
|
||||
import org.oxycblt.auxio.ui.NavigationViewModel
|
||||
import org.oxycblt.auxio.ui.ViewBindingFragment
|
||||
|
@ -112,7 +112,7 @@ class PlaybackPanelFragment :
|
|||
.stateList
|
||||
}
|
||||
|
||||
binding.playbackLoop.setOnClickListener { playbackModel.incrementLoop() }
|
||||
binding.playbackRepeat.setOnClickListener { playbackModel.incrementRepeatMode() }
|
||||
binding.playbackSkipPrev.setOnClickListener { playbackModel.skipPrev() }
|
||||
|
||||
binding.playbackPlayPause.apply {
|
||||
|
@ -129,7 +129,7 @@ class PlaybackPanelFragment :
|
|||
playbackModel.song.observe(viewLifecycleOwner, ::updateSong)
|
||||
playbackModel.parent.observe(viewLifecycleOwner, ::updateParent)
|
||||
playbackModel.positionSecs.observe(viewLifecycleOwner, ::updatePosition)
|
||||
playbackModel.loopMode.observe(viewLifecycleOwner, ::updateLoop)
|
||||
playbackModel.repeatMode.observe(viewLifecycleOwner, ::updateRepeat)
|
||||
playbackModel.isPlaying.observe(viewLifecycleOwner, ::updatePlaying)
|
||||
playbackModel.isShuffled.observe(viewLifecycleOwner, ::updateShuffled)
|
||||
|
||||
|
@ -197,10 +197,10 @@ class PlaybackPanelFragment :
|
|||
}
|
||||
}
|
||||
|
||||
private fun updateLoop(loopMode: LoopMode) {
|
||||
requireBinding().playbackLoop.apply {
|
||||
isActivated = loopMode != LoopMode.NONE
|
||||
setImageResource(loopMode.icon)
|
||||
private fun updateRepeat(repeatMode: RepeatMode) {
|
||||
requireBinding().playbackRepeat.apply {
|
||||
isActivated = repeatMode != RepeatMode.NONE
|
||||
setImageResource(repeatMode.icon)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -30,9 +30,9 @@ import org.oxycblt.auxio.music.Genre
|
|||
import org.oxycblt.auxio.music.MusicParent
|
||||
import org.oxycblt.auxio.music.MusicStore
|
||||
import org.oxycblt.auxio.music.Song
|
||||
import org.oxycblt.auxio.playback.state.LoopMode
|
||||
import org.oxycblt.auxio.playback.state.PlaybackMode
|
||||
import org.oxycblt.auxio.playback.state.PlaybackStateManager
|
||||
import org.oxycblt.auxio.playback.state.RepeatMode
|
||||
import org.oxycblt.auxio.settings.SettingsManager
|
||||
import org.oxycblt.auxio.util.logD
|
||||
import org.oxycblt.auxio.util.logE
|
||||
|
@ -62,7 +62,7 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
|
|||
// States
|
||||
private val mIsPlaying = MutableLiveData(false)
|
||||
private val mPositionSecs = MutableLiveData(0L)
|
||||
private val mLoopMode = MutableLiveData(LoopMode.NONE)
|
||||
private val mRepeatMode = MutableLiveData(RepeatMode.NONE)
|
||||
private val mIsShuffled = MutableLiveData(false)
|
||||
|
||||
// Queue
|
||||
|
@ -83,9 +83,9 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
|
|||
/** The current playback position, in seconds */
|
||||
val positionSecs: LiveData<Long>
|
||||
get() = mPositionSecs
|
||||
/** The current repeat mode, see [LoopMode] for more information */
|
||||
val loopMode: LiveData<LoopMode>
|
||||
get() = mLoopMode
|
||||
/** The current repeat mode, see [RepeatMode] for more information */
|
||||
val repeatMode: LiveData<RepeatMode>
|
||||
get() = mRepeatMode
|
||||
val isShuffled: LiveData<Boolean>
|
||||
get() = mIsShuffled
|
||||
|
||||
|
@ -263,9 +263,9 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
|
|||
playbackManager.reshuffle(!playbackManager.isShuffled)
|
||||
}
|
||||
|
||||
/** Increment the loop status, e.g from off to loop once */
|
||||
fun incrementLoop() {
|
||||
playbackManager.loopMode = playbackManager.loopMode.increment()
|
||||
/** Increment the repeat mode, e.g from [RepeatMode.NONE] to [RepeatMode.ALL] */
|
||||
fun incrementRepeatMode() {
|
||||
playbackManager.repeatMode = playbackManager.repeatMode.increment()
|
||||
}
|
||||
|
||||
// --- SAVE/RESTORE FUNCTIONS ---
|
||||
|
@ -312,7 +312,7 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
|
|||
onPositionChanged(playbackManager.positionMs)
|
||||
onPlayingChanged(playbackManager.isPlaying)
|
||||
onShuffledChanged(playbackManager.isShuffled)
|
||||
onLoopModeChanged(playbackManager.loopMode)
|
||||
onRepeatChanged(playbackManager.repeatMode)
|
||||
}
|
||||
|
||||
// --- OVERRIDES ---
|
||||
|
@ -349,7 +349,7 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
|
|||
mIsShuffled.value = isShuffled
|
||||
}
|
||||
|
||||
override fun onLoopModeChanged(loopMode: LoopMode) {
|
||||
mLoopMode.value = loopMode
|
||||
override fun onRepeatChanged(repeatMode: RepeatMode) {
|
||||
mRepeatMode.value = repeatMode
|
||||
}
|
||||
}
|
||||
|
|
|
@ -83,7 +83,7 @@ class PlaybackStateDatabase(context: Context) :
|
|||
.append("${StateColumns.COLUMN_QUEUE_INDEX} INTEGER NOT NULL,")
|
||||
.append("${StateColumns.COLUMN_PLAYBACK_MODE} INTEGER NOT NULL,")
|
||||
.append("${StateColumns.COLUMN_IS_SHUFFLED} BOOLEAN NOT NULL,")
|
||||
.append("${StateColumns.COLUMN_LOOP_MODE} INTEGER NOT NULL)")
|
||||
.append("${StateColumns.COLUMN_REPEAT_MODE} INTEGER NOT NULL)")
|
||||
|
||||
return command
|
||||
}
|
||||
|
@ -119,7 +119,7 @@ class PlaybackStateDatabase(context: Context) :
|
|||
val indexIndex = cursor.getColumnIndexOrThrow(StateColumns.COLUMN_QUEUE_INDEX)
|
||||
val modeIndex = cursor.getColumnIndexOrThrow(StateColumns.COLUMN_PLAYBACK_MODE)
|
||||
val shuffleIndex = cursor.getColumnIndexOrThrow(StateColumns.COLUMN_IS_SHUFFLED)
|
||||
val loopModeIndex = cursor.getColumnIndexOrThrow(StateColumns.COLUMN_LOOP_MODE)
|
||||
val repeatModeIndex = cursor.getColumnIndexOrThrow(StateColumns.COLUMN_REPEAT_MODE)
|
||||
|
||||
cursor.moveToFirst()
|
||||
|
||||
|
@ -146,7 +146,8 @@ class PlaybackStateDatabase(context: Context) :
|
|||
queueIndex = cursor.getInt(indexIndex),
|
||||
playbackMode = mode,
|
||||
isShuffled = cursor.getInt(shuffleIndex) == 1,
|
||||
loopMode = LoopMode.fromIntCode(cursor.getInt(loopModeIndex)) ?: LoopMode.NONE,
|
||||
repeatMode = RepeatMode.fromIntCode(cursor.getInt(repeatModeIndex))
|
||||
?: RepeatMode.NONE,
|
||||
)
|
||||
|
||||
logD("Successfully read playback state: $state")
|
||||
|
@ -173,7 +174,7 @@ class PlaybackStateDatabase(context: Context) :
|
|||
put(StateColumns.COLUMN_QUEUE_INDEX, state.queueIndex)
|
||||
put(StateColumns.COLUMN_PLAYBACK_MODE, state.playbackMode.intCode)
|
||||
put(StateColumns.COLUMN_IS_SHUFFLED, state.isShuffled)
|
||||
put(StateColumns.COLUMN_LOOP_MODE, state.loopMode.intCode)
|
||||
put(StateColumns.COLUMN_REPEAT_MODE, state.repeatMode.intCode)
|
||||
}
|
||||
|
||||
insert(TABLE_NAME_STATE, null, stateData)
|
||||
|
@ -262,7 +263,7 @@ class PlaybackStateDatabase(context: Context) :
|
|||
val queueIndex: Int,
|
||||
val playbackMode: PlaybackMode,
|
||||
val isShuffled: Boolean,
|
||||
val loopMode: LoopMode,
|
||||
val repeatMode: RepeatMode,
|
||||
)
|
||||
|
||||
private object StateColumns {
|
||||
|
@ -273,7 +274,7 @@ class PlaybackStateDatabase(context: Context) :
|
|||
const val COLUMN_QUEUE_INDEX = "queue_index"
|
||||
const val COLUMN_PLAYBACK_MODE = "playback_mode"
|
||||
const val COLUMN_IS_SHUFFLED = "is_shuffling"
|
||||
const val COLUMN_LOOP_MODE = "loop_mode"
|
||||
const val COLUMN_REPEAT_MODE = "loop_mode"
|
||||
}
|
||||
|
||||
private object QueueColumns {
|
||||
|
|
|
@ -71,11 +71,11 @@ class PlaybackStateManager private constructor() {
|
|||
/** The current playback progress */
|
||||
var positionMs = 0L
|
||||
private set
|
||||
/** The current [LoopMode] */
|
||||
var loopMode = LoopMode.NONE
|
||||
/** The current [RepeatMode] */
|
||||
var repeatMode = RepeatMode.NONE
|
||||
set(value) {
|
||||
field = value
|
||||
notifyLoopModeChanged()
|
||||
notifyRepeatModeChanged()
|
||||
}
|
||||
/** Whether the queue is shuffled */
|
||||
var isShuffled = false
|
||||
|
@ -153,11 +153,11 @@ class PlaybackStateManager private constructor() {
|
|||
/** Go to the next song, along with doing all the checks that entails. */
|
||||
fun next() {
|
||||
// Increment the index, if it cannot be incremented any further, then
|
||||
// loop and pause/resume playback depending on the setting
|
||||
// repeat and pause/resume playback depending on the setting
|
||||
if (index < mutableQueue.lastIndex) {
|
||||
goto(++index, true)
|
||||
} else {
|
||||
goto(0, loopMode == LoopMode.ALL)
|
||||
goto(0, repeatMode == RepeatMode.ALL)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -302,8 +302,13 @@ class PlaybackStateManager private constructor() {
|
|||
/** Rewind to the beginning of a song. */
|
||||
fun rewind() = seekTo(0)
|
||||
|
||||
/** Loop playback around to the beginning. */
|
||||
fun loop() = seekTo(0)
|
||||
/** Repeat the current song (in line with the user configuration). */
|
||||
fun repeat() {
|
||||
seekTo(0)
|
||||
if (settingsManager.pauseOnRepeat) {
|
||||
isPlaying = false
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Rework these methods eventually
|
||||
|
||||
|
@ -342,7 +347,7 @@ class PlaybackStateManager private constructor() {
|
|||
index,
|
||||
playbackMode,
|
||||
isShuffled,
|
||||
loopMode,
|
||||
repeatMode,
|
||||
))
|
||||
|
||||
database.writeQueue(mutableQueue)
|
||||
|
@ -377,12 +382,12 @@ class PlaybackStateManager private constructor() {
|
|||
parent = playbackState.parent
|
||||
mutableQueue = queue
|
||||
index = playbackState.queueIndex
|
||||
loopMode = playbackState.loopMode
|
||||
repeatMode = playbackState.repeatMode
|
||||
isShuffled = playbackState.isShuffled
|
||||
|
||||
notifyNewPlayback()
|
||||
seekTo(playbackState.positionMs)
|
||||
notifyLoopModeChanged()
|
||||
notifyRepeatModeChanged()
|
||||
notifyShuffledChanged()
|
||||
}
|
||||
|
||||
|
@ -423,9 +428,9 @@ class PlaybackStateManager private constructor() {
|
|||
}
|
||||
}
|
||||
|
||||
private fun notifyLoopModeChanged() {
|
||||
private fun notifyRepeatModeChanged() {
|
||||
for (callback in callbacks) {
|
||||
callback.onLoopModeChanged(loopMode)
|
||||
callback.onRepeatChanged(repeatMode)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -452,7 +457,7 @@ class PlaybackStateManager private constructor() {
|
|||
|
||||
fun onPlayingChanged(isPlaying: Boolean) {}
|
||||
fun onPositionChanged(positionMs: Long) {}
|
||||
fun onLoopModeChanged(loopMode: LoopMode) {}
|
||||
fun onRepeatChanged(repeatMode: RepeatMode) {}
|
||||
fun onShuffledChanged(isShuffled: Boolean) {}
|
||||
|
||||
fun onSeek(positionMs: Long) {}
|
||||
|
|
|
@ -24,13 +24,13 @@ import org.oxycblt.auxio.R
|
|||
* Enum that determines the playback repeat mode.
|
||||
* @author OxygenCobalt
|
||||
*/
|
||||
enum class LoopMode {
|
||||
enum class RepeatMode {
|
||||
NONE,
|
||||
ALL,
|
||||
TRACK;
|
||||
|
||||
/** Increment the LoopMode, e.g from [NONE] to [ALL] */
|
||||
fun increment(): LoopMode {
|
||||
fun increment(): RepeatMode {
|
||||
return when (this) {
|
||||
NONE -> ALL
|
||||
ALL -> TRACK
|
||||
|
@ -41,9 +41,9 @@ enum class LoopMode {
|
|||
val icon: Int
|
||||
get() =
|
||||
when (this) {
|
||||
NONE -> R.drawable.ic_loop
|
||||
ALL -> R.drawable.ic_loop_on
|
||||
TRACK -> R.drawable.ic_loop_one
|
||||
NONE -> R.drawable.ic_repeat
|
||||
ALL -> R.drawable.ic_repeat_on
|
||||
TRACK -> R.drawable.ic_repeat_one
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -53,18 +53,18 @@ enum class LoopMode {
|
|||
val intCode: Int
|
||||
get() =
|
||||
when (this) {
|
||||
NONE -> IntegerTable.LOOP_MODE_NONE
|
||||
ALL -> IntegerTable.LOOP_MODE_ALL
|
||||
TRACK -> IntegerTable.LOOP_MODE_TRACK
|
||||
NONE -> IntegerTable.REPEAT_MODE_NONE
|
||||
ALL -> IntegerTable.REPEAT_MODE_ALL
|
||||
TRACK -> IntegerTable.REPEAT_MODE_TRACK
|
||||
}
|
||||
|
||||
companion object {
|
||||
/** Convert an int [constant] into a LoopMode, or null if it isn't valid. */
|
||||
fun fromIntCode(constant: Int): LoopMode? {
|
||||
fun fromIntCode(constant: Int): RepeatMode? {
|
||||
return when (constant) {
|
||||
IntegerTable.LOOP_MODE_NONE -> NONE
|
||||
IntegerTable.LOOP_MODE_ALL -> ALL
|
||||
IntegerTable.LOOP_MODE_TRACK -> TRACK
|
||||
IntegerTable.REPEAT_MODE_NONE -> NONE
|
||||
IntegerTable.REPEAT_MODE_ALL -> ALL
|
||||
IntegerTable.REPEAT_MODE_TRACK -> TRACK
|
||||
else -> null
|
||||
}
|
||||
}
|
|
@ -31,7 +31,7 @@ import org.oxycblt.auxio.R
|
|||
import org.oxycblt.auxio.coil.loadBitmap
|
||||
import org.oxycblt.auxio.music.MusicParent
|
||||
import org.oxycblt.auxio.music.Song
|
||||
import org.oxycblt.auxio.playback.state.LoopMode
|
||||
import org.oxycblt.auxio.playback.state.RepeatMode
|
||||
import org.oxycblt.auxio.util.newBroadcastIntent
|
||||
import org.oxycblt.auxio.util.newMainIntent
|
||||
|
||||
|
@ -52,7 +52,7 @@ private constructor(private val context: Context, mediaToken: MediaSessionCompat
|
|||
setContentIntent(context.newMainIntent())
|
||||
setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
|
||||
addAction(buildLoopAction(context, LoopMode.NONE))
|
||||
addAction(buildRepeatAction(context, RepeatMode.NONE))
|
||||
addAction(buildAction(context, PlaybackService.ACTION_SKIP_PREV, R.drawable.ic_skip_prev))
|
||||
addAction(buildPlayPauseAction(context, true))
|
||||
addAction(buildAction(context, PlaybackService.ACTION_SKIP_NEXT, R.drawable.ic_skip_next))
|
||||
|
@ -94,9 +94,9 @@ private constructor(private val context: Context, mediaToken: MediaSessionCompat
|
|||
mActions[2] = buildPlayPauseAction(context, isPlaying)
|
||||
}
|
||||
|
||||
/** Update the first action to reflect the [loopMode] given. */
|
||||
fun setLoopMode(loopMode: LoopMode) {
|
||||
mActions[0] = buildLoopAction(context, loopMode)
|
||||
/** Update the first action to reflect the [repeatMode] given. */
|
||||
fun setRepeatMode(repeatMode: RepeatMode) {
|
||||
mActions[0] = buildRepeatAction(context, repeatMode)
|
||||
}
|
||||
|
||||
/** Update the first action to reflect whether the queue is shuffled or not */
|
||||
|
@ -123,15 +123,18 @@ private constructor(private val context: Context, mediaToken: MediaSessionCompat
|
|||
return buildAction(context, PlaybackService.ACTION_PLAY_PAUSE, drawableRes)
|
||||
}
|
||||
|
||||
private fun buildLoopAction(context: Context, loopMode: LoopMode): NotificationCompat.Action {
|
||||
private fun buildRepeatAction(
|
||||
context: Context,
|
||||
repeatMode: RepeatMode
|
||||
): NotificationCompat.Action {
|
||||
val drawableRes =
|
||||
when (loopMode) {
|
||||
LoopMode.NONE -> R.drawable.ic_remote_loop_off
|
||||
LoopMode.ALL -> R.drawable.ic_loop
|
||||
LoopMode.TRACK -> R.drawable.ic_loop_one
|
||||
when (repeatMode) {
|
||||
RepeatMode.NONE -> R.drawable.ic_remote_repeat_off
|
||||
RepeatMode.ALL -> R.drawable.ic_repeat
|
||||
RepeatMode.TRACK -> R.drawable.ic_repeat_one
|
||||
}
|
||||
|
||||
return buildAction(context, PlaybackService.ACTION_LOOP, drawableRes)
|
||||
return buildAction(context, PlaybackService.ACTION_INC_REPEAT_MODE, drawableRes)
|
||||
}
|
||||
|
||||
private fun buildShuffleAction(
|
||||
|
@ -141,7 +144,7 @@ private constructor(private val context: Context, mediaToken: MediaSessionCompat
|
|||
val drawableRes =
|
||||
if (isShuffled) R.drawable.ic_shuffle else R.drawable.ic_remote_shuffle_off
|
||||
|
||||
return buildAction(context, PlaybackService.ACTION_SHUFFLE, drawableRes)
|
||||
return buildAction(context, PlaybackService.ACTION_INVERT_SHUFFLE, drawableRes)
|
||||
}
|
||||
|
||||
private fun buildAction(
|
||||
|
|
|
@ -52,7 +52,7 @@ import org.oxycblt.auxio.BuildConfig
|
|||
import org.oxycblt.auxio.IntegerTable
|
||||
import org.oxycblt.auxio.music.MusicParent
|
||||
import org.oxycblt.auxio.music.Song
|
||||
import org.oxycblt.auxio.playback.state.LoopMode
|
||||
import org.oxycblt.auxio.playback.state.RepeatMode
|
||||
import org.oxycblt.auxio.playback.state.PlaybackStateManager
|
||||
import org.oxycblt.auxio.settings.SettingsManager
|
||||
import org.oxycblt.auxio.util.getSystemServiceSafe
|
||||
|
@ -146,8 +146,8 @@ class PlaybackService :
|
|||
addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY)
|
||||
addAction(AudioManager.ACTION_HEADSET_PLUG)
|
||||
|
||||
addAction(ACTION_LOOP)
|
||||
addAction(ACTION_SHUFFLE)
|
||||
addAction(ACTION_INC_REPEAT_MODE)
|
||||
addAction(ACTION_INVERT_SHUFFLE)
|
||||
addAction(ACTION_SKIP_PREV)
|
||||
addAction(ACTION_PLAY_PAUSE)
|
||||
addAction(ACTION_SKIP_NEXT)
|
||||
|
@ -215,8 +215,8 @@ class PlaybackService :
|
|||
override fun onPlaybackStateChanged(state: Int) {
|
||||
when (state) {
|
||||
Player.STATE_ENDED -> {
|
||||
if (playbackManager.loopMode == LoopMode.TRACK) {
|
||||
playbackManager.loop()
|
||||
if (playbackManager.repeatMode == RepeatMode.TRACK) {
|
||||
playbackManager.repeat()
|
||||
} else {
|
||||
playbackManager.next()
|
||||
}
|
||||
|
@ -286,9 +286,9 @@ class PlaybackService :
|
|||
startForegroundOrNotify()
|
||||
}
|
||||
|
||||
override fun onLoopModeChanged(loopMode: LoopMode) {
|
||||
override fun onRepeatChanged(repeatMode: RepeatMode) {
|
||||
if (!settingsManager.useAltNotifAction) {
|
||||
notification.setLoopMode(loopMode)
|
||||
notification.setRepeatMode(repeatMode)
|
||||
startForegroundOrNotify()
|
||||
}
|
||||
}
|
||||
|
@ -317,7 +317,7 @@ class PlaybackService :
|
|||
if (useAltAction) {
|
||||
notification.setShuffled(playbackManager.isShuffled)
|
||||
} else {
|
||||
notification.setLoopMode(playbackManager.loopMode)
|
||||
notification.setRepeatMode(playbackManager.repeatMode)
|
||||
}
|
||||
|
||||
startForegroundOrNotify()
|
||||
|
@ -380,7 +380,7 @@ class PlaybackService :
|
|||
onSongChanged(playbackManager.song)
|
||||
onSeek(playbackManager.positionMs)
|
||||
onShuffledChanged(playbackManager.isShuffled)
|
||||
onLoopModeChanged(playbackManager.loopMode)
|
||||
onRepeatChanged(playbackManager.repeatMode)
|
||||
|
||||
// Notify other classes that rely on this service to also update.
|
||||
widgets.update()
|
||||
|
@ -450,8 +450,8 @@ class PlaybackService :
|
|||
|
||||
// --- AUXIO EVENTS ---
|
||||
ACTION_PLAY_PAUSE -> playbackManager.isPlaying = !playbackManager.isPlaying
|
||||
ACTION_LOOP -> playbackManager.loopMode = playbackManager.loopMode.increment()
|
||||
ACTION_SHUFFLE -> playbackManager.reshuffle(!playbackManager.isShuffled)
|
||||
ACTION_INC_REPEAT_MODE -> playbackManager.repeatMode = playbackManager.repeatMode.increment()
|
||||
ACTION_INVERT_SHUFFLE -> playbackManager.reshuffle(!playbackManager.isShuffled)
|
||||
ACTION_SKIP_PREV -> playbackManager.prev()
|
||||
ACTION_SKIP_NEXT -> playbackManager.next()
|
||||
ACTION_EXIT -> {
|
||||
|
@ -492,8 +492,8 @@ class PlaybackService :
|
|||
companion object {
|
||||
private const val POS_POLL_INTERVAL = 1000L
|
||||
|
||||
const val ACTION_LOOP = BuildConfig.APPLICATION_ID + ".action.LOOP"
|
||||
const val ACTION_SHUFFLE = BuildConfig.APPLICATION_ID + ".action.SHUFFLE"
|
||||
const val ACTION_INC_REPEAT_MODE = BuildConfig.APPLICATION_ID + ".action.LOOP"
|
||||
const val ACTION_INVERT_SHUFFLE = BuildConfig.APPLICATION_ID + ".action.SHUFFLE"
|
||||
const val ACTION_SKIP_PREV = BuildConfig.APPLICATION_ID + ".action.PREV"
|
||||
const val ACTION_PLAY_PAUSE = BuildConfig.APPLICATION_ID + ".action.PLAY_PAUSE"
|
||||
const val ACTION_SKIP_NEXT = BuildConfig.APPLICATION_ID + ".action.NEXT"
|
||||
|
|
|
@ -27,8 +27,8 @@ import com.google.android.exoplayer2.Player
|
|||
import org.oxycblt.auxio.coil.loadBitmap
|
||||
import org.oxycblt.auxio.music.MusicParent
|
||||
import org.oxycblt.auxio.music.Song
|
||||
import org.oxycblt.auxio.playback.state.LoopMode
|
||||
import org.oxycblt.auxio.playback.state.PlaybackStateManager
|
||||
import org.oxycblt.auxio.playback.state.RepeatMode
|
||||
import org.oxycblt.auxio.util.logD
|
||||
|
||||
/**
|
||||
|
@ -85,12 +85,12 @@ class PlaybackSessionConnector(
|
|||
}
|
||||
|
||||
override fun onSetRepeatMode(repeatMode: Int) {
|
||||
playbackManager.loopMode =
|
||||
playbackManager.repeatMode =
|
||||
when (repeatMode) {
|
||||
PlaybackStateCompat.REPEAT_MODE_ALL -> LoopMode.ALL
|
||||
PlaybackStateCompat.REPEAT_MODE_GROUP -> LoopMode.ALL
|
||||
PlaybackStateCompat.REPEAT_MODE_ONE -> LoopMode.TRACK
|
||||
else -> LoopMode.NONE
|
||||
PlaybackStateCompat.REPEAT_MODE_ALL -> RepeatMode.ALL
|
||||
PlaybackStateCompat.REPEAT_MODE_GROUP -> RepeatMode.ALL
|
||||
PlaybackStateCompat.REPEAT_MODE_ONE -> RepeatMode.TRACK
|
||||
else -> RepeatMode.NONE
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -119,10 +119,11 @@ class SettingsManager private constructor(context: Context) :
|
|||
get() = prefs.getBoolean(KEY_PREV_REWIND, true)
|
||||
|
||||
/**
|
||||
* Whether [org.oxycblt.auxio.playback.state.LoopMode.TRACK] should pause when the track repeats
|
||||
* Whether [org.oxycblt.auxio.playback.state.RepeatMode.TRACK] should pause when the track
|
||||
* repeats
|
||||
*/
|
||||
val pauseOnLoop: Boolean
|
||||
get() = prefs.getBoolean(KEY_LOOP_PAUSE, false)
|
||||
val pauseOnRepeat: Boolean
|
||||
get() = prefs.getBoolean(KEY_PAUSE_ON_REPEAT, false)
|
||||
|
||||
/** The current filter mode of the search tab */
|
||||
var searchFilterMode: DisplayMode?
|
||||
|
@ -272,7 +273,7 @@ class SettingsManager private constructor(context: Context) :
|
|||
const val KEY_SONG_PLAYBACK_MODE = "KEY_SONG_PLAY_MODE2"
|
||||
const val KEY_KEEP_SHUFFLE = "KEY_KEEP_SHUFFLE"
|
||||
const val KEY_PREV_REWIND = "KEY_PREV_REWIND"
|
||||
const val KEY_LOOP_PAUSE = "KEY_LOOP_PAUSE"
|
||||
const val KEY_PAUSE_ON_REPEAT = "KEY_LOOP_PAUSE"
|
||||
|
||||
const val KEY_SAVE_STATE = "auxio_save_state"
|
||||
const val KEY_RELOAD = "auxio_reload"
|
||||
|
|
|
@ -21,7 +21,7 @@ import android.content.Context
|
|||
import android.widget.RemoteViews
|
||||
import androidx.annotation.LayoutRes
|
||||
import org.oxycblt.auxio.R
|
||||
import org.oxycblt.auxio.playback.state.LoopMode
|
||||
import org.oxycblt.auxio.playback.state.RepeatMode
|
||||
import org.oxycblt.auxio.playback.system.PlaybackService
|
||||
import org.oxycblt.auxio.util.newBroadcastIntent
|
||||
import org.oxycblt.auxio.util.newMainIntent
|
||||
|
@ -81,9 +81,7 @@ fun createLargeWidget(context: Context, state: WidgetState): RemoteViews {
|
|||
|
||||
private fun createViews(context: Context, @LayoutRes layout: Int): RemoteViews {
|
||||
val views = RemoteViews(context.packageName, layout)
|
||||
|
||||
views.setOnClickPendingIntent(android.R.id.background, context.newMainIntent())
|
||||
|
||||
return views
|
||||
}
|
||||
|
||||
|
@ -141,10 +139,10 @@ private fun RemoteViews.applyFullControls(context: Context, state: WidgetState):
|
|||
applyBasicControls(context, state)
|
||||
|
||||
setOnClickPendingIntent(
|
||||
R.id.widget_loop, context.newBroadcastIntent(PlaybackService.ACTION_LOOP))
|
||||
R.id.widget_repeat, context.newBroadcastIntent(PlaybackService.ACTION_INC_REPEAT_MODE))
|
||||
|
||||
setOnClickPendingIntent(
|
||||
R.id.widget_shuffle, context.newBroadcastIntent(PlaybackService.ACTION_SHUFFLE))
|
||||
R.id.widget_shuffle, context.newBroadcastIntent(PlaybackService.ACTION_INVERT_SHUFFLE))
|
||||
|
||||
// Like notifications, use the remote variants of icons since we really don't want to hack
|
||||
// indicators.
|
||||
|
@ -154,15 +152,15 @@ private fun RemoteViews.applyFullControls(context: Context, state: WidgetState):
|
|||
else -> R.drawable.ic_remote_shuffle_off
|
||||
}
|
||||
|
||||
val loopRes =
|
||||
when (state.loopMode) {
|
||||
LoopMode.NONE -> R.drawable.ic_remote_loop_off
|
||||
LoopMode.ALL -> R.drawable.ic_loop_on
|
||||
LoopMode.TRACK -> R.drawable.ic_loop_one
|
||||
val repeatRes =
|
||||
when (state.repeatMode) {
|
||||
RepeatMode.NONE -> R.drawable.ic_remote_repeat_off
|
||||
RepeatMode.ALL -> R.drawable.ic_repeat_on
|
||||
RepeatMode.TRACK -> R.drawable.ic_repeat_one
|
||||
}
|
||||
|
||||
setImageViewResource(R.id.widget_shuffle, shuffleRes)
|
||||
setImageViewResource(R.id.widget_loop, loopRes)
|
||||
setImageViewResource(R.id.widget_repeat, repeatRes)
|
||||
|
||||
return this
|
||||
}
|
||||
|
|
|
@ -20,8 +20,8 @@ package org.oxycblt.auxio.widgets
|
|||
import android.content.Context
|
||||
import org.oxycblt.auxio.music.MusicParent
|
||||
import org.oxycblt.auxio.music.Song
|
||||
import org.oxycblt.auxio.playback.state.LoopMode
|
||||
import org.oxycblt.auxio.playback.state.PlaybackStateManager
|
||||
import org.oxycblt.auxio.playback.state.RepeatMode
|
||||
import org.oxycblt.auxio.settings.SettingsManager
|
||||
import org.oxycblt.auxio.util.logD
|
||||
|
||||
|
@ -82,7 +82,7 @@ class WidgetController(private val context: Context) :
|
|||
widget.update(context, playbackManager)
|
||||
}
|
||||
|
||||
override fun onLoopModeChanged(loopMode: LoopMode) {
|
||||
override fun onRepeatChanged(repeatMode: RepeatMode) {
|
||||
widget.update(context, playbackManager)
|
||||
}
|
||||
|
||||
|
|
|
@ -74,7 +74,7 @@ class WidgetProvider : AppWidgetProvider() {
|
|||
bitmap,
|
||||
playbackManager.isPlaying,
|
||||
playbackManager.isShuffled,
|
||||
playbackManager.loopMode)
|
||||
playbackManager.repeatMode)
|
||||
|
||||
// Map each widget form to the cells where it would look at least okay.
|
||||
val views =
|
||||
|
|
|
@ -19,7 +19,7 @@ package org.oxycblt.auxio.widgets
|
|||
|
||||
import android.graphics.Bitmap
|
||||
import org.oxycblt.auxio.music.Song
|
||||
import org.oxycblt.auxio.playback.state.LoopMode
|
||||
import org.oxycblt.auxio.playback.state.RepeatMode
|
||||
|
||||
/*
|
||||
* An immutable condensed variant of the current playback state, used so that PlaybackStateManager
|
||||
|
@ -30,5 +30,5 @@ data class WidgetState(
|
|||
val albumArt: Bitmap?,
|
||||
val isPlaying: Boolean,
|
||||
val isShuffled: Boolean,
|
||||
val loopMode: LoopMode,
|
||||
val repeatMode: RepeatMode,
|
||||
)
|
||||
|
|
|
@ -118,12 +118,12 @@
|
|||
tools:text="16:16" />
|
||||
|
||||
<org.oxycblt.auxio.playback.PlaybackButton
|
||||
android:id="@+id/playback_loop"
|
||||
android:id="@+id/playback_repeat"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/spacing_medium"
|
||||
android:contentDescription="@string/desc_change_loop"
|
||||
android:src="@drawable/ic_loop"
|
||||
android:contentDescription="@string/desc_change_repeat"
|
||||
android:src="@drawable/ic_repeat"
|
||||
app:hasIndicator="true"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/playback_skip_prev"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
@ -137,7 +137,7 @@
|
|||
android:src="@drawable/ic_skip_prev"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/playback_play_pause"
|
||||
app:layout_constraintEnd_toStartOf="@+id/playback_play_pause"
|
||||
app:layout_constraintStart_toEndOf="@+id/playback_loop"
|
||||
app:layout_constraintStart_toEndOf="@+id/playback_repeat"
|
||||
app:layout_constraintTop_toTopOf="@+id/playback_play_pause" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
|
|
|
@ -116,12 +116,12 @@
|
|||
tools:text="16:16" />
|
||||
|
||||
<org.oxycblt.auxio.playback.PlaybackButton
|
||||
android:id="@+id/playback_loop"
|
||||
android:id="@+id/playback_repeat"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/spacing_large"
|
||||
android:contentDescription="@string/desc_change_loop"
|
||||
android:src="@drawable/ic_loop"
|
||||
android:contentDescription="@string/desc_change_repeat"
|
||||
android:src="@drawable/ic_repeat"
|
||||
app:hasIndicator="true"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/playback_skip_prev"
|
||||
app:layout_constraintEnd_toStartOf="@+id/playback_skip_prev"
|
||||
|
|
|
@ -105,12 +105,12 @@
|
|||
tools:text="16:16" />
|
||||
|
||||
<org.oxycblt.auxio.playback.PlaybackButton
|
||||
android:id="@+id/playback_loop"
|
||||
android:id="@+id/playback_repeat"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/spacing_mid_large"
|
||||
android:contentDescription="@string/desc_change_loop"
|
||||
android:src="@drawable/ic_loop"
|
||||
android:contentDescription="@string/desc_change_repeat"
|
||||
android:src="@drawable/ic_repeat"
|
||||
app:hasIndicator="true"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/playback_skip_prev"
|
||||
app:layout_constraintEnd_toStartOf="@+id/playback_skip_prev"
|
||||
|
|
|
@ -118,12 +118,12 @@
|
|||
tools:text="16:16" />
|
||||
|
||||
<org.oxycblt.auxio.playback.PlaybackButton
|
||||
android:id="@+id/playback_loop"
|
||||
android:id="@+id/playback_repeat"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/spacing_medium"
|
||||
android:contentDescription="@string/desc_change_loop"
|
||||
android:src="@drawable/ic_loop"
|
||||
android:contentDescription="@string/desc_change_repeat"
|
||||
android:src="@drawable/ic_repeat"
|
||||
app:hasIndicator="true"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/playback_skip_prev"
|
||||
app:layout_constraintHorizontal_chainStyle="packed"
|
||||
|
@ -138,7 +138,7 @@
|
|||
android:src="@drawable/ic_skip_prev"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/playback_play_pause"
|
||||
app:layout_constraintEnd_toStartOf="@+id/playback_play_pause"
|
||||
app:layout_constraintStart_toEndOf="@+id/playback_loop"
|
||||
app:layout_constraintStart_toEndOf="@+id/playback_repeat"
|
||||
app:layout_constraintTop_toTopOf="@+id/playback_play_pause" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
|
|
|
@ -102,12 +102,12 @@
|
|||
tools:text="16:16" />
|
||||
|
||||
<org.oxycblt.auxio.playback.PlaybackButton
|
||||
android:id="@+id/playback_loop"
|
||||
android:id="@+id/playback_repeat"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/spacing_medium"
|
||||
android:contentDescription="@string/desc_change_loop"
|
||||
android:src="@drawable/ic_loop"
|
||||
android:contentDescription="@string/desc_change_repeat"
|
||||
android:src="@drawable/ic_repeat"
|
||||
app:hasIndicator="true"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/playback_skip_prev"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
@ -121,7 +121,7 @@
|
|||
android:src="@drawable/ic_skip_prev"
|
||||
app:layout_constraintBottom_toBottomOf="@+id/playback_play_pause"
|
||||
app:layout_constraintEnd_toStartOf="@+id/playback_play_pause"
|
||||
app:layout_constraintStart_toEndOf="@+id/playback_loop"
|
||||
app:layout_constraintStart_toEndOf="@+id/playback_repeat"
|
||||
app:layout_constraintTop_toTopOf="@+id/playback_play_pause" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
|
|
|
@ -75,13 +75,13 @@
|
|||
android:layout_marginTop="@dimen/spacing_small">
|
||||
|
||||
<android.widget.ImageButton
|
||||
android:id="@+id/widget_loop"
|
||||
android:id="@+id/widget_repeat"
|
||||
style="@style/Widget.Auxio.PlaybackButton.AppWidget"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:contentDescription="@string/desc_change_loop"
|
||||
android:src="@drawable/ic_loop" />
|
||||
android:contentDescription="@string/desc_change_repeat"
|
||||
android:src="@drawable/ic_repeat" />
|
||||
|
||||
<android.widget.ImageButton
|
||||
android:id="@+id/widget_skip_prev"
|
||||
|
|
|
@ -62,13 +62,13 @@
|
|||
android:paddingBottom="@dimen/spacing_small">
|
||||
|
||||
<android.widget.ImageButton
|
||||
android:id="@+id/widget_loop"
|
||||
android:id="@+id/widget_repeat"
|
||||
style="@style/Widget.Auxio.PlaybackButton.AppWidget"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:contentDescription="@string/desc_change_loop"
|
||||
android:src="@drawable/ic_loop" />
|
||||
android:contentDescription="@string/desc_change_repeat"
|
||||
android:src="@drawable/ic_repeat" />
|
||||
|
||||
<android.widget.ImageButton
|
||||
android:id="@+id/widget_skip_prev"
|
||||
|
|
|
@ -77,7 +77,7 @@
|
|||
<string name="set_round_covers">اغلفة البوم مدورة</string>
|
||||
<string name="set_round_covers_desc">جعل اغلفة الابومات ذات زوايا مدورة</string>
|
||||
<string name="set_alt_action">استخدام نشاط بديل للإشعار</string>
|
||||
<string name="set_alt_loop">تفضيل نشاط وضع التكرار</string>
|
||||
<string name="set_alt_repeat">تفضيل نشاط وضع التكرار</string>
|
||||
<string name="set_alt_shuffle">تفضيل نشاط الخلط</string>
|
||||
|
||||
<string name="set_audio">صوتيات</string>
|
||||
|
@ -93,8 +93,8 @@
|
|||
<string name="set_keep_shuffle_desc">إبقاء وضع الخلط عند تشغيل اغنية جديدة</string>
|
||||
<string name="set_rewind_prev">تشجيع قبل التخطي للخلف</string>
|
||||
<string name="set_rewind_prev_desc">ترجيع قبل التخطي إلى الاغنية السابقة</string>
|
||||
<string name="set_loop_pause">ايقاف مؤقت عند التكرار</string>
|
||||
<string name="set_loop_pause_desc">ايقاف مؤقت عند تكرار تشغيل اغنية</string>
|
||||
<string name="set_repeat_pause">ايقاف مؤقت عند التكرار</string>
|
||||
<string name="set_repeat_pause_desc">ايقاف مؤقت عند تكرار تشغيل اغنية</string>
|
||||
|
||||
<string name="set_content">محتوى</string>
|
||||
<string name="set_save">حفظ حالة التشغيل</string>
|
||||
|
@ -118,7 +118,7 @@
|
|||
<string name="desc_play_pause">تشغيل او ايقاف مؤقت</string>
|
||||
<string name="desc_skip_next">تخطي للأغنية التالية</string>
|
||||
<string name="desc_skip_prev">تخطي للاغنية الاخيرة</string>
|
||||
<string name="desc_change_loop">تغيير وضع التكرار</string>
|
||||
<string name="desc_change_repeat">تغيير وضع التكرار</string>
|
||||
<string name="desc_shuffle">تشغيل او اطفاء الخلط</string>
|
||||
<string name="desc_shuffle_all">خلط جميع الاغاني</string>
|
||||
|
||||
|
|
|
@ -62,7 +62,7 @@
|
|||
<string name="set_quality_covers">"Ignorovat obaly MediaStore"</string>
|
||||
<string name="set_quality_covers_desc">"Zlepší kvalitu obalů alb, ale znamená také delší časy načítání a vyšší využití paměti"</string>
|
||||
<string name="set_alt_action">"Použít alternativní ikonu oznámení"</string>
|
||||
<string name="set_alt_loop">"Preferovat akci režimu opakování"</string>
|
||||
<string name="set_alt_repeat">"Preferovat akci režimu opakování"</string>
|
||||
<string name="set_alt_shuffle">"Preferovat akci náhodného přehrávání"</string>
|
||||
<string name="set_audio">"Zvuk"</string>
|
||||
<string name="set_behavior">"Chování"</string>
|
||||
|
@ -71,8 +71,8 @@
|
|||
<string name="set_keep_shuffle_desc">"Ponechat náhodné při přehrávání nové skladby"</string>
|
||||
<string name="set_rewind_prev">"Přetočit před přeskočením zpět"</string>
|
||||
<string name="set_rewind_prev_desc">"Přetočit před přeskočením na předchozí skladbu"</string>
|
||||
<string name="set_loop_pause">"Pozastavit při opakování"</string>
|
||||
<string name="set_loop_pause_desc">"Pozastavit při opakování skladby"</string>
|
||||
<string name="set_repeat_pause">"Pozastavit při opakování"</string>
|
||||
<string name="set_repeat_pause_desc">"Pozastavit při opakování skladby"</string>
|
||||
<string name="set_content">"Obsah"</string>
|
||||
<string name="set_save">"Uložit stav přehrávání"</string>
|
||||
<string name="set_save_desc">"Nyní uložit aktuální stav přehrávání"</string>
|
||||
|
@ -94,7 +94,7 @@
|
|||
<string name="desc_play_pause">"Přehrát nebo pozastavit"</string>
|
||||
<string name="desc_skip_next">"Přeskočit na další skladbu"</string>
|
||||
<string name="desc_skip_prev">"Přeskočit na poslední skladbu"</string>
|
||||
<string name="desc_change_loop">"Změnit režim opakování"</string>
|
||||
<string name="desc_change_repeat">"Změnit režim opakování"</string>
|
||||
<string name="desc_shuffle">"Zapnout nebo vypnout náhodné"</string>
|
||||
<string name="desc_queue_handle">"Přesunout skladbu ve frontě"</string>
|
||||
<string name="desc_clear_search">"Vymazat vyhledávání"</string>
|
||||
|
|
|
@ -67,7 +67,7 @@
|
|||
<string name="set_round_covers">Abgerundete Cover</string>
|
||||
<string name="set_round_covers_desc">Rundet Ecken der Cover ab</string>
|
||||
<string name="set_alt_action">Alternative Aktionstaste verwenden</string>
|
||||
<string name="set_alt_loop">Wiederholen-Aktionstaste bevorzugen</string>
|
||||
<string name="set_alt_repeat">Wiederholen-Aktionstaste bevorzugen</string>
|
||||
<string name="set_alt_shuffle">Zufällig-Aktionstaste bevorzugen</string>
|
||||
|
||||
<string name="set_audio">Audio</string>
|
||||
|
@ -109,7 +109,7 @@
|
|||
<string name="desc_play_pause">Abspielen oder Pausieren</string>
|
||||
<string name="desc_skip_prev">Zum letzten Lied springen</string>
|
||||
<string name="desc_skip_next">Zum nächsten Lied springen</string>
|
||||
<string name="desc_change_loop">Art der Wiederholung ändern</string>
|
||||
<string name="desc_change_repeat">Art der Wiederholung ändern</string>
|
||||
|
||||
<string name="desc_clear_search">Suchanfrage löschen</string>
|
||||
|
||||
|
@ -159,8 +159,8 @@
|
|||
<string name="lbl_sort_year">Jahr</string>
|
||||
<string name="set_black_mode">Schwarzes Thema</string>
|
||||
<string name="set_black_mode_desc">Ein schwarzes Thema für das dunkle verwenden</string>
|
||||
<string name="set_loop_pause">Pause bei Wiederholung</string>
|
||||
<string name="set_loop_pause_desc">Pausiert, wenn ein Song wiederholt wird</string>
|
||||
<string name="set_repeat_pause">Pause bei Wiederholung</string>
|
||||
<string name="set_repeat_pause_desc">Pausiert, wenn ein Song wiederholt wird</string>
|
||||
<string name="desc_shuffle">Zufällig an- oder ausschalten</string>
|
||||
<string name="desc_queue_handle">Lied in der Warteschlange verschieben</string>
|
||||
<string name="desc_blacklist_delete">Ausgeschlossenes Verzechnis entfernen</string>
|
||||
|
|
|
@ -77,7 +77,7 @@
|
|||
<string name="set_round_covers">Carátulas redondeadas</string>
|
||||
<string name="set_round_covers_desc">Usar carátulas redondeadas para los álbumes</string>
|
||||
<string name="set_alt_action">Usar acciones de notificación alternativas</string>
|
||||
<string name="set_alt_loop">Preferir acción de bucle</string>
|
||||
<string name="set_alt_repeat">Preferir acción de bucle</string>
|
||||
<string name="set_alt_shuffle">Preferir acción de mezcla</string>
|
||||
|
||||
<string name="set_audio">Sonido</string>
|
||||
|
@ -93,8 +93,8 @@
|
|||
<string name="set_keep_shuffle_desc">Mantener mezcla cuando se reproduce una nueva canción</string>
|
||||
<string name="set_rewind_prev">Rebobinar atrás</string>
|
||||
<string name="set_rewind_prev_desc">Rebobinar al saltar a la canción anterior</string>
|
||||
<string name="set_loop_pause">Pausa en repetición</string>
|
||||
<string name="set_loop_pause_desc">Pausa cuando se repite una canción</string>
|
||||
<string name="set_repeat_pause">Pausa en repetición</string>
|
||||
<string name="set_repeat_pause_desc">Pausa cuando se repite una canción</string>
|
||||
|
||||
<string name="set_content">Contenido</string>
|
||||
<string name="set_save">Guardar estado de reproducción</string>
|
||||
|
@ -121,7 +121,7 @@
|
|||
<string name="desc_play_pause">Reproducir o pausar</string>
|
||||
<string name="desc_skip_next">Saltar a la siguiente canción</string>
|
||||
<string name="desc_skip_prev">Saltar a la última canción</string>
|
||||
<string name="desc_change_loop">Cambiar modo de repetición</string>
|
||||
<string name="desc_change_repeat">Cambiar modo de repetición</string>
|
||||
<string name="desc_shuffle">Act/des mezcla</string>
|
||||
<string name="desc_shuffle_all">Mezclar todo</string>
|
||||
|
||||
|
|
|
@ -66,7 +66,7 @@
|
|||
<string name="set_quality_covers">Negeer Mediaopslag illustraties</string>
|
||||
<string name="set_quality_covers_desc">Verhoogt de kwaliteit van de albumhoezen, maar resulteert in langere laadtijden en hoger geheugengebruik </string>
|
||||
<string name="set_alt_action">Gebruikt een afternatief notification action</string>
|
||||
<string name="set_alt_loop">Voorkeur aan herhaalde actie</string>
|
||||
<string name="set_alt_repeat">Voorkeur aan herhaalde actie</string>
|
||||
<string name="set_alt_shuffle">Voorkeur aan shuffle actie</string>
|
||||
|
||||
<string name="set_audio">Audio</string>
|
||||
|
@ -100,7 +100,7 @@
|
|||
<string name="desc_play_pause">Afspelen/Pauzeren</string>
|
||||
<string name="desc_skip_next">Naar volgend nummer gaan</string>
|
||||
<string name="desc_skip_prev">Naar het laatste nummer gaan</string>
|
||||
<string name="desc_change_loop">Herhaalfunctie wijzigen</string>
|
||||
<string name="desc_change_repeat">Herhaalfunctie wijzigen</string>
|
||||
|
||||
<string name="desc_clear_search">Zoekopdracht wissen</string>
|
||||
<string name="desc_blacklist_delete">Verwijder uitgesloten map</string>
|
||||
|
|
|
@ -77,7 +77,7 @@
|
|||
<string name="set_round_covers">Скруглённые обложки</string>
|
||||
<string name="set_round_covers_desc">Показывать обложки со скруглёнными краями</string>
|
||||
<string name="set_alt_action">Кнопка в уведомлении</string>
|
||||
<string name="set_alt_loop">Режим повтора</string>
|
||||
<string name="set_alt_repeat">Режим повтора</string>
|
||||
<string name="set_alt_shuffle">Режим перемешивания</string>
|
||||
|
||||
<string name="set_audio">Звук</string>
|
||||
|
@ -95,8 +95,8 @@
|
|||
<string name="set_keep_shuffle_desc">Запоминать режим перемешивания для новых треков</string>
|
||||
<string name="set_rewind_prev">Сначала перемотать трек</string>
|
||||
<string name="set_rewind_prev_desc">Перематывать трек перед возвратом к предыдущему треку</string>
|
||||
<string name="set_loop_pause">Пауза при повторе</string>
|
||||
<string name="set_loop_pause_desc">Ставить на паузу при повторе трека</string>
|
||||
<string name="set_repeat_pause">Пауза при повторе</string>
|
||||
<string name="set_repeat_pause_desc">Ставить на паузу при повторе трека</string>
|
||||
|
||||
<string name="set_content">Библиотека</string>
|
||||
<string name="set_save">Запоминать позицию</string>
|
||||
|
@ -123,7 +123,7 @@
|
|||
<string name="desc_play_pause">Играть или остановить</string>
|
||||
<string name="desc_skip_next">Перейти к следующему треку</string>
|
||||
<string name="desc_skip_prev">Вернуться к предыдущему треку</string>
|
||||
<string name="desc_change_loop">Режим повтора</string>
|
||||
<string name="desc_change_repeat">Режим повтора</string>
|
||||
<string name="desc_shuffle">Перемешивание</string>
|
||||
<string name="desc_shuffle_all">Перемешать все треки</string>
|
||||
|
||||
|
|
|
@ -76,7 +76,7 @@
|
|||
<string name="set_round_covers">专辑封面圆角</string>
|
||||
<string name="set_round_covers_desc">使用圆角设计的专辑封面</string>
|
||||
<string name="set_alt_action">使用替代通知操作方案</string>
|
||||
<string name="set_alt_loop">偏好重复播放操作</string>
|
||||
<string name="set_alt_repeat">偏好重复播放操作</string>
|
||||
<string name="set_alt_shuffle">偏好随机播放操作</string>
|
||||
|
||||
<string name="set_audio">音频</string>
|
||||
|
@ -93,8 +93,8 @@
|
|||
<string name="set_keep_shuffle_desc">播放新曲目时保留随机播放模式</string>
|
||||
<string name="set_rewind_prev">切换上一曲前先倒带</string>
|
||||
<string name="set_rewind_prev_desc">切换至上一首歌曲前先进行倒带</string>
|
||||
<string name="set_loop_pause">重复播放前暂停</string>
|
||||
<string name="set_loop_pause_desc">曲目重复播放前暂停</string>
|
||||
<string name="set_repeat_pause">重复播放前暂停</string>
|
||||
<string name="set_repeat_pause_desc">曲目重复播放前暂停</string>
|
||||
|
||||
<string name="set_content">内容</string>
|
||||
<string name="set_save">保存播放状态</string>
|
||||
|
@ -123,7 +123,7 @@
|
|||
<string name="desc_play_pause">播放或暂停</string>
|
||||
<string name="desc_skip_next">切换到下一首歌</string>
|
||||
<string name="desc_skip_prev">切换到上一首歌</string>
|
||||
<string name="desc_change_loop">更改重复播放模式</string>
|
||||
<string name="desc_change_repeat">更改重复播放模式</string>
|
||||
<string name="desc_shuffle">开启或关闭随机播放模式</string>
|
||||
<string name="desc_shuffle_all">随机播放所有曲目</string>
|
||||
|
||||
|
|
|
@ -76,7 +76,7 @@
|
|||
<string name="set_round_covers">Rounded album covers</string>
|
||||
<string name="set_round_covers_desc">Use album covers with rounded corners</string>
|
||||
<string name="set_alt_action">Use alternate notification action</string>
|
||||
<string name="set_alt_loop">Prefer repeat mode action</string>
|
||||
<string name="set_alt_repeat">Prefer repeat mode action</string>
|
||||
<string name="set_alt_shuffle">Prefer shuffle action</string>
|
||||
|
||||
<string name="set_audio">Audio</string>
|
||||
|
@ -93,8 +93,8 @@
|
|||
<string name="set_keep_shuffle_desc">Keep shuffle on when playing a new song</string>
|
||||
<string name="set_rewind_prev">Rewind before skipping back</string>
|
||||
<string name="set_rewind_prev_desc">Rewind before skipping to the previous song</string>
|
||||
<string name="set_loop_pause">Pause on repeat</string>
|
||||
<string name="set_loop_pause_desc">Pause when a song repeats</string>
|
||||
<string name="set_repeat_pause">Pause on repeat</string>
|
||||
<string name="set_repeat_pause_desc">Pause when a song repeats</string>
|
||||
|
||||
<string name="set_content">Content</string>
|
||||
<string name="set_save">Save playback state</string>
|
||||
|
@ -123,7 +123,7 @@
|
|||
<string name="desc_play_pause">Play or Pause</string>
|
||||
<string name="desc_skip_next">Skip to next song</string>
|
||||
<string name="desc_skip_prev">Skip to last song</string>
|
||||
<string name="desc_change_loop">Change repeat mode</string>
|
||||
<string name="desc_change_repeat">Change repeat mode</string>
|
||||
<string name="desc_shuffle">Turn shuffle on or off</string>
|
||||
<string name="desc_shuffle_all">Shuffle all songs</string>
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@
|
|||
app:defaultValue="false"
|
||||
app:iconSpaceReserved="false"
|
||||
app:key="KEY_ALT_NOTIF_ACTION"
|
||||
app:summaryOff="@string/set_alt_loop"
|
||||
app:summaryOff="@string/set_alt_repeat"
|
||||
app:summaryOn="@string/set_alt_shuffle"
|
||||
app:title="@string/set_alt_action" />
|
||||
|
||||
|
@ -129,8 +129,8 @@
|
|||
app:defaultValue="false"
|
||||
app:iconSpaceReserved="false"
|
||||
app:key="KEY_LOOP_PAUSE"
|
||||
app:summary="@string/set_loop_pause_desc"
|
||||
app:title="@string/set_loop_pause" />
|
||||
app:summary="@string/set_repeat_pause_desc"
|
||||
app:title="@string/set_repeat_pause" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
|
|
|
@ -92,7 +92,7 @@ to a name that can be used in UIs.
|
|||
|
||||
Other data types represent a specific UI configuration or state:
|
||||
- Sealed classes like `Sort` contain data with them that can be modified.
|
||||
- Enums like `DisplayMode` and `LoopMode` only contain static data, such as a string resource.
|
||||
- Enums like `DisplayMode` and `RepeatMode` only contain static data, such as a string resource.
|
||||
|
||||
Things to keep in mind while working with music data:
|
||||
- `id` is not derived from the `MediaStore` ID of the music data. It is actually a hash of the unique fields of the music data.
|
||||
|
|
Loading…
Reference in a new issue