ui: add basic bar actions [#108]

Add the ability to customize the bar action to the repeat mode or
shuffle state.

This is a much smaller implementation than what I planned, mostly
because other options did not make much sense (queue) or were
superceded by better options (clear state).

Resolves #108.
This commit is contained in:
OxygenCobalt 2022-08-10 13:14:19 -06:00
parent ce2e950a9b
commit 68ca9973df
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
25 changed files with 197 additions and 109 deletions

View file

@ -3,9 +3,12 @@
## dev
#### What's New
- Added basic equalizer support in external apps like Wavelet
- Added basic equalizer support in external apps like Wavelet [#211]
- Detail UI now displays the type of item shown (ex. the release type)
#### What's Improved
- Queue now scrolls to currently playing song instead of the song after it
#### What's Fixed
- Fixed incorrect font being used in the queue title
- Fixed missing fast scroll indicator with date added scrolling

View file

@ -116,4 +116,11 @@ object IntegerTable {
const val REPLAY_GAIN_MODE_ALBUM = 0xA112
/** ReplayGainMode.Dynamic */
const val REPLAY_GAIN_MODE_DYNAMIC = 0xA113
/** BarAction.Next */
const val BAR_ACTION_NEXT = 0xA119
/** BarAction.Repeat */
const val BAR_ACTION_REPEAT = 0xA11A
/** BarAction.Shuffle */
const val BAR_ACTION_SHUFFLE = 0xA11B
}

View file

@ -42,7 +42,7 @@ import org.oxycblt.auxio.util.logEOrThrow
*/
class AlbumListFragment : HomeListFragment<Album>() {
private val homeAdapter = AlbumAdapter(this)
private val formatterSb = StringBuilder(50)
private val formatterSb = StringBuilder(32)
private val formatter = Formatter(formatterSb)
override fun onBindingCreated(binding: FragmentHomeListBinding, savedInstanceState: Bundle?) {

View file

@ -20,14 +20,18 @@ package org.oxycblt.auxio.playback
import android.os.Bundle
import android.view.LayoutInflater
import androidx.fragment.app.activityViewModels
import org.oxycblt.auxio.IntegerTable
import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.FragmentPlaybackBarBinding
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.playback.state.RepeatMode
import org.oxycblt.auxio.settings.Settings
import org.oxycblt.auxio.ui.MainNavigationAction
import org.oxycblt.auxio.ui.NavigationViewModel
import org.oxycblt.auxio.ui.fragment.ViewBindingFragment
import org.oxycblt.auxio.util.androidActivityViewModels
import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.getAttrColorCompat
import org.oxycblt.auxio.util.getColorCompat
/**
@ -46,6 +50,8 @@ class PlaybackBarFragment : ViewBindingFragment<FragmentPlaybackBarBinding>() {
binding: FragmentPlaybackBarBinding,
savedInstanceState: Bundle?
) {
val context = requireContext()
binding.root.apply {
setOnClickListener { navModel.mainNavigateTo(MainNavigationAction.Expand) }
@ -58,11 +64,39 @@ class PlaybackBarFragment : ViewBindingFragment<FragmentPlaybackBarBinding>() {
// Load the track color in manually as it's unclear whether the track actually supports
// using a ColorStateList in the resources
binding.playbackProgressBar.trackColor =
requireContext().getColorCompat(R.color.sel_track).defaultColor
context.getColorCompat(R.color.sel_track).defaultColor
binding.playbackPlayPause.setOnClickListener { playbackModel.invertPlaying() }
binding.playbackSkipNext.setOnClickListener { playbackModel.next() }
// Update the secondary action to match the setting.
when (Settings(context).barAction) {
BarAction.NEXT -> {
binding.playbackSecondaryAction.apply {
setIconResource(R.drawable.ic_skip_next_24)
contentDescription = getString(R.string.desc_skip_next)
iconTint = context.getAttrColorCompat(R.attr.colorOnSurfaceVariant)
setOnClickListener { playbackModel.next() }
}
}
BarAction.REPEAT -> {
binding.playbackSecondaryAction.apply {
contentDescription = getString(R.string.desc_change_repeat)
iconTint = context.getColorCompat(R.color.sel_accented)
setOnClickListener { playbackModel.incrementRepeatMode() }
collectImmediately(playbackModel.repeatMode, ::updateRepeat)
}
}
BarAction.SHUFFLE -> {
binding.playbackSecondaryAction.apply {
setIconResource(R.drawable.sel_shuffle_state_24)
contentDescription = getString(R.string.desc_shuffle)
iconTint = context.getColorCompat(R.color.sel_accented)
setOnClickListener { playbackModel.invertShuffled() }
collectImmediately(playbackModel.isShuffled, ::updateShuffled)
}
}
}
// -- VIEWMODEL SETUP ---
@ -86,7 +120,36 @@ class PlaybackBarFragment : ViewBindingFragment<FragmentPlaybackBarBinding>() {
requireBinding().playbackPlayPause.isActivated = isPlaying
}
private fun updateRepeat(repeatMode: RepeatMode) {
requireBinding().playbackSecondaryAction.apply {
setIconResource(repeatMode.icon)
isActivated = repeatMode != RepeatMode.NONE
}
}
private fun updateShuffled(isShuffled: Boolean) {
requireBinding().playbackSecondaryAction.isActivated = isShuffled
}
private fun updatePosition(position: Long) {
requireBinding().playbackProgressBar.progress = position.toInt()
}
}
/** Represents the action that should be shown on the playback bar. */
enum class BarAction {
NEXT,
REPEAT,
SHUFFLE;
companion object {
/** Convert an int [code] into an instance, or null if it isn't valid. */
fun fromIntCode(code: Int) =
when (code) {
IntegerTable.BAR_ACTION_NEXT -> NEXT
IntegerTable.BAR_ACTION_REPEAT -> REPEAT
IntegerTable.BAR_ACTION_SHUFFLE -> SHUFFLE
else -> null
}
}
}

View file

@ -34,7 +34,6 @@ import org.oxycblt.auxio.ui.NavigationViewModel
import org.oxycblt.auxio.ui.fragment.ViewBindingFragment
import org.oxycblt.auxio.util.androidActivityViewModels
import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.getDrawableCompat
import org.oxycblt.auxio.util.systemBarInsetsCompat
/**
@ -158,15 +157,8 @@ class PlaybackPanelFragment :
}
private fun updateRepeat(repeatMode: RepeatMode) {
val iconRes =
when (repeatMode) {
RepeatMode.NONE -> R.drawable.ic_repeat_off_24
RepeatMode.ALL -> R.drawable.ic_repeat_on_24
RepeatMode.TRACK -> R.drawable.ic_repeat_one_24
}
requireBinding().playbackRepeat.apply {
icon = requireContext().getDrawableCompat(iconRes)
setIconResource(repeatMode.icon)
isActivated = repeatMode != RepeatMode.NONE
}
}

View file

@ -18,6 +18,7 @@
package org.oxycblt.auxio.playback.state
import org.oxycblt.auxio.IntegerTable
import org.oxycblt.auxio.R
/**
* Enum that determines the playback repeat mode.
@ -36,6 +37,15 @@ enum class RepeatMode {
TRACK -> NONE
}
/** The icon representing this particular mode. */
val icon: Int
get() =
when (this) {
NONE -> R.drawable.ic_repeat_off_24
ALL -> R.drawable.ic_repeat_on_24
TRACK -> R.drawable.ic_repeat_one_24
}
/** The integer code representing this particular mode. */
val intCode: Int
get() =

View file

@ -117,14 +117,7 @@ class NotificationComponent(private val context: Context, sessionToken: MediaSes
context: Context,
repeatMode: RepeatMode
): NotificationCompat.Action {
val drawableRes =
when (repeatMode) {
RepeatMode.NONE -> R.drawable.ic_repeat_off_24
RepeatMode.ALL -> R.drawable.ic_repeat_on_24
RepeatMode.TRACK -> R.drawable.ic_repeat_one_24
}
return buildAction(context, PlaybackService.ACTION_INC_REPEAT_MODE, drawableRes)
return buildAction(context, PlaybackService.ACTION_INC_REPEAT_MODE, repeatMode.icon)
}
private fun buildShuffleAction(

View file

@ -203,19 +203,15 @@ class PlaybackService :
}
override fun onPlaybackStateChanged(state: Int) {
when (state) {
Player.STATE_ENDED -> {
logD("State ended")
if (playbackManager.repeatMode == RepeatMode.TRACK) {
playbackManager.rewind()
if (settings.pauseOnRepeat) {
playbackManager.isPlaying = false
}
} else {
playbackManager.next()
if (state == Player.STATE_ENDED) {
if (playbackManager.repeatMode == RepeatMode.TRACK) {
playbackManager.rewind()
if (settings.pauseOnRepeat) {
playbackManager.isPlaying = false
}
} else {
playbackManager.next()
}
else -> {}
}
}
@ -274,7 +270,7 @@ class PlaybackService :
player.prepare()
if (!openAudioEffectSession) {
// Wavelet does not like it if you start an audio effect session without having
// Android does not like it if you start an audio effect session without having
// something within your player buffer. Make sure we only start one when we load
// a song.
broadcastAudioEffectAction(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION)

View file

@ -27,6 +27,7 @@ import org.oxycblt.auxio.R
import org.oxycblt.auxio.home.tabs.Tab
import org.oxycblt.auxio.music.Directory
import org.oxycblt.auxio.music.dirs.MusicDirs
import org.oxycblt.auxio.playback.BarAction
import org.oxycblt.auxio.playback.replaygain.ReplayGainMode
import org.oxycblt.auxio.playback.replaygain.ReplayGainPreAmp
import org.oxycblt.auxio.playback.state.PlaybackMode
@ -91,13 +92,6 @@ class Settings(private val context: Context, private val callback: Callback? = n
}
}
/**
* Whether to display the RepeatMode or the shuffle status on the notification. False if repeat,
* true if shuffle.
*/
val useAltNotifAction: Boolean
get() = inner.getBoolean(context.getString(R.string.set_key_alt_notif_action), false)
/** The current library tabs preferred by the user. */
var libTabs: Array<Tab>
get() =
@ -123,6 +117,19 @@ class Settings(private val context: Context, private val callback: Callback? = n
val roundMode: Boolean
get() = inner.getBoolean(context.getString(R.string.set_key_round_mode), false)
/** Which action to display on the playback bar. */
val barAction: BarAction
get() =
BarAction.fromIntCode(inner.getInt(context.getString(R.string.set_key_bar_action), -1))
?: BarAction.NEXT
/**
* Whether to display the RepeatMode or the shuffle status on the notification. False if repeat,
* true if shuffle.
*/
val useAltNotifAction: Boolean
get() = inner.getBoolean(context.getString(R.string.set_key_alt_notif_action), false)
/** Whether to resume playback when a headset is connected (may not work well in all cases) */
val headsetAutoplay: Boolean
get() = inner.getBoolean(context.getString(R.string.set_key_headset_autoplay), false)
@ -131,7 +138,7 @@ class Settings(private val context: Context, private val callback: Callback? = n
val replayGainMode: ReplayGainMode
get() =
ReplayGainMode.fromIntCode(
inner.getInt(context.getString(R.string.set_key_replay_gain), Int.MIN_VALUE))
inner.getInt(context.getString(R.string.set_key_replay_gain), -1))
?: ReplayGainMode.OFF
/** The current ReplayGain pre-amp configuration */
@ -152,8 +159,7 @@ class Settings(private val context: Context, private val callback: Callback? = n
val libPlaybackMode: PlaybackMode
get() =
PlaybackMode.fromInt(
inner.getInt(
context.getString(R.string.set_key_library_song_playback_mode), Int.MIN_VALUE))
inner.getInt(context.getString(R.string.set_key_library_song_playback_mode), -1))
?: PlaybackMode.ALL_SONGS
/**
@ -163,8 +169,7 @@ class Settings(private val context: Context, private val callback: Callback? = n
val detailPlaybackMode: PlaybackMode?
get() =
PlaybackMode.fromInt(
inner.getInt(
context.getString(R.string.set_key_detail_song_playback_mode), Int.MIN_VALUE))
inner.getInt(context.getString(R.string.set_key_detail_song_playback_mode), -1))
/** Whether shuffle should stay on when a new song is selected. */
val keepShuffle: Boolean
@ -214,14 +219,11 @@ class Settings(private val context: Context, private val callback: Callback? = n
/** The current filter mode of the search tab */
var searchFilterMode: DisplayMode?
get() =
DisplayMode.fromInt(
inner.getInt(context.getString(R.string.set_key_search_filter), Int.MIN_VALUE))
DisplayMode.fromInt(inner.getInt(context.getString(R.string.set_key_search_filter), -1))
set(value) {
logD(value)
inner.edit {
putInt(
context.getString(R.string.set_key_search_filter),
value?.intCode ?: Int.MIN_VALUE)
putInt(context.getString(R.string.set_key_search_filter), value?.intCode ?: -1)
apply()
}
}
@ -229,8 +231,7 @@ class Settings(private val context: Context, private val callback: Callback? = n
/** The song sort mode on HomeFragment */
var libSongSort: Sort
get() =
Sort.fromIntCode(
inner.getInt(context.getString(R.string.set_key_lib_songs_sort), Int.MIN_VALUE))
Sort.fromIntCode(inner.getInt(context.getString(R.string.set_key_lib_songs_sort), -1))
?: Sort(Sort.Mode.ByName, true)
set(value) {
inner.edit {
@ -242,8 +243,7 @@ class Settings(private val context: Context, private val callback: Callback? = n
/** The album sort mode on HomeFragment */
var libAlbumSort: Sort
get() =
Sort.fromIntCode(
inner.getInt(context.getString(R.string.set_key_lib_albums_sort), Int.MIN_VALUE))
Sort.fromIntCode(inner.getInt(context.getString(R.string.set_key_lib_albums_sort), -1))
?: Sort(Sort.Mode.ByName, true)
set(value) {
inner.edit {
@ -255,8 +255,7 @@ class Settings(private val context: Context, private val callback: Callback? = n
/** The artist sort mode on HomeFragment */
var libArtistSort: Sort
get() =
Sort.fromIntCode(
inner.getInt(context.getString(R.string.set_key_lib_artists_sort), Int.MIN_VALUE))
Sort.fromIntCode(inner.getInt(context.getString(R.string.set_key_lib_artists_sort), -1))
?: Sort(Sort.Mode.ByName, true)
set(value) {
inner.edit {
@ -268,8 +267,7 @@ class Settings(private val context: Context, private val callback: Callback? = n
/** The genre sort mode on HomeFragment */
var libGenreSort: Sort
get() =
Sort.fromIntCode(
inner.getInt(context.getString(R.string.set_key_lib_genres_sort), Int.MIN_VALUE))
Sort.fromIntCode(inner.getInt(context.getString(R.string.set_key_lib_genres_sort), -1))
?: Sort(Sort.Mode.ByName, true)
set(value) {
inner.edit {
@ -283,8 +281,7 @@ class Settings(private val context: Context, private val callback: Callback? = n
get() {
var sort =
Sort.fromIntCode(
inner.getInt(
context.getString(R.string.set_key_detail_album_sort), Int.MIN_VALUE))
inner.getInt(context.getString(R.string.set_key_detail_album_sort), -1))
?: Sort(Sort.Mode.ByDisc, true)
// Correct legacy album sort modes to Disc
@ -305,7 +302,7 @@ class Settings(private val context: Context, private val callback: Callback? = n
var detailArtistSort: Sort
get() =
Sort.fromIntCode(
inner.getInt(context.getString(R.string.set_key_detail_artist_sort), Int.MIN_VALUE))
inner.getInt(context.getString(R.string.set_key_detail_artist_sort), -1))
?: Sort(Sort.Mode.ByYear, false)
set(value) {
inner.edit {
@ -318,7 +315,7 @@ class Settings(private val context: Context, private val callback: Callback? = n
var detailGenreSort: Sort
get() =
Sort.fromIntCode(
inner.getInt(context.getString(R.string.set_key_detail_genre_sort), Int.MIN_VALUE))
inner.getInt(context.getString(R.string.set_key_detail_genre_sort), -1))
?: Sort(Sort.Mode.ByName, true)
set(value) {
inner.edit {

View file

@ -57,7 +57,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
<com.google.android.material.button.MaterialButton
android:id="@+id/playback_play_pause"
style="@style/Widget.Auxio.Button.Icon.Small"
android:layout_width="wrap_content"
@ -65,13 +65,12 @@
android:contentDescription="@string/desc_play_pause"
app:icon="@drawable/sel_playing_state_24" />
<Button
android:id="@+id/playback_skip_next"
<com.google.android.material.button.MaterialButton
android:id="@+id/playback_secondary_action"
style="@style/Widget.Auxio.Button.Icon.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/desc_play_pause"
app:icon="@drawable/ic_skip_next_24" />
tools:icon="@drawable/ic_skip_next_24" />
</LinearLayout>
</org.oxycblt.auxio.playback.ForcedLTRFrameLayout>

View file

@ -97,7 +97,7 @@
<string name="set_repeat_pause_desc">ايقاف مؤقت عند تكرار تشغيل اغنية</string>
<string name="set_content">محتوى</string>
<string name="set_save">حفظ حالة التشغيل</string>
<string name="set_save_state">حفظ حالة التشغيل</string>
<string name="set_save_desc">حفظ حالة التشغيل الحالية الآن</string>
<!-- Error Namespace | Error Labels -->

View file

@ -98,7 +98,7 @@
<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_state">Uložit stav přehrávání</string>
<string name="set_save_desc">Uložit aktuální stav přehrávání</string>
<string name="set_reindex">Znovu načíst hudbu</string>
<string name="set_reindex_desc">Může vymazat stav přehrávání</string>
@ -207,7 +207,7 @@
<string name="set_dirs">Hudební složky</string>
<string name="set_quality_tags">Ignorovat štítky MediaStore</string>
<string name="set_quality_tags_desc">Zvýší kvalitu štítků, ale má za následek delší načítací čas (experimentální)</string>
<string name="set_restore">Obnovit stav přehrávání</string>
<string name="set_restore_state">Obnovit stav přehrávání</string>
<string name="lng_state_restored">Stav obnoven</string>
<string name="set_restore_desc">Obnovit dříve uložený stav přehrávání (pokud existuje)</string>
<string name="err_did_not_restore">Nemohl být obnoven žádný stav</string>
@ -235,7 +235,7 @@
<string name="lbl_album_remix">Remixové album</string>
<string name="lbl_ep_live">Živé EP</string>
<string name="lbl_ep_remix">Remixové EP</string>
<string name="set_wipe">Vymazat stav přehrávání</string>
<string name="set_wipe_state">Vymazat stav přehrávání</string>
<string name="set_wipe_desc">Vymazat dříve uložený stav přehrávání (pokud existuje)</string>
<string name="lng_state_wiped">Stav vymazán</string>
<string name="desc_queue_bar">Otevřít frontu</string>

View file

@ -74,7 +74,7 @@
<string name="set_rewind_prev" tools:ignore="Typos">Zurückspulen, bevor das Lied zurück geändert wird</string>
<string name="set_rewind_prev_desc">Zurückspulen, bevor zum vorheriger Lied gewechselt wird</string>
<string name="set_content">Inhalt</string>
<string name="set_save">Wiedergabezustand speichern</string>
<string name="set_save_state">Wiedergabezustand speichern</string>
<string name="set_save_desc">Den aktuellen Wiedergabezustand speichern</string>
<string name="set_reindex">Musik neu laden</string>
<string name="set_reindex_desc">Könnte den Wiedergabezustand löschen</string>
@ -218,7 +218,7 @@
<string name="lbl_compilation">Kompilation</string>
<string name="lbl_soundtrack">Soundtrack</string>
<string name="lbl_soundtracks">Soundtracks</string>
<string name="set_restore">Wiedergabezustand wiederherstellen</string>
<string name="set_restore_state">Wiedergabezustand wiederherstellen</string>
<string name="lbl_album_remix">Remix-Album</string>
<string name="lbl_mixtapes">Mixtapes</string>
<string name="lbl_mixtape">Mixtape</string>
@ -231,5 +231,5 @@
<string name="lbl_live_group">Live</string>
<string name="set_wipe_desc">Den vorher gespeicherten Wiedergabezustand löschen (wenn vorhanden)</string>
<string name="lng_state_wiped">Zustand gelöscht</string>
<string name="set_wipe">Wiedergabezustand löschen</string>
<string name="set_wipe_state">Wiedergabezustand löschen</string>
</resources>

View file

@ -81,7 +81,7 @@
<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>
<string name="set_save_state">Guardar estado de reproducción</string>
<string name="set_save_desc">Guardar el estado de reproduccion ahora</string>
<string name="set_reindex">Recargar música</string>
<string name="set_reindex_desc">Puede borrar el estado de reproducción</string>
@ -187,7 +187,7 @@
<string name="lbl_sample_rate">Frecuencia de muestreo</string>
<string name="lbl_cancel">\@android:string/cancel</string>
<string name="set_headset_autoplay">Reproducción automática con auriculares</string>
<string name="set_restore">Reestablecer el estado de reproducción</string>
<string name="set_restore_state">Reestablecer el estado de reproducción</string>
<string name="set_restore_desc">Reestablecer el estado de reproducción guardado previamente (si existe)</string>
<string name="set_dirs">Carpetas de música</string>
<string name="set_quality_tags">Ignorar etiquetas MediaStore</string>

View file

@ -216,13 +216,13 @@
<string name="desc_play_pause">Reproduciraj ili pauziraj</string>
<string name="set_repeat_pause">Pauziraj na ponavljanje</string>
<string name="set_content">Sadržaj</string>
<string name="set_save">Spremi stanje reprodukcije</string>
<string name="set_restore">Vrati stanje reprodukcije</string>
<string name="set_save_state">Spremi stanje reprodukcije</string>
<string name="set_restore_state">Vrati stanje reprodukcije</string>
<string name="desc_skip_prev">Preskoči na prethodnu pjesmu</string>
<string name="desc_change_repeat">Promijeni način ponavljanja</string>
<string name="clr_purple">Ljubičasto</string>
<string name="cdc_mka">Matroska Zvuk</string>
<string name="set_wipe">Izbriši stanje reprodukcije</string>
<string name="set_wipe_state">Izbriši stanje reprodukcije</string>
<string name="lng_state_wiped">Stanje izbrisano</string>
<string name="set_wipe_desc">Izbriši prethodno stanje reprodukcije (ako postoji)</string>
</resources>

View file

@ -111,7 +111,7 @@
<string name="set_rewind_prev_desc">Putar mundur sebelum melompat ke lagu sebelumnya</string>
<string name="set_repeat_pause_desc">Jeda saat lagu diulang</string>
<string name="set_content">Konten</string>
<string name="set_save">Simpan status pemutaran</string>
<string name="set_save_state">Simpan status pemutaran</string>
<string name="set_save_desc">Simpan status pemutaran saat ini sekarang</string>
<string name="set_reindex">Muat ulang musik</string>
<string name="set_reindex_desc">Akan memulai ulang aplikasi</string>

View file

@ -83,7 +83,7 @@
<string name="set_repeat_pause">Pausa alla ripetizione</string>
<string name="set_repeat_pause_desc">Pausa quando una canzone si ripete</string>
<string name="set_content">Contenuti</string>
<string name="set_save">Salva stato riproduzione</string>
<string name="set_save_state">Salva stato riproduzione</string>
<string name="set_save_desc">Salva lo stato di riproduzione corrente</string>
<string name="set_reindex">Ricarica musica</string>
<string name="set_reindex_desc">Potrebbe cancellare lo stato di riproduzione</string>
@ -208,7 +208,7 @@
<string name="set_observing">Ricaricamento automatico</string>
<string name="set_quality_tags">Ignora tags MediaStore</string>
<string name="set_quality_tags_desc">Migliora qualità dei tag, ma potrebbe richiedere tempi di carimento più lunghi (sperimentale)</string>
<string name="set_restore">Ripristina stato riproduzione</string>
<string name="set_restore_state">Ripristina stato riproduzione</string>
<string name="set_restore_desc">Ripristina lo stato di riproduzione precedentemente salvato (se disponibile)</string>
<string name="err_did_not_restore">Impossibile ripristinare lo stato</string>
<string name="lbl_eps">EP</string>

View file

@ -111,7 +111,7 @@
<string name="set_repeat_pause_desc">곡이 반복 재생될 때 일시 중지</string>
<string name="set_content">내용</string>
<string name="set_save">재생 상태 저장</string>
<string name="set_save_state">재생 상태 저장</string>
<string name="set_save_desc">현재 재생 상태를 지금 저장</string>
<string name="set_reindex">음악 다시 불러오기</string>
<string name="set_reindex_desc">앱이 다시 시작됩니다.</string>

View file

@ -63,7 +63,7 @@
<string name="set_rewind_prev">Terugspoelen voordat je terugspoelt</string>
<string name="set_rewind_prev_desc">Terugspoelen voordat u naar het vorige nummer gaat</string>
<string name="set_content">Inhoud</string>
<string name="set_save">Afspeelstatus opslaan</string>
<string name="set_save_state">Afspeelstatus opslaan</string>
<string name="set_save_desc">Sla de huidige afspeelstatus nu op </string>
<!-- Error Namespace | Error Labels -->
<string name="err_no_music">Geen muziek aangetroffen</string>
@ -170,7 +170,7 @@
<string name="set_replay_gain">ReplayGain</string>
<string name="set_pre_amp_warning">Waarschuwing: Als u de voorversterker op een hoge positieve waarde zet, kan dit bij sommige audiotracks tot pieken leiden.</string>
<string name="set_playback_mode_none">Afspelen vanaf getoond item</string>
<string name="set_restore">Afspeelstatus herstellen</string>
<string name="set_restore_state">Afspeelstatus herstellen</string>
<string name="set_restore_desc">Herstel de eerder opgeslagen afspeelstatus (indien aanwezig)</string>
<string name="set_quality_tags">MediaStore tags negeren</string>
<string name="set_quality_tags_desc">Verhoogt tag-kwaliteit, maar vereist langere laadtijden</string>

View file

@ -83,7 +83,7 @@
<string name="set_repeat_pause">Пауза при повторе</string>
<string name="set_repeat_pause_desc">Ставить на паузу при повторе трека</string>
<string name="set_content">Библиотека</string>
<string name="set_save">Запоминать позицию</string>
<string name="set_save_state">Запоминать позицию</string>
<string name="set_save_desc">Запоминать позицию в треке</string>
<string name="set_reindex">Перезагрузить музыку</string>
<string name="set_reindex_desc">Это перезапустит приложение</string>
@ -173,7 +173,7 @@
<string name="lbl_sample_rate">Частота дискретизации</string>
<string name="set_pre_amp_desc">Предусилитель применяется к существующей настройке во время воспроизведения</string>
<string name="lbl_library_counts">Статистика библиотеки</string>
<string name="set_restore">Восстановить состояние воспроизведения</string>
<string name="set_restore_state">Восстановить состояние воспроизведения</string>
<string name="lbl_sort_duration">Продолжительность</string>
<string name="lbl_file_name">Имя файла</string>
<string name="lbl_ep">Мини-альбом</string>

View file

@ -160,7 +160,7 @@
<string name="set_rewind_prev_desc">Önceki şarkıya atlamadan önce geri sar</string>
<string name="set_repeat_pause_desc">Bir şarkı tekrarlandığında duraklat</string>
<string name="set_content">İçerik</string>
<string name="set_save">Çalma durumunu kaydet</string>
<string name="set_save_state">Çalma durumunu kaydet</string>
<string name="set_save_desc">Mevcut çalma durumunu şimdi kaydet</string>
<string name="set_keep_shuffle">Karıştırmayı hatırla</string>
<string name="set_keep_shuffle_desc">Yeni bir şarkı çalarken karışık çalmayıık tut</string>
@ -194,7 +194,7 @@
<string name="lng_state_restored">Durum geri yüklendi</string>
<string name="set_restore_desc">Önceden kaydedilmiş oynatma durumunu geri getirir (varsa)</string>
<string name="set_round_mode">Yuvarlak mod</string>
<string name="set_restore">Oynatma durumunu eski haline getir</string>
<string name="set_restore_state">Oynatma durumunu eski haline getir</string>
<string name="set_quality_tags">MediaStore etiketlerini yoksay</string>
<string name="set_quality_tags_desc">Etiket kalitesini artırır, ancak daha uzun yükleme süreleri gerektirir</string>
<string name="err_did_not_restore">Hiçbir durum geri getirelemedi</string>

View file

@ -82,7 +82,7 @@
<string name="set_repeat_pause">重复播放前暂停</string>
<string name="set_repeat_pause_desc">曲目重复播放前暂停</string>
<string name="set_content">内容</string>
<string name="set_save">保存播放状态</string>
<string name="set_save_state">保存播放状态</string>
<string name="set_save_desc">立即保存当前播放状态</string>
<string name="set_reindex">重新加载音乐</string>
<string name="set_reindex_desc">将会重启应用</string>

View file

@ -11,6 +11,7 @@
<string name="set_key_show_covers" translatable="false">KEY_SHOW_COVERS</string>
<string name="set_key_quality_covers" translatable="false">KEY_QUALITY_COVERS</string>
<string name="set_key_round_mode" translatable="false">auxio_round_covers</string>
<string name="set_key_bar_action" translatable="false">auxio_bar_action</string>
<string name="set_key_alt_notif_action" translatable="false">KEY_ALT_NOTIF_ACTION</string>
<string name="set_key_headset_autoplay" translatable="false">auxio_headset_autoplay</string>
@ -63,55 +64,71 @@
<item>@integer/theme_dark</item>
</integer-array>
<array name="entries_library_song_playback_mode">
<string-array name="entries_bar_action">
<item>@string/set_bar_action_next</item>
<item>@string/set_bar_action_repeat</item>
<item>@string/set_bar_action_shuffle</item>
</string-array>
<integer-array name="values_bar_action">
<item>@integer/bar_action_next</item>
<item>@integer/bar_action_repeat</item>
<item>@integer/bar_action_shuffle</item>
</integer-array>
<string-array name="entries_library_song_playback_mode">
<item>@string/set_playback_mode_all</item>
<item>@string/set_playback_mode_artist</item>
<item>@string/set_playback_mode_album</item>
<item>@string/set_playback_mode_genre</item>
</array>
</string-array>
<string-array name="values_library_song_playback_mode">
<integer-array name="values_library_song_playback_mode">
<item>@integer/play_mode_songs</item>
<item>@integer/play_mode_artist</item>
<item>@integer/play_mode_album</item>
<item>@integer/play_mode_genre</item>
</string-array>
</integer-array>
<array name="entries_detail_song_playback_mode">
<string-array name="entries_detail_song_playback_mode">
<item>@string/set_playback_mode_none</item>
<item>@string/set_playback_mode_all</item>
<item>@string/set_playback_mode_artist</item>
<item>@string/set_playback_mode_album</item>
<item>@string/set_playback_mode_genre</item>
</array>
</string-array>
<string-array name="values_detail_song_playback_mode">
<integer-array name="values_detail_song_playback_mode">
<item>@integer/play_mode_none</item>
<item>@integer/play_mode_songs</item>
<item>@integer/play_mode_artist</item>
<item>@integer/play_mode_album</item>
<item>@integer/play_mode_genre</item>
</string-array>
</integer-array>
<array name="entries_replay_gain">
<string-array name="entries_replay_gain">
<item>@string/lbl_off</item>
<item>@string/set_replay_gain_track</item>
<item>@string/set_replay_gain_album</item>
<item>@string/set_replay_gain_dynamic</item>
</array>
</string-array>
<string-array name="values_replay_gain">
<integer-array name="values_replay_gain">
<item>@integer/replay_gain_off</item>
<item>@integer/replay_gain_track</item>
<item>@integer/replay_gain_album</item>
<item>@integer/replay_gain_dynamic</item>
</string-array>
</integer-array>
<integer name="theme_auto">-1</integer>
<integer name="theme_light">1</integer>
<integer name="theme_dark">2</integer>
<integer name="play_mode_none">-2147483648</integer>
<integer name="bar_action_next">0xA119</integer>
<integer name="bar_action_repeat">0xA11A</integer>
<integer name="bar_action_shuffle">0xA11B</integer>
<integer name="play_mode_none">-1</integer>
<integer name="play_mode_genre">0xA103</integer>
<integer name="play_mode_artist">0xA104</integer>
<integer name="play_mode_album">0xA105</integer>

View file

@ -158,6 +158,10 @@
<string name="set_quality_covers_desc">Increases album cover quality, but results in longer loading times and higher memory usage</string>
<string name="set_round_mode">Round mode</string>
<string name="set_round_mode_desc">Enable rounded corners on additional UI elements (Requires album covers to be rounded)</string>
<string name="set_bar_action">Playback bar action</string>
<string name="set_bar_action_next">Skip to next</string>
<string name="set_bar_action_repeat">Repeat mode</string>
<string name="set_bar_action_shuffle">@string/lbl_shuffle</string>
<string name="set_alt_action">Use alternate notification action</string>
<string name="set_alt_repeat">Prefer repeat mode action</string>
<string name="set_alt_shuffle">Prefer shuffle action</string>
@ -191,11 +195,11 @@
<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>
<string name="set_save_state">Save playback state</string>
<string name="set_save_desc">Save the current playback state now</string>
<string name="set_wipe">Clear playback state</string>
<string name="set_wipe_state">Clear playback state</string>
<string name="set_wipe_desc">Clear the previously saved playback state (if any)</string>
<string name="set_restore">Restore playback state</string>
<string name="set_restore_state">Restore playback state</string>
<string name="set_restore_desc">Restore the previously saved playback state (if any)</string>
<string name="set_reindex">Reload music</string>
<string name="set_reindex_desc">May wipe playback state</string>

View file

@ -51,6 +51,13 @@
app:summary="@string/set_round_mode_desc"
app:title="@string/set_round_mode" />
<org.oxycblt.auxio.settings.ui.IntListPreference
app:entries="@array/entries_bar_action"
app:entryValues="@array/values_bar_action"
app:defaultValue="@integer/bar_action_next"
app:key="@string/set_key_bar_action"
app:title="@string/set_bar_action" />
<SwitchPreferenceCompat
app:defaultValue="false"
app:key="@string/set_key_alt_notif_action"
@ -126,17 +133,17 @@
<Preference
app:key="@string/set_key_save_state"
app:summary="@string/set_save_desc"
app:title="@string/set_save" />
app:title="@string/set_save_state" />
<Preference
app:key="@string/set_key_wipe_state"
app:summary="@string/set_wipe_desc"
app:title="@string/set_wipe" />
app:title="@string/set_wipe_state" />
<Preference
app:key="@string/set_key_restore_state"
app:summary="@string/set_restore_desc"
app:title="@string/set_restore" />
app:title="@string/set_restore_state" />
<Preference
app:key="@string/set_key_reindex"