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:
OxygenCobalt 2022-04-29 14:52:33 -06:00
parent c80af01d5c
commit 8e849feb7d
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
36 changed files with 174 additions and 166 deletions

View file

@ -55,12 +55,12 @@ object IntegerTable {
/** Intent request code */ /** Intent request code */
const val REQUEST_CODE = 0xA0C0 const val REQUEST_CODE = 0xA0C0
/** LoopMode.NONE */ /** RepeatMode.NONE */
const val LOOP_MODE_NONE = 0xA100 const val REPEAT_MODE_NONE = 0xA100
/** LoopMode.ALL */ /** RepeatMode.ALL */
const val LOOP_MODE_ALL = 0xA101 const val REPEAT_MODE_ALL = 0xA101
/** LoopMode.TRACK */ /** RepeatMode.TRACK */
const val LOOP_MODE_TRACK = 0xA102 const val REPEAT_MODE_TRACK = 0xA102
/** PlaybackMode.IN_GENRE */ /** PlaybackMode.IN_GENRE */
const val PLAYBACK_MODE_IN_GENRE = 0xA103 const val PLAYBACK_MODE_IN_GENRE = 0xA103

View file

@ -37,8 +37,8 @@ import org.oxycblt.auxio.util.getDrawableSafe
* doesn't require a whole new icon set. * 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 * 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 * active. This is useful for the shuffle/repeat buttons, as at times highlighting them is not
* to differentiate them. * enough to differentiate them.
*/ */
class PlaybackButton class PlaybackButton
@JvmOverloads @JvmOverloads

View file

@ -32,7 +32,7 @@ import org.oxycblt.auxio.databinding.FragmentPlaybackPanelBinding
import org.oxycblt.auxio.music.MusicParent import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.music.toDuration 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.MainNavigationAction
import org.oxycblt.auxio.ui.NavigationViewModel import org.oxycblt.auxio.ui.NavigationViewModel
import org.oxycblt.auxio.ui.ViewBindingFragment import org.oxycblt.auxio.ui.ViewBindingFragment
@ -112,7 +112,7 @@ class PlaybackPanelFragment :
.stateList .stateList
} }
binding.playbackLoop.setOnClickListener { playbackModel.incrementLoop() } binding.playbackRepeat.setOnClickListener { playbackModel.incrementRepeatMode() }
binding.playbackSkipPrev.setOnClickListener { playbackModel.skipPrev() } binding.playbackSkipPrev.setOnClickListener { playbackModel.skipPrev() }
binding.playbackPlayPause.apply { binding.playbackPlayPause.apply {
@ -129,7 +129,7 @@ class PlaybackPanelFragment :
playbackModel.song.observe(viewLifecycleOwner, ::updateSong) playbackModel.song.observe(viewLifecycleOwner, ::updateSong)
playbackModel.parent.observe(viewLifecycleOwner, ::updateParent) playbackModel.parent.observe(viewLifecycleOwner, ::updateParent)
playbackModel.positionSecs.observe(viewLifecycleOwner, ::updatePosition) playbackModel.positionSecs.observe(viewLifecycleOwner, ::updatePosition)
playbackModel.loopMode.observe(viewLifecycleOwner, ::updateLoop) playbackModel.repeatMode.observe(viewLifecycleOwner, ::updateRepeat)
playbackModel.isPlaying.observe(viewLifecycleOwner, ::updatePlaying) playbackModel.isPlaying.observe(viewLifecycleOwner, ::updatePlaying)
playbackModel.isShuffled.observe(viewLifecycleOwner, ::updateShuffled) playbackModel.isShuffled.observe(viewLifecycleOwner, ::updateShuffled)
@ -197,10 +197,10 @@ class PlaybackPanelFragment :
} }
} }
private fun updateLoop(loopMode: LoopMode) { private fun updateRepeat(repeatMode: RepeatMode) {
requireBinding().playbackLoop.apply { requireBinding().playbackRepeat.apply {
isActivated = loopMode != LoopMode.NONE isActivated = repeatMode != RepeatMode.NONE
setImageResource(loopMode.icon) setImageResource(repeatMode.icon)
} }
} }

View file

@ -30,9 +30,9 @@ import org.oxycblt.auxio.music.Genre
import org.oxycblt.auxio.music.MusicParent import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.MusicStore import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.music.Song 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.PlaybackMode
import org.oxycblt.auxio.playback.state.PlaybackStateManager import org.oxycblt.auxio.playback.state.PlaybackStateManager
import org.oxycblt.auxio.playback.state.RepeatMode
import org.oxycblt.auxio.settings.SettingsManager import org.oxycblt.auxio.settings.SettingsManager
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.logE import org.oxycblt.auxio.util.logE
@ -62,7 +62,7 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
// States // States
private val mIsPlaying = MutableLiveData(false) private val mIsPlaying = MutableLiveData(false)
private val mPositionSecs = MutableLiveData(0L) private val mPositionSecs = MutableLiveData(0L)
private val mLoopMode = MutableLiveData(LoopMode.NONE) private val mRepeatMode = MutableLiveData(RepeatMode.NONE)
private val mIsShuffled = MutableLiveData(false) private val mIsShuffled = MutableLiveData(false)
// Queue // Queue
@ -83,9 +83,9 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
/** The current playback position, in seconds */ /** The current playback position, in seconds */
val positionSecs: LiveData<Long> val positionSecs: LiveData<Long>
get() = mPositionSecs get() = mPositionSecs
/** The current repeat mode, see [LoopMode] for more information */ /** The current repeat mode, see [RepeatMode] for more information */
val loopMode: LiveData<LoopMode> val repeatMode: LiveData<RepeatMode>
get() = mLoopMode get() = mRepeatMode
val isShuffled: LiveData<Boolean> val isShuffled: LiveData<Boolean>
get() = mIsShuffled get() = mIsShuffled
@ -263,9 +263,9 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
playbackManager.reshuffle(!playbackManager.isShuffled) playbackManager.reshuffle(!playbackManager.isShuffled)
} }
/** Increment the loop status, e.g from off to loop once */ /** Increment the repeat mode, e.g from [RepeatMode.NONE] to [RepeatMode.ALL] */
fun incrementLoop() { fun incrementRepeatMode() {
playbackManager.loopMode = playbackManager.loopMode.increment() playbackManager.repeatMode = playbackManager.repeatMode.increment()
} }
// --- SAVE/RESTORE FUNCTIONS --- // --- SAVE/RESTORE FUNCTIONS ---
@ -312,7 +312,7 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
onPositionChanged(playbackManager.positionMs) onPositionChanged(playbackManager.positionMs)
onPlayingChanged(playbackManager.isPlaying) onPlayingChanged(playbackManager.isPlaying)
onShuffledChanged(playbackManager.isShuffled) onShuffledChanged(playbackManager.isShuffled)
onLoopModeChanged(playbackManager.loopMode) onRepeatChanged(playbackManager.repeatMode)
} }
// --- OVERRIDES --- // --- OVERRIDES ---
@ -349,7 +349,7 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
mIsShuffled.value = isShuffled mIsShuffled.value = isShuffled
} }
override fun onLoopModeChanged(loopMode: LoopMode) { override fun onRepeatChanged(repeatMode: RepeatMode) {
mLoopMode.value = loopMode mRepeatMode.value = repeatMode
} }
} }

