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 */
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

View file

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

View file

@ -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)
}
}

View file

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

View file

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

View file

@ -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) {}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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)
}

View file

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

View file

@ -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,
)

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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:
- 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.