View file

@ -83,7 +83,7 @@ class PlaybackStateDatabase(context: Context) :
.append("${StateColumns.COLUMN_QUEUE_INDEX} INTEGER NOT NULL,") .append("${StateColumns.COLUMN_QUEUE_INDEX} INTEGER NOT NULL,")
.append("${StateColumns.COLUMN_PLAYBACK_MODE} INTEGER NOT NULL,") .append("${StateColumns.COLUMN_PLAYBACK_MODE} INTEGER NOT NULL,")
.append("${StateColumns.COLUMN_IS_SHUFFLED} BOOLEAN 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 return command
} }
@ -119,7 +119,7 @@ class PlaybackStateDatabase(context: Context) :
val indexIndex = cursor.getColumnIndexOrThrow(StateColumns.COLUMN_QUEUE_INDEX) val indexIndex = cursor.getColumnIndexOrThrow(StateColumns.COLUMN_QUEUE_INDEX)
val modeIndex = cursor.getColumnIndexOrThrow(StateColumns.COLUMN_PLAYBACK_MODE) val modeIndex = cursor.getColumnIndexOrThrow(StateColumns.COLUMN_PLAYBACK_MODE)
val shuffleIndex = cursor.getColumnIndexOrThrow(StateColumns.COLUMN_IS_SHUFFLED) 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() cursor.moveToFirst()
@ -146,7 +146,8 @@ class PlaybackStateDatabase(context: Context) :
queueIndex = cursor.getInt(indexIndex), queueIndex = cursor.getInt(indexIndex),
playbackMode = mode, playbackMode = mode,
isShuffled = cursor.getInt(shuffleIndex) == 1, 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") logD("Successfully read playback state: $state")
@ -173,7 +174,7 @@ class PlaybackStateDatabase(context: Context) :
put(StateColumns.COLUMN_QUEUE_INDEX, state.queueIndex) put(StateColumns.COLUMN_QUEUE_INDEX, state.queueIndex)
put(StateColumns.COLUMN_PLAYBACK_MODE, state.playbackMode.intCode) put(StateColumns.COLUMN_PLAYBACK_MODE, state.playbackMode.intCode)
put(StateColumns.COLUMN_IS_SHUFFLED, state.isShuffled) 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) insert(TABLE_NAME_STATE, null, stateData)
@ -262,7 +263,7 @@ class PlaybackStateDatabase(context: Context) :
val queueIndex: Int, val queueIndex: Int,
val playbackMode: PlaybackMode, val playbackMode: PlaybackMode,
val isShuffled: Boolean, val isShuffled: Boolean,
val loopMode: LoopMode, val repeatMode: RepeatMode,
) )
private object StateColumns { private object StateColumns {
@ -273,7 +274,7 @@ class PlaybackStateDatabase(context: Context) :
const val COLUMN_QUEUE_INDEX = "queue_index" const val COLUMN_QUEUE_INDEX = "queue_index"
const val COLUMN_PLAYBACK_MODE = "playback_mode" const val COLUMN_PLAYBACK_MODE = "playback_mode"
const val COLUMN_IS_SHUFFLED = "is_shuffling" const val COLUMN_IS_SHUFFLED = "is_shuffling"
const val COLUMN_LOOP_MODE = "loop_mode" const val COLUMN_REPEAT_MODE = "loop_mode"
} }
private object QueueColumns { private object QueueColumns {

View file

@ -71,11 +71,11 @@ class PlaybackStateManager private constructor() {
/** The current playback progress */ /** The current playback progress */
var positionMs = 0L var positionMs = 0L
private set private set
/** The current [LoopMode] */ /** The current [RepeatMode] */
var loopMode = LoopMode.NONE var repeatMode = RepeatMode.NONE
set(value) { set(value) {
field = value field = value
notifyLoopModeChanged() notifyRepeatModeChanged()
} }
/** Whether the queue is shuffled */ /** Whether the queue is shuffled */
var isShuffled = false var isShuffled = false
@ -153,11 +153,11 @@ class PlaybackStateManager private constructor() {
/** Go to the next song, along with doing all the checks that entails. */ /** Go to the next song, along with doing all the checks that entails. */
fun next() { fun next() {
// Increment the index, if it cannot be incremented any further, then // 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) { if (index < mutableQueue.lastIndex) {
goto(++index, true) goto(++index, true)
} else { } 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. */ /** Rewind to the beginning of a song. */
fun rewind() = seekTo(0) fun rewind() = seekTo(0)
/** Loop playback around to the beginning. */ /** Repeat the current song (in line with the user configuration). */
fun loop() = seekTo(0) fun repeat() {
seekTo(0)
if (settingsManager.pauseOnRepeat) {
isPlaying = false
}
}
// TODO: Rework these methods eventually // TODO: Rework these methods eventually
@ -342,7 +347,7 @@ class PlaybackStateManager private constructor() {
index, index,
playbackMode, playbackMode,
isShuffled, isShuffled,
loopMode, repeatMode,
)) ))
database.writeQueue(mutableQueue) database.writeQueue(mutableQueue)
@ -377,12 +382,12 @@ class PlaybackStateManager private constructor() {
parent = playbackState.parent parent = playbackState.parent
mutableQueue = queue mutableQueue = queue
index = playbackState.queueIndex index = playbackState.queueIndex
loopMode = playbackState.loopMode repeatMode = playbackState.repeatMode
isShuffled = playbackState.isShuffled isShuffled = playbackState.isShuffled
notifyNewPlayback() notifyNewPlayback()
seekTo(playbackState.positionMs) seekTo(playbackState.positionMs)
notifyLoopModeChanged() notifyRepeatModeChanged()
notifyShuffledChanged() notifyShuffledChanged()
} }
@ -423,9 +428,9 @@ class PlaybackStateManager private constructor() {
} }
} }
private fun notifyLoopModeChanged() { private fun notifyRepeatModeChanged() {
for (callback in callbacks) { for (callback in callbacks) {
callback.onLoopModeChanged(loopMode) callback.onRepeatChanged(repeatMode)
} }
} }
@ -452,7 +457,7 @@ class PlaybackStateManager private constructor() {
fun onPlayingChanged(isPlaying: Boolean) {} fun onPlayingChanged(isPlaying: Boolean) {}
fun onPositionChanged(positionMs: Long) {} fun onPositionChanged(positionMs: Long) {}
fun onLoopModeChanged(loopMode: LoopMode) {} fun onRepeatChanged(repeatMode: RepeatMode) {}
fun onShuffledChanged(isShuffled: Boolean) {} fun onShuffledChanged(isShuffled: Boolean) {}
fun onSeek(positionMs: Long) {} fun onSeek(positionMs: Long) {}

View file

@ -24,13 +24,13 @@ import org.oxycblt.auxio.R
* Enum that determines the playback repeat mode. * Enum that determines the playback repeat mode.
* @author OxygenCobalt * @author OxygenCobalt
*/ */
enum class LoopMode { enum class RepeatMode {
NONE, NONE,
ALL, ALL,
TRACK; TRACK;
/** Increment the LoopMode, e.g from [NONE] to [ALL] */ /** Increment the LoopMode, e.g from [NONE] to [ALL] */
fun increment(): LoopMode { fun increment(): RepeatMode {
return when (this) { return when (this) {
NONE -> ALL NONE -> ALL
ALL -> TRACK ALL -> TRACK
@ -41,9 +41,9 @@ enum class LoopMode {
val icon: Int val icon: Int
get() = get() =
when (this) { when (this) {
NONE -> R.drawable.ic_loop NONE -> R.drawable.ic_repeat
ALL -> R.drawable.ic_loop_on ALL -> R.drawable.ic_repeat_on
TRACK -> R.drawable.ic_loop_one TRACK -> R.drawable.ic_repeat_one
} }
/** /**
@ -53,18 +53,18 @@ enum class LoopMode {
val intCode: Int val intCode: Int
get() = get() =
when (this) { when (this) {
NONE -> IntegerTable.LOOP_MODE_NONE NONE -> IntegerTable.REPEAT_MODE_NONE
ALL -> IntegerTable.LOOP_MODE_ALL ALL -> IntegerTable.REPEAT_MODE_ALL
TRACK -> IntegerTable.LOOP_MODE_TRACK TRACK -> IntegerTable.REPEAT_MODE_TRACK
} }
companion object { companion object {
/** Convert an int [constant] into a LoopMode, or null if it isn't valid. */ /** 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) { return when (constant) {
IntegerTable.LOOP_MODE_NONE -> NONE IntegerTable.REPEAT_MODE_NONE -> NONE
IntegerTable.LOOP_MODE_ALL -> ALL IntegerTable.REPEAT_MODE_ALL -> ALL
IntegerTable.LOOP_MODE_TRACK -> TRACK IntegerTable.REPEAT_MODE_TRACK -> TRACK
else -> null else -> null
} }
} }

View file

@ -31,7 +31,7 @@ import org.oxycblt.auxio.R
import org.oxycblt.auxio.coil.loadBitmap import org.oxycblt.auxio.coil.loadBitmap
import org.oxycblt.auxio.music.MusicParent import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Song 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.newBroadcastIntent
import org.oxycblt.auxio.util.newMainIntent import org.oxycblt.auxio.util.newMainIntent
@ -52,7 +52,7 @@ private constructor(private val context: Context, mediaToken: MediaSessionCompat
setContentIntent(context.newMainIntent()) setContentIntent(context.newMainIntent())
setVisibility(NotificationCompat.VISIBILITY_PUBLIC) 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(buildAction(context, PlaybackService.ACTION_SKIP_PREV, R.drawable.ic_skip_prev))
addAction(buildPlayPauseAction(context, true)) addAction(buildPlayPauseAction(context, true))
addAction(buildAction(context, PlaybackService.ACTION_SKIP_NEXT, R.drawable.ic_skip_next)) 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) mActions[2] = buildPlayPauseAction(context, isPlaying)
} }
/** Update the first action to reflect the [loopMode] given. */ /** Update the first action to reflect the [repeatMode] given. */
fun setLoopMode(loopMode: LoopMode) { fun setRepeatMode(repeatMode: RepeatMode) {
mActions[0] = buildLoopAction(context, loopMode) mActions[0] = buildRepeatAction(context, repeatMode)
} }
/** Update the first action to reflect whether the queue is shuffled or not */ /** 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) 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 = val drawableRes =
when (loopMode) { when (repeatMode) {
LoopMode.NONE -> R.drawable.ic_remote_loop_off RepeatMode.NONE -> R.drawable.ic_remote_repeat_off
LoopMode.ALL -> R.drawable.ic_loop RepeatMode.ALL -> R.drawable.ic_repeat
LoopMode.TRACK -> R.drawable.ic_loop_one 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( private fun buildShuffleAction(
@ -141,7 +144,7 @@ private constructor(private val context: Context, mediaToken: MediaSessionCompat
val drawableRes = val drawableRes =
if (isShuffled) R.drawable.ic_shuffle else R.drawable.ic_remote_shuffle_off 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( private fun buildAction(

View file

@ -52,7 +52,7 @@ import org.oxycblt.auxio.BuildConfig
import org.oxycblt.auxio.IntegerTable import org.oxycblt.auxio.IntegerTable
import org.oxycblt.auxio.music.MusicParent import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Song 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.playback.state.PlaybackStateManager
import org.oxycblt.auxio.settings.SettingsManager import org.oxycblt.auxio.settings.SettingsManager
import org.oxycblt.auxio.util.getSystemServiceSafe import org.oxycblt.auxio.util.getSystemServiceSafe
@ -146,8 +146,8 @@ class PlaybackService :
addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY) addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY)
addAction(AudioManager.ACTION_HEADSET_PLUG) addAction(AudioManager.ACTION_HEADSET_PLUG)
addAction(ACTION_LOOP) addAction(ACTION_INC_REPEAT_MODE)
addAction(ACTION_SHUFFLE) addAction(ACTION_INVERT_SHUFFLE)
addAction(ACTION_SKIP_PREV) addAction(ACTION_SKIP_PREV)
addAction(ACTION_PLAY_PAUSE) addAction(ACTION_PLAY_PAUSE)
addAction(ACTION_SKIP_NEXT) addAction(ACTION_SKIP_NEXT)
@ -215,8 +215,8 @@ class PlaybackService :
override fun onPlaybackStateChanged(state: Int) { override fun onPlaybackStateChanged(state: Int) {
when (state) { when (state) {
Player.STATE_ENDED -> { Player.STATE_ENDED -> {
if (playbackManager.loopMode == LoopMode.TRACK) { if (playbackManager.repeatMode == RepeatMode.TRACK) {
playbackManager.loop() playbackManager.repeat()
} else { } else {
playbackManager.next() playbackManager.next()
} }
@ -286,9 +286,9 @@ class PlaybackService :
startForegroundOrNotify() startForegroundOrNotify()
} }
override fun onLoopModeChanged(loopMode: LoopMode) { override fun onRepeatChanged(repeatMode: RepeatMode) {
if (!settingsManager.useAltNotifAction) { if (!settingsManager.useAltNotifAction) {
notification.setLoopMode(loopMode) notification.setRepeatMode(repeatMode)
startForegroundOrNotify() startForegroundOrNotify()
} }
} }
@ -317,7 +317,7 @@ class PlaybackService :
if (useAltAction) { if (useAltAction) {
notification.setShuffled(playbackManager.isShuffled) notification.setShuffled(playbackManager.isShuffled)
} else { } else {
notification.setLoopMode(playbackManager.loopMode) notification.setRepeatMode(playbackManager.repeatMode)
} }
startForegroundOrNotify() startForegroundOrNotify()
@ -380,7 +380,7 @@ class PlaybackService :
onSongChanged(playbackManager.song) onSongChanged(playbackManager.song)
onSeek(playbackManager.positionMs) onSeek(playbackManager.positionMs)
onShuffledChanged(playbackManager.isShuffled) onShuffledChanged(playbackManager.isShuffled)
onLoopModeChanged(playbackManager.loopMode) onRepeatChanged(playbackManager.repeatMode)
// Notify other classes that rely on this service to also update. // Notify other classes that rely on this service to also update.
widgets.update() widgets.update()
@ -450,8 +450,8 @@ class PlaybackService :
// --- AUXIO EVENTS --- // --- AUXIO EVENTS ---
ACTION_PLAY_PAUSE -> playbackManager.isPlaying = !playbackManager.isPlaying ACTION_PLAY_PAUSE -> playbackManager.isPlaying = !playbackManager.isPlaying
ACTION_LOOP -> playbackManager.loopMode = playbackManager.loopMode.increment() ACTION_INC_REPEAT_MODE -> playbackManager.repeatMode = playbackManager.repeatMode.increment()
ACTION_SHUFFLE -> playbackManager.reshuffle(!playbackManager.isShuffled) ACTION_INVERT_SHUFFLE -> playbackManager.reshuffle(!playbackManager.isShuffled)
ACTION_SKIP_PREV -> playbackManager.prev() ACTION_SKIP_PREV -> playbackManager.prev()
ACTION_SKIP_NEXT -> playbackManager.next() ACTION_SKIP_NEXT -> playbackManager.next()
ACTION_EXIT -> { ACTION_EXIT -> {
@ -492,8 +492,8 @@ class PlaybackService :
companion object { companion object {
private const val POS_POLL_INTERVAL = 1000L private const val POS_POLL_INTERVAL = 1000L
const val ACTION_LOOP = BuildConfig.APPLICATION_ID + ".action.LOOP" const val ACTION_INC_REPEAT_MODE = BuildConfig.APPLICATION_ID + ".action.LOOP"
const val ACTION_SHUFFLE = BuildConfig.APPLICATION_ID + ".action.SHUFFLE" const val ACTION_INVERT_SHUFFLE = BuildConfig.APPLICATION_ID + ".action.SHUFFLE"
const val ACTION_SKIP_PREV = BuildConfig.APPLICATION_ID + ".action.PREV" const val ACTION_SKIP_PREV = BuildConfig.APPLICATION_ID + ".action.PREV"
const val ACTION_PLAY_PAUSE = BuildConfig.APPLICATION_ID + ".action.PLAY_PAUSE" const val ACTION_PLAY_PAUSE = BuildConfig.APPLICATION_ID + ".action.PLAY_PAUSE"
const val ACTION_SKIP_NEXT = BuildConfig.APPLICATION_ID + ".action.NEXT" const val ACTION_SKIP_NEXT = BuildConfig.APPLICATION_ID + ".action.NEXT"

View file

@ -27,8 +27,8 @@ import com.google.android.exoplayer2.Player
import org.oxycblt.auxio.coil.loadBitmap import org.oxycblt.auxio.coil.loadBitmap
import org.oxycblt.auxio.music.MusicParent import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Song 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.PlaybackStateManager
import org.oxycblt.auxio.playback.state.RepeatMode
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
/** /**
@ -85,12 +85,12 @@ class PlaybackSessionConnector(
} }
override fun onSetRepeatMode(repeatMode: Int) { override fun onSetRepeatMode(repeatMode: Int) {
playbackManager.loopMode = playbackManager.repeatMode =
when (repeatMode) { when (repeatMode) {
PlaybackStateCompat.REPEAT_MODE_ALL -> LoopMode.ALL PlaybackStateCompat.REPEAT_MODE_ALL -> RepeatMode.ALL
PlaybackStateCompat.REPEAT_MODE_GROUP -> LoopMode.ALL PlaybackStateCompat.REPEAT_MODE_GROUP -> RepeatMode.ALL
PlaybackStateCompat.REPEAT_MODE_ONE -> LoopMode.TRACK PlaybackStateCompat.REPEAT_MODE_ONE -> RepeatMode.TRACK
else -> LoopMode.NONE else -> RepeatMode.NONE
} }
} }

View file

@ -119,10 +119,11 @@ class SettingsManager private constructor(context: Context) :
get() = prefs.getBoolean(KEY_PREV_REWIND, true) 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 val pauseOnRepeat: Boolean
get() = prefs.getBoolean(KEY_LOOP_PAUSE, false) get() = prefs.getBoolean(KEY_PAUSE_ON_REPEAT, false)
/** The current filter mode of the search tab */ /** The current filter mode of the search tab */
var searchFilterMode: DisplayMode? 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_SONG_PLAYBACK_MODE = "KEY_SONG_PLAY_MODE2"
const val KEY_KEEP_SHUFFLE = "KEY_KEEP_SHUFFLE" 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_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_SAVE_STATE = "auxio_save_state"
const val KEY_RELOAD = "auxio_reload" const val KEY_RELOAD = "auxio_reload"

View file

@ -21,7 +21,7 @@ import android.content.Context
import android.widget.RemoteViews import android.widget.RemoteViews
import androidx.annotation.LayoutRes import androidx.annotation.LayoutRes
import org.oxycblt.auxio.R 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.playback.system.PlaybackService
import org.oxycblt.auxio.util.newBroadcastIntent import org.oxycblt.auxio.util.newBroadcastIntent
import org.oxycblt.auxio.util.newMainIntent 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 { private fun createViews(context: Context, @LayoutRes layout: Int): RemoteViews {
val views = RemoteViews(context.packageName, layout) val views = RemoteViews(context.packageName, layout)
views.setOnClickPendingIntent(android.R.id.background, context.newMainIntent()) views.setOnClickPendingIntent(android.R.id.background, context.newMainIntent())
return views return views
} }
@ -141,10 +139,10 @@ private fun RemoteViews.applyFullControls(context: Context, state: WidgetState):
applyBasicControls(context, state) applyBasicControls(context, state)
setOnClickPendingIntent( setOnClickPendingIntent(
R.id.widget_loop, context.newBroadcastIntent(PlaybackService.ACTION_LOOP)) R.id.widget_repeat, context.newBroadcastIntent(PlaybackService.ACTION_INC_REPEAT_MODE))
setOnClickPendingIntent( 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 // Like notifications, use the remote variants of icons since we really don't want to hack
// indicators. // indicators.
@ -154,15 +152,15 @@ private fun RemoteViews.applyFullControls(context: Context, state: WidgetState):
else -> R.drawable.ic_remote_shuffle_off else -> R.drawable.ic_remote_shuffle_off
} }
val loopRes = val repeatRes =
when (state.loopMode) { when (state.repeatMode) {
LoopMode.NONE -> R.drawable.ic_remote_loop_off RepeatMode.NONE -> R.drawable.ic_remote_repeat_off
LoopMode.ALL -> R.drawable.ic_loop_on RepeatMode.ALL -> R.drawable.ic_repeat_on
LoopMode.TRACK -> R.drawable.ic_loop_one RepeatMode.TRACK -> R.drawable.ic_repeat_one
} }
setImageViewResource(R.id.widget_shuffle, shuffleRes) setImageViewResource(R.id.widget_shuffle, shuffleRes)
setImageViewResource(R.id.widget_loop, loopRes) setImageViewResource(R.id.widget_repeat, repeatRes)
return this return this
} }

View file

@ -20,8 +20,8 @@ package org.oxycblt.auxio.widgets
import android.content.Context import android.content.Context
import org.oxycblt.auxio.music.MusicParent import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Song 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.PlaybackStateManager
import org.oxycblt.auxio.playback.state.RepeatMode
import org.oxycblt.auxio.settings.SettingsManager import org.oxycblt.auxio.settings.SettingsManager
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
@ -82,7 +82,7 @@ class WidgetController(private val context: Context) :
widget.update(context, playbackManager) widget.update(context, playbackManager)
} }
override fun onLoopModeChanged(loopMode: LoopMode) { override fun onRepeatChanged(repeatMode: RepeatMode) {
widget.update(context, playbackManager) widget.update(context, playbackManager)
} }

View file

@ -74,7 +74,7 @@ class WidgetProvider : AppWidgetProvider() {
bitmap, bitmap,
playbackManager.isPlaying, playbackManager.isPlaying,
playbackManager.isShuffled, playbackManager.isShuffled,
playbackManager.loopMode) playbackManager.repeatMode)
// Map each widget form to the cells where it would look at least okay. // Map each widget form to the cells where it would look at least okay.
val views = val views =

View file

@ -19,7 +19,7 @@ package org.oxycblt.auxio.widgets
import android.graphics.Bitmap import android.graphics.Bitmap
import org.oxycblt.auxio.music.Song 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 * An immutable condensed variant of the current playback state, used so that PlaybackStateManager
@ -30,5 +30,5 @@ data class WidgetState(
val albumArt: Bitmap?, val albumArt: Bitmap?,
val isPlaying: Boolean, val isPlaying: Boolean,
val isShuffled: Boolean, val isShuffled: Boolean,
val loopMode: LoopMode, val repeatMode: RepeatMode,
) )

View file

@ -118,12 +118,12 @@
tools:text="16:16" /> tools:text="16:16" />
<org.oxycblt.auxio.playback.PlaybackButton <org.oxycblt.auxio.playback.PlaybackButton
android:id="@+id/playback_loop" android:id="@+id/playback_repeat"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/spacing_medium" android:layout_marginStart="@dimen/spacing_medium"
android:contentDescription="@string/desc_change_loop" android:contentDescription="@string/desc_change_repeat"
android:src="@drawable/ic_loop" android:src="@drawable/ic_repeat"
app:hasIndicator="true" app:hasIndicator="true"
app:layout_constraintBottom_toBottomOf="@+id/playback_skip_prev" app:layout_constraintBottom_toBottomOf="@+id/playback_skip_prev"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -137,7 +137,7 @@
android:src="@drawable/ic_skip_prev" android:src="@drawable/ic_skip_prev"
app:layout_constraintBottom_toBottomOf="@+id/playback_play_pause" app:layout_constraintBottom_toBottomOf="@+id/playback_play_pause"
app:layout_constraintEnd_toStartOf="@+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" /> app:layout_constraintTop_toTopOf="@+id/playback_play_pause" />
<com.google.android.material.floatingactionbutton.FloatingActionButton <com.google.android.material.floatingactionbutton.FloatingActionButton

View file

@ -116,12 +116,12 @@
tools:text="16:16" /> tools:text="16:16" />
<org.oxycblt.auxio.playback.PlaybackButton <org.oxycblt.auxio.playback.PlaybackButton
android:id="@+id/playback_loop" android:id="@+id/playback_repeat"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/spacing_large" android:layout_marginEnd="@dimen/spacing_large"
android:contentDescription="@string/desc_change_loop" android:contentDescription="@string/desc_change_repeat"
android:src="@drawable/ic_loop" android:src="@drawable/ic_repeat"
app:hasIndicator="true" app:hasIndicator="true"
app:layout_constraintBottom_toBottomOf="@+id/playback_skip_prev" app:layout_constraintBottom_toBottomOf="@+id/playback_skip_prev"
app:layout_constraintEnd_toStartOf="@+id/playback_skip_prev" app:layout_constraintEnd_toStartOf="@+id/playback_skip_prev"

View file

@ -105,12 +105,12 @@
tools:text="16:16" /> tools:text="16:16" />
<org.oxycblt.auxio.playback.PlaybackButton <org.oxycblt.auxio.playback.PlaybackButton
android:id="@+id/playback_loop" android:id="@+id/playback_repeat"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/spacing_mid_large" android:layout_marginEnd="@dimen/spacing_mid_large"
android:contentDescription="@string/desc_change_loop" android:contentDescription="@string/desc_change_repeat"
android:src="@drawable/ic_loop" android:src="@drawable/ic_repeat"
app:hasIndicator="true" app:hasIndicator="true"
app:layout_constraintBottom_toBottomOf="@+id/playback_skip_prev" app:layout_constraintBottom_toBottomOf="@+id/playback_skip_prev"
app:layout_constraintEnd_toStartOf="@+id/playback_skip_prev" app:layout_constraintEnd_toStartOf="@+id/playback_skip_prev"

View file

@ -118,12 +118,12 @@
tools:text="16:16" /> tools:text="16:16" />
<org.oxycblt.auxio.playback.PlaybackButton <org.oxycblt.auxio.playback.PlaybackButton
android:id="@+id/playback_loop" android:id="@+id/playback_repeat"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/spacing_medium" android:layout_marginStart="@dimen/spacing_medium"
android:contentDescription="@string/desc_change_loop" android:contentDescription="@string/desc_change_repeat"
android:src="@drawable/ic_loop" android:src="@drawable/ic_repeat"
app:hasIndicator="true" app:hasIndicator="true"
app:layout_constraintBottom_toBottomOf="@+id/playback_skip_prev" app:layout_constraintBottom_toBottomOf="@+id/playback_skip_prev"
app:layout_constraintHorizontal_chainStyle="packed" app:layout_constraintHorizontal_chainStyle="packed"
@ -138,7 +138,7 @@
android:src="@drawable/ic_skip_prev" android:src="@drawable/ic_skip_prev"
app:layout_constraintBottom_toBottomOf="@+id/playback_play_pause" app:layout_constraintBottom_toBottomOf="@+id/playback_play_pause"
app:layout_constraintEnd_toStartOf="@+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" /> app:layout_constraintTop_toTopOf="@+id/playback_play_pause" />
<com.google.android.material.floatingactionbutton.FloatingActionButton <com.google.android.material.floatingactionbutton.FloatingActionButton

View file

@ -102,12 +102,12 @@
tools:text="16:16" /> tools:text="16:16" />
<org.oxycblt.auxio.playback.PlaybackButton <org.oxycblt.auxio.playback.PlaybackButton
android:id="@+id/playback_loop" android:id="@+id/playback_repeat"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/spacing_medium" android:layout_marginStart="@dimen/spacing_medium"
android:contentDescription="@string/desc_change_loop" android:contentDescription="@string/desc_change_repeat"
android:src="@drawable/ic_loop" android:src="@drawable/ic_repeat"
app:hasIndicator="true" app:hasIndicator="true"
app:layout_constraintBottom_toBottomOf="@+id/playback_skip_prev" app:layout_constraintBottom_toBottomOf="@+id/playback_skip_prev"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -121,7 +121,7 @@
android:src="@drawable/ic_skip_prev" android:src="@drawable/ic_skip_prev"
app:layout_constraintBottom_toBottomOf="@+id/playback_play_pause" app:layout_constraintBottom_toBottomOf="@+id/playback_play_pause"
app:layout_constraintEnd_toStartOf="@+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" /> app:layout_constraintTop_toTopOf="@+id/playback_play_pause" />
<com.google.android.material.floatingactionbutton.FloatingActionButton <com.google.android.material.floatingactionbutton.FloatingActionButton

View file

@ -75,13 +75,13 @@
android:layout_marginTop="@dimen/spacing_small"> android:layout_marginTop="@dimen/spacing_small">
<android.widget.ImageButton <android.widget.ImageButton
android:id="@+id/widget_loop" android:id="@+id/widget_repeat"
style="@style/Widget.Auxio.PlaybackButton.AppWidget" style="@style/Widget.Auxio.PlaybackButton.AppWidget"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:contentDescription="@string/desc_change_loop" android:contentDescription="@string/desc_change_repeat"
android:src="@drawable/ic_loop" /> android:src="@drawable/ic_repeat" />
<android.widget.ImageButton <android.widget.ImageButton
android:id="@+id/widget_skip_prev" android:id="@+id/widget_skip_prev"

View file

@ -62,13 +62,13 @@
android:paddingBottom="@dimen/spacing_small"> android:paddingBottom="@dimen/spacing_small">
<android.widget.ImageButton <android.widget.ImageButton
android:id="@+id/widget_loop" android:id="@+id/widget_repeat"
style="@style/Widget.Auxio.PlaybackButton.AppWidget" style="@style/Widget.Auxio.PlaybackButton.AppWidget"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:contentDescription="@string/desc_change_loop" android:contentDescription="@string/desc_change_repeat"
android:src="@drawable/ic_loop" /> android:src="@drawable/ic_repeat" />
<android.widget.ImageButton <android.widget.ImageButton
android:id="@+id/widget_skip_prev" android:id="@+id/widget_skip_prev"

View file

@ -77,7 +77,7 @@
<string name="set_round_covers">اغلفة البوم مدورة</string> <string name="set_round_covers">اغلفة البوم مدورة</string>
<string name="set_round_covers_desc">جعل اغلفة الابومات ذات زوايا مدورة</string> <string name="set_round_covers_desc">جعل اغلفة الابومات ذات زوايا مدورة</string>
<string name="set_alt_action">استخدام نشاط بديل للإشعار</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_alt_shuffle">تفضيل نشاط الخلط</string>
<string name="set_audio">صوتيات</string> <string name="set_audio">صوتيات</string>
@ -93,8 +93,8 @@
<string name="set_keep_shuffle_desc">إبقاء وضع الخلط عند تشغيل اغنية جديدة</string> <string name="set_keep_shuffle_desc">إبقاء وضع الخلط عند تشغيل اغنية جديدة</string>
<string name="set_rewind_prev">تشجيع قبل التخطي للخلف</string> <string name="set_rewind_prev">تشجيع قبل التخطي للخلف</string>
<string name="set_rewind_prev_desc">ترجيع قبل التخطي إلى الاغنية السابقة</string> <string name="set_rewind_prev_desc">ترجيع قبل التخطي إلى الاغنية السابقة</string>
<string name="set_loop_pause">ايقاف مؤقت عند التكرار</string> <string name="set_repeat_pause">ايقاف مؤقت عند التكرار</string>
<string name="set_loop_pause_desc">ايقاف مؤقت عند تكرار تشغيل اغنية</string> <string name="set_repeat_pause_desc">ايقاف مؤقت عند تكرار تشغيل اغنية</string>
<string name="set_content">محتوى</string> <string name="set_content">محتوى</string>
<string name="set_save">حفظ حالة التشغيل</string> <string name="set_save">حفظ حالة التشغيل</string>
@ -118,7 +118,7 @@
<string name="desc_play_pause">تشغيل او ايقاف مؤقت</string> <string name="desc_play_pause">تشغيل او ايقاف مؤقت</string>
<string name="desc_skip_next">تخطي للأغنية التالية</string> <string name="desc_skip_next">تخطي للأغنية التالية</string>
<string name="desc_skip_prev">تخطي للاغنية الاخيرة</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">تشغيل او اطفاء الخلط</string>
<string name="desc_shuffle_all">خلط جميع الاغاني</string> <string name="desc_shuffle_all">خلط جميع الاغاني</string>

View file

@ -62,7 +62,7 @@
<string name="set_quality_covers">"Ignorovat obaly MediaStore"</string> <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_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_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_alt_shuffle">"Preferovat akci náhodného přehrávání"</string>
<string name="set_audio">"Zvuk"</string> <string name="set_audio">"Zvuk"</string>
<string name="set_behavior">"Chování"</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_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">"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_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_repeat_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_desc">"Pozastavit při opakování skladby"</string>
<string name="set_content">"Obsah"</string> <string name="set_content">"Obsah"</string>
<string name="set_save">"Uložit stav přehrávání"</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> <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_play_pause">"Přehrát nebo pozastavit"</string>
<string name="desc_skip_next">"Přeskočit na další skladbu"</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_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_shuffle">"Zapnout nebo vypnout náhodné"</string>
<string name="desc_queue_handle">"Přesunout skladbu ve frontě"</string> <string name="desc_queue_handle">"Přesunout skladbu ve frontě"</string>
<string name="desc_clear_search">"Vymazat vyhledávání"</string> <string name="desc_clear_search">"Vymazat vyhledávání"</string>

View file

@ -67,7 +67,7 @@
<string name="set_round_covers">Abgerundete Cover</string> <string name="set_round_covers">Abgerundete Cover</string>
<string name="set_round_covers_desc">Rundet Ecken der Cover ab</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_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_alt_shuffle">Zufällig-Aktionstaste bevorzugen</string>
<string name="set_audio">Audio</string> <string name="set_audio">Audio</string>
@ -109,7 +109,7 @@
<string name="desc_play_pause">Abspielen oder Pausieren</string> <string name="desc_play_pause">Abspielen oder Pausieren</string>
<string name="desc_skip_prev">Zum letzten Lied springen</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_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> <string name="desc_clear_search">Suchanfrage löschen</string>
@ -159,8 +159,8 @@
<string name="lbl_sort_year">Jahr</string> <string name="lbl_sort_year">Jahr</string>
<string name="set_black_mode">Schwarzes Thema</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_black_mode_desc">Ein schwarzes Thema für das dunkle verwenden</string>
<string name="set_loop_pause">Pause bei Wiederholung</string> <string name="set_repeat_pause">Pause bei Wiederholung</string>
<string name="set_loop_pause_desc">Pausiert, wenn ein Song wiederholt wird</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_shuffle">Zufällig an- oder ausschalten</string>
<string name="desc_queue_handle">Lied in der Warteschlange verschieben</string> <string name="desc_queue_handle">Lied in der Warteschlange verschieben</string>
<string name="desc_blacklist_delete">Ausgeschlossenes Verzechnis entfernen</string> <string name="desc_blacklist_delete">Ausgeschlossenes Verzechnis entfernen</string>

View file

@ -77,7 +77,7 @@
<string name="set_round_covers">Carátulas redondeadas</string> <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_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_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_alt_shuffle">Preferir acción de mezcla</string>
<string name="set_audio">Sonido</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_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">Rebobinar atrás</string>
<string name="set_rewind_prev_desc">Rebobinar al saltar a la canción anterior</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_repeat_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_desc">Pausa cuando se repite una canción</string>
<string name="set_content">Contenido</string> <string name="set_content">Contenido</string>
<string name="set_save">Guardar estado de reproducción</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_play_pause">Reproducir o pausar</string>
<string name="desc_skip_next">Saltar a la siguiente canción</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_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">Act/des mezcla</string>
<string name="desc_shuffle_all">Mezclar todo</string> <string name="desc_shuffle_all">Mezclar todo</string>

View file

@ -66,7 +66,7 @@
<string name="set_quality_covers">Negeer Mediaopslag illustraties</string> <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_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_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_alt_shuffle">Voorkeur aan shuffle actie</string>
<string name="set_audio">Audio</string> <string name="set_audio">Audio</string>
@ -100,7 +100,7 @@
<string name="desc_play_pause">Afspelen/Pauzeren</string> <string name="desc_play_pause">Afspelen/Pauzeren</string>
<string name="desc_skip_next">Naar volgend nummer gaan</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_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_clear_search">Zoekopdracht wissen</string>
<string name="desc_blacklist_delete">Verwijder uitgesloten map</string> <string name="desc_blacklist_delete">Verwijder uitgesloten map</string>

View file

@ -77,7 +77,7 @@
<string name="set_round_covers">Скруглённые обложки</string> <string name="set_round_covers">Скруглённые обложки</string>
<string name="set_round_covers_desc">Показывать обложки со скруглёнными краями</string> <string name="set_round_covers_desc">Показывать обложки со скруглёнными краями</string>
<string name="set_alt_action">Кнопка в уведомлении</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_alt_shuffle">Режим перемешивания</string>
<string name="set_audio">Звук</string> <string name="set_audio">Звук</string>
@ -95,8 +95,8 @@
<string name="set_keep_shuffle_desc">Запоминать режим перемешивания для новых треков</string> <string name="set_keep_shuffle_desc">Запоминать режим перемешивания для новых треков</string>
<string name="set_rewind_prev">Сначала перемотать трек</string> <string name="set_rewind_prev">Сначала перемотать трек</string>
<string name="set_rewind_prev_desc">Перематывать трек перед возвратом к предыдущему треку</string> <string name="set_rewind_prev_desc">Перематывать трек перед возвратом к предыдущему треку</string>
<string name="set_loop_pause">Пауза при повторе</string> <string name="set_repeat_pause">Пауза при повторе</string>
<string name="set_loop_pause_desc">Ставить на паузу при повторе трека</string> <string name="set_repeat_pause_desc">Ставить на паузу при повторе трека</string>
<string name="set_content">Библиотека</string> <string name="set_content">Библиотека</string>
<string name="set_save">Запоминать позицию</string> <string name="set_save">Запоминать позицию</string>
@ -123,7 +123,7 @@
<string name="desc_play_pause">Играть или остановить</string> <string name="desc_play_pause">Играть или остановить</string>
<string name="desc_skip_next">Перейти к следующему треку</string> <string name="desc_skip_next">Перейти к следующему треку</string>
<string name="desc_skip_prev">Вернуться к предыдущему треку</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">Перемешивание</string>
<string name="desc_shuffle_all">Перемешать все треки</string> <string name="desc_shuffle_all">Перемешать все треки</string>

View file

@ -76,7 +76,7 @@
<string name="set_round_covers">专辑封面圆角</string> <string name="set_round_covers">专辑封面圆角</string>
<string name="set_round_covers_desc">使用圆角设计的专辑封面</string> <string name="set_round_covers_desc">使用圆角设计的专辑封面</string>
<string name="set_alt_action">使用替代通知操作方案</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_alt_shuffle">偏好随机播放操作</string>
<string name="set_audio">音频</string> <string name="set_audio">音频</string>
@ -93,8 +93,8 @@
<string name="set_keep_shuffle_desc">播放新曲目时保留随机播放模式</string> <string name="set_keep_shuffle_desc">播放新曲目时保留随机播放模式</string>
<string name="set_rewind_prev">切换上一曲前先倒带</string> <string name="set_rewind_prev">切换上一曲前先倒带</string>
<string name="set_rewind_prev_desc">切换至上一首歌曲前先进行倒带</string> <string name="set_rewind_prev_desc">切换至上一首歌曲前先进行倒带</string>
<string name="set_loop_pause">重复播放前暂停</string> <string name="set_repeat_pause">重复播放前暂停</string>
<string name="set_loop_pause_desc">曲目重复播放前暂停</string> <string name="set_repeat_pause_desc">曲目重复播放前暂停</string>
<string name="set_content">内容</string> <string name="set_content">内容</string>
<string name="set_save">保存播放状态</string> <string name="set_save">保存播放状态</string>
@ -123,7 +123,7 @@
<string name="desc_play_pause">播放或暂停</string> <string name="desc_play_pause">播放或暂停</string>
<string name="desc_skip_next">切换到下一首歌</string> <string name="desc_skip_next">切换到下一首歌</string>
<string name="desc_skip_prev">切换到上一首歌</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">开启或关闭随机播放模式</string>
<string name="desc_shuffle_all">随机播放所有曲目</string> <string name="desc_shuffle_all">随机播放所有曲目</string>

View file

@ -76,7 +76,7 @@
<string name="set_round_covers">Rounded album covers</string> <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_round_covers_desc">Use album covers with rounded corners</string>
<string name="set_alt_action">Use alternate notification action</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_alt_shuffle">Prefer shuffle action</string>
<string name="set_audio">Audio</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_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">Rewind before skipping back</string>
<string name="set_rewind_prev_desc">Rewind before skipping to the previous song</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_repeat_pause">Pause on repeat</string>
<string name="set_loop_pause_desc">Pause when a song repeats</string> <string name="set_repeat_pause_desc">Pause when a song repeats</string>
<string name="set_content">Content</string> <string name="set_content">Content</string>
<string name="set_save">Save playback state</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_play_pause">Play or Pause</string>
<string name="desc_skip_next">Skip to next song</string> <string name="desc_skip_next">Skip to next song</string>
<string name="desc_skip_prev">Skip to last 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">Turn shuffle on or off</string>
<string name="desc_shuffle_all">Shuffle all songs</string> <string name="desc_shuffle_all">Shuffle all songs</string>

View file

@ -68,7 +68,7 @@
app:defaultValue="false" app:defaultValue="false"
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:key="KEY_ALT_NOTIF_ACTION" 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:summaryOn="@string/set_alt_shuffle"
app:title="@string/set_alt_action" /> app:title="@string/set_alt_action" />
@ -129,8 +129,8 @@
app:defaultValue="false" app:defaultValue="false"
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:key="KEY_LOOP_PAUSE" app:key="KEY_LOOP_PAUSE"
app:summary="@string/set_loop_pause_desc" app:summary="@string/set_repeat_pause_desc"
app:title="@string/set_loop_pause" /> app:title="@string/set_repeat_pause" />
</PreferenceCategory> </PreferenceCategory>

View file

@ -92,7 +92,7 @@ to a name that can be used in UIs.
Other data types represent a specific UI configuration or state: Other data types represent a specific UI configuration or state:
- Sealed classes like `Sort` contain data with them that can be modified. - 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: 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. - `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.