playback: allow customization of detail playback

Add a new "Detail playback mode" option that allows one to configure
what selecting a song will do in an album/artist/genre.

This is mostly a clone of the prior setting, just in a new context.

Resolves #164.
This commit is contained in:
OxygenCobalt 2022-06-21 08:48:59 -06:00
parent 787a0df595
commit 8465cda637
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
23 changed files with 145 additions and 75 deletions

View file

@ -4,6 +4,7 @@
#### What's New #### What's New
- Added a shuffle shortcut - Added a shuffle shortcut
- You can now customize what occurs when a song is played from an album/artist/genre [#164]
#### What's Fixed #### What's Fixed
- Fixed broken tablet layouts - Fixed broken tablet layouts

View file

@ -38,12 +38,14 @@ import org.oxycblt.auxio.music.Music
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.PlaybackMode import org.oxycblt.auxio.playback.state.PlaybackMode
import org.oxycblt.auxio.settings.Settings
import org.oxycblt.auxio.ui.Header import org.oxycblt.auxio.ui.Header
import org.oxycblt.auxio.ui.Item import org.oxycblt.auxio.ui.Item
import org.oxycblt.auxio.ui.MenuFragment import org.oxycblt.auxio.ui.MenuFragment
import org.oxycblt.auxio.util.applySpans import org.oxycblt.auxio.util.applySpans
import org.oxycblt.auxio.util.canScroll import org.oxycblt.auxio.util.canScroll
import org.oxycblt.auxio.util.collectWith import org.oxycblt.auxio.util.collectWith
import org.oxycblt.auxio.util.context
import org.oxycblt.auxio.util.launch import org.oxycblt.auxio.util.launch
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.logEOrThrow
@ -62,6 +64,7 @@ class AlbumDetailFragment :
private val args: AlbumDetailFragmentArgs by navArgs() private val args: AlbumDetailFragmentArgs by navArgs()
private val detailAdapter = AlbumDetailAdapter(this) private val detailAdapter = AlbumDetailAdapter(this)
private val settings: Settings by lifecycleObject { binding -> Settings(binding.context) }
override fun onCreateBinding(inflater: LayoutInflater) = FragmentDetailBinding.inflate(inflater) override fun onCreateBinding(inflater: LayoutInflater) = FragmentDetailBinding.inflate(inflater)
@ -118,7 +121,7 @@ class AlbumDetailFragment :
override fun onItemClick(item: Item) { override fun onItemClick(item: Item) {
if (item is Song) { if (item is Song) {
playbackModel.play(item, PlaybackMode.IN_ALBUM) playbackModel.play(item, settings.detailPlaybackMode ?: PlaybackMode.IN_ALBUM)
} }
} }

View file

@ -36,11 +36,13 @@ import org.oxycblt.auxio.music.Music
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.PlaybackMode import org.oxycblt.auxio.playback.state.PlaybackMode
import org.oxycblt.auxio.settings.Settings
import org.oxycblt.auxio.ui.Header import org.oxycblt.auxio.ui.Header
import org.oxycblt.auxio.ui.Item import org.oxycblt.auxio.ui.Item
import org.oxycblt.auxio.ui.MenuFragment import org.oxycblt.auxio.ui.MenuFragment
import org.oxycblt.auxio.util.applySpans import org.oxycblt.auxio.util.applySpans
import org.oxycblt.auxio.util.collectWith import org.oxycblt.auxio.util.collectWith
import org.oxycblt.auxio.util.context
import org.oxycblt.auxio.util.launch import org.oxycblt.auxio.util.launch
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.logEOrThrow
@ -57,6 +59,7 @@ class ArtistDetailFragment :
private val args: ArtistDetailFragmentArgs by navArgs() private val args: ArtistDetailFragmentArgs by navArgs()
private val detailAdapter = ArtistDetailAdapter(this) private val detailAdapter = ArtistDetailAdapter(this)
private val settings: Settings by lifecycleObject { binding -> Settings(binding.context) }
override fun onCreateBinding(inflater: LayoutInflater) = FragmentDetailBinding.inflate(inflater) override fun onCreateBinding(inflater: LayoutInflater) = FragmentDetailBinding.inflate(inflater)
@ -110,7 +113,8 @@ class ArtistDetailFragment :
override fun onItemClick(item: Item) { override fun onItemClick(item: Item) {
when (item) { when (item) {
is Song -> playbackModel.play(item, PlaybackMode.IN_ARTIST) is Song ->
playbackModel.play(item, settings.detailPlaybackMode ?: PlaybackMode.IN_ARTIST)
is Album -> navModel.exploreNavigateTo(item) is Album -> navModel.exploreNavigateTo(item)
} }
} }

View file

@ -37,11 +37,13 @@ import org.oxycblt.auxio.music.Music
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.PlaybackMode import org.oxycblt.auxio.playback.state.PlaybackMode
import org.oxycblt.auxio.settings.Settings
import org.oxycblt.auxio.ui.Header import org.oxycblt.auxio.ui.Header
import org.oxycblt.auxio.ui.Item import org.oxycblt.auxio.ui.Item
import org.oxycblt.auxio.ui.MenuFragment import org.oxycblt.auxio.ui.MenuFragment
import org.oxycblt.auxio.util.applySpans import org.oxycblt.auxio.util.applySpans
import org.oxycblt.auxio.util.collectWith import org.oxycblt.auxio.util.collectWith
import org.oxycblt.auxio.util.context
import org.oxycblt.auxio.util.launch import org.oxycblt.auxio.util.launch
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.logEOrThrow
@ -58,6 +60,7 @@ class GenreDetailFragment :
private val args: GenreDetailFragmentArgs by navArgs() private val args: GenreDetailFragmentArgs by navArgs()
private val detailAdapter = GenreDetailAdapter(this) private val detailAdapter = GenreDetailAdapter(this)
private val settings: Settings by lifecycleObject { binding -> Settings(binding.context) }
override fun onCreateBinding(inflater: LayoutInflater) = FragmentDetailBinding.inflate(inflater) override fun onCreateBinding(inflater: LayoutInflater) = FragmentDetailBinding.inflate(inflater)
@ -110,7 +113,8 @@ class GenreDetailFragment :
override fun onItemClick(item: Item) { override fun onItemClick(item: Item) {
when (item) { when (item) {
is Song -> playbackModel.play(item, PlaybackMode.IN_GENRE) is Song ->
playbackModel.play(item, settings.detailPlaybackMode ?: PlaybackMode.IN_GENRE)
is Album -> is Album ->
findNavController() findNavController()
.navigate(ArtistDetailFragmentDirections.actionShowAlbum(item.id)) .navigate(ArtistDetailFragmentDirections.actionShowAlbum(item.id))

View file

@ -147,7 +147,7 @@ class HomeViewModel(application: Application) :
} }
override fun onSettingChanged(key: String) { override fun onSettingChanged(key: String) {
if (key == application.getString(R.string.set_lib_tabs)) { if (key == application.getString(R.string.set_key_lib_tabs)) {
tabs = visibleTabs tabs = visibleTabs
_shouldRecreateTabs.value = true _shouldRecreateTabs.value = true
} }

View file

@ -83,7 +83,7 @@ class SongListFragment : HomeListFragment<Song>() {
override fun onItemClick(item: Item) { override fun onItemClick(item: Item) {
check(item is Song) check(item is Song)
playbackModel.play(item, settings.songPlaybackMode) playbackModel.play(item, settings.libPlaybackMode)
} }
override fun onOpenMenu(item: Item, anchor: View) { override fun onOpenMenu(item: Item, anchor: View) {

View file

@ -29,10 +29,10 @@ 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
import org.oxycblt.auxio.util.androidActivityViewModels import org.oxycblt.auxio.util.androidActivityViewModels
import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.getColorStateListSafe import org.oxycblt.auxio.util.getColorStateListSafe
import org.oxycblt.auxio.util.getSystemBarInsetsCompat import org.oxycblt.auxio.util.getSystemBarInsetsCompat
import org.oxycblt.auxio.util.getSystemGestureInsetsCompat import org.oxycblt.auxio.util.getSystemGestureInsetsCompat
import org.oxycblt.auxio.util.launch
import org.oxycblt.auxio.util.textSafe import org.oxycblt.auxio.util.textSafe
/** /**
@ -76,15 +76,17 @@ class PlaybackBarFragment : ViewBindingFragment<FragmentPlaybackBarBinding>() {
binding.playbackProgressBar.trackColor = binding.playbackProgressBar.trackColor =
requireContext().getColorStateListSafe(R.color.sel_track).defaultColor requireContext().getColorStateListSafe(R.color.sel_track).defaultColor
binding.playbackProgressBar.progress = 0
binding.playbackPlayPause.setOnClickListener { playbackModel.invertPlaying() } binding.playbackPlayPause.setOnClickListener { playbackModel.invertPlaying() }
binding.playbackSkipNext.setOnClickListener { playbackModel.next() } binding.playbackSkipNext.setOnClickListener { playbackModel.next() }
// -- VIEWMODEL SETUP --- // -- VIEWMODEL SETUP ---
launch { playbackModel.song.collect(::updateSong) } collectImmediately(playbackModel.song, ::updateSong)
launch { playbackModel.isPlaying.collect(::updateIsPlaying) } collectImmediately(playbackModel.isPlaying, ::updateIsPlaying)
launch { playbackModel.positionSecs.collect(::updatePosition) } collectImmediately(playbackModel.positionSecs, ::updatePosition)
} }
private fun updateSong(song: Song?) { private fun updateSong(song: Song?) {

View file

@ -171,7 +171,7 @@ class PlaybackViewModel(application: Application) :
is DelayedAction.ShuffleAll -> shuffleAll() is DelayedAction.ShuffleAll -> shuffleAll()
is DelayedAction.Open -> { is DelayedAction.Open -> {
library.findSongForUri(application, action.uri)?.let { song -> library.findSongForUri(application, action.uri)?.let { song ->
play(song, settings.songPlaybackMode) play(song, settings.libPlaybackMode)
} }
} }
} }

View file

@ -126,7 +126,7 @@ class SearchFragment :
override fun onItemClick(item: Item) { override fun onItemClick(item: Item) {
when (item) { when (item) {
is Song -> playbackModel.play(item, settings.songPlaybackMode) is Song -> playbackModel.play(item, settings.libPlaybackMode)
is MusicParent -> navModel.exploreNavigateTo(item) is MusicParent -> navModel.exploreNavigateTo(item)
} }
} }

View file

@ -152,13 +152,24 @@ class Settings(private val context: Context, private val callback: Callback? = n
} }
} }
/** What queue to create when a song is selected (ex. From All Songs or Search) */ /** What queue to create when a song is selected from the library or search */
val songPlaybackMode: PlaybackMode val libPlaybackMode: PlaybackMode
get() = get() =
PlaybackMode.fromInt( PlaybackMode.fromInt(
inner.getInt(context.getString(R.string.set_key_song_play_mode), Int.MIN_VALUE)) inner.getInt(
context.getString(R.string.set_key_library_song_playback_mode), Int.MIN_VALUE))
?: PlaybackMode.ALL_SONGS ?: PlaybackMode.ALL_SONGS
/**
* What queue t create when a song is selected from an album/artist/genre. Null means to default
* to the currently shown item.
*/
val detailPlaybackMode: PlaybackMode?
get() =
PlaybackMode.fromInt(
inner.getInt(
context.getString(R.string.set_key_detail_song_playback_mode), Int.MIN_VALUE))
/** Whether shuffle should stay on when a new song is selected. */ /** Whether shuffle should stay on when a new song is selected. */
val keepShuffle: Boolean val keepShuffle: Boolean
get() = inner.getBoolean(context.getString(R.string.set_key_keep_shuffle), true) get() = inner.getBoolean(context.getString(R.string.set_key_keep_shuffle), true)

View file

@ -46,6 +46,7 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding import androidx.viewbinding.ViewBinding
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.oxycblt.auxio.R import org.oxycblt.auxio.R
@ -157,6 +158,21 @@ val RecyclerView.canScroll: Boolean
val @receiver:ColorRes Int.stateList val @receiver:ColorRes Int.stateList
get() = ColorStateList.valueOf(this) get() = ColorStateList.valueOf(this)
/**
* Collect a [stateFlow] into [block] a UI-safe way.
*
* This method automatically calls [block] when initially starting to ensure UI state consistency.
* This does nominally mean that there are two initializing collections, but this is considered
* okay. [block] should be a function pointer in order to ensure lifecycle consistency.
*
* Only use this if your code absolutely needs to have a good state for ~100ms of draw-time.
* Otherwise, it's somewhat in-efficient.
*/
fun <T> Fragment.collectImmediately(stateFlow: StateFlow<T>, block: (T) -> Unit) {
block(stateFlow.value)
launch { stateFlow.collect(block) }
}
/** /**
* Launches [block] in a lifecycle-aware coroutine once [state] is reached. This is primarily a * Launches [block] in a lifecycle-aware coroutine once [state] is reached. This is primarily a
* shortcut intended to correctly launch a co-routine on a fragment in a way that won't cause * shortcut intended to correctly launch a co-routine on a fragment in a way that won't cause

View file

@ -30,10 +30,10 @@
<string name="lbl_playback">يعمل الآن</string> <string name="lbl_playback">يعمل الآن</string>
<string name="lbl_play">تشغيل</string> <string name="lbl_play">تشغيل</string>
<string name="lbl_shuffle">خلط</string> <string name="lbl_shuffle">خلط</string>
<string name="lbl_play_all">تشغيل من جميع الاغاني</string> <string name="set_playback_mode_all">تشغيل من جميع الاغاني</string>
<string name="lbl_play_album">تشغيل من البوم</string> <string name="set_playback_mode_album">تشغيل من البوم</string>
<string name="lbl_play_artist">تشغيل من فنان</string> <string name="set_playback_mode_artist">تشغيل من فنان</string>
<string name="lbl_play_genre">تشغيل من نوع</string> <string name="set_playback_mode_genre">تشغيل من نوع</string>
<string name="lbl_queue">طابور</string> <string name="lbl_queue">طابور</string>
<string name="lbl_play_next">شغل تالياً</string> <string name="lbl_play_next">شغل تالياً</string>
@ -88,7 +88,7 @@
<string name="set_replay_gain_dynamic">ديناميكي</string> <string name="set_replay_gain_dynamic">ديناميكي</string>
<string name="set_behavior">سلوك</string> <string name="set_behavior">سلوك</string>
<string name="set_song_mode">عند اختيار اغنية</string> <string name="set_library_song_playback_mode">عند اختيار اغنية</string>
<string name="set_keep_shuffle">تذكر الخلط</string> <string name="set_keep_shuffle">تذكر الخلط</string>
<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>

View file

@ -35,10 +35,10 @@
<string name="lbl_playback">Právě hraje</string> <string name="lbl_playback">Právě hraje</string>
<string name="lbl_play">Přehrát</string> <string name="lbl_play">Přehrát</string>
<string name="lbl_shuffle">Náhodně</string> <string name="lbl_shuffle">Náhodně</string>
<string name="lbl_play_all">Přehrát ze všech skladeb</string> <string name="set_playback_mode_all">Přehrát ze všech skladeb</string>
<string name="lbl_play_album">Přehrát z alba</string> <string name="set_playback_mode_album">Přehrát z alba</string>
<string name="lbl_play_artist">Přehrát z umělce</string> <string name="set_playback_mode_artist">Přehrát z umělce</string>
<string name="lbl_play_genre">Přehrát ze žánru</string> <string name="set_playback_mode_genre">Přehrát ze žánru</string>
<string name="lbl_queue">Fronta</string> <string name="lbl_queue">Fronta</string>
<string name="lbl_play_next">Přehrát další</string> <string name="lbl_play_next">Přehrát další</string>
@ -104,7 +104,7 @@
<string name="set_pre_amp_warning">Varování: Změna předzesilovače na vysokou kladnou hodnotu může u některých zvukových stop vést k příliš vysokým hlasitostem.</string> <string name="set_pre_amp_warning">Varování: Změna předzesilovače na vysokou kladnou hodnotu může u některých zvukových stop vést k příliš vysokým hlasitostem.</string>
<string name="set_behavior">Chování</string> <string name="set_behavior">Chování</string>
<string name="set_song_mode">Když je vybrána skladba</string> <string name="set_library_song_playback_mode">Když je vybrána skladba</string>
<string name="set_keep_shuffle">Zapamatovat si náhodné přehrávání</string> <string name="set_keep_shuffle">Zapamatovat si náhodné přehrávání</string>
<string name="set_keep_shuffle_desc">Ponechat náhodné přehrávání při přehrávání nové skladby</string> <string name="set_keep_shuffle_desc">Ponechat náhodné přehrávání 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>

View file

@ -22,10 +22,10 @@
<string name="lbl_play">Abspielen</string> <string name="lbl_play">Abspielen</string>
<string name="lbl_shuffle">Zufällig</string> <string name="lbl_shuffle">Zufällig</string>
<string name="lbl_play_all">Von allen Lieder abspielen</string> <string name="set_playback_mode_all">Von allen Lieder abspielen</string>
<string name="lbl_play_album">Von Album abspielen</string> <string name="set_playback_mode_album">Von Album abspielen</string>
<string name="lbl_play_artist">Von Künstler abspielen</string> <string name="set_playback_mode_artist">Von Künstler abspielen</string>
<string name="lbl_play_genre">Von Genre abspielen</string> <string name="set_playback_mode_genre">Von Genre abspielen</string>
<string name="lbl_playback">Aktuelle Wiedergabe</string> <string name="lbl_playback">Aktuelle Wiedergabe</string>
<string name="lbl_queue">Warteschlange</string> <string name="lbl_queue">Warteschlange</string>
@ -84,7 +84,7 @@
<string name="set_replay_gain_album">Album bevorzugen</string> <string name="set_replay_gain_album">Album bevorzugen</string>
<string name="set_behavior">Verhalten</string> <string name="set_behavior">Verhalten</string>
<string name="set_song_mode">Wenn ein Lied ausgewählt wird</string> <string name="set_library_song_playback_mode">Wenn ein Lied ausgewählt wird</string>
<string name="set_keep_shuffle">Zufällig-Einstellung merken</string> <string name="set_keep_shuffle">Zufällig-Einstellung merken</string>
<string name="set_keep_shuffle_desc">Zufällig anlassen, wenn ein neues Lied abgespielt wird</string> <string name="set_keep_shuffle_desc">Zufällig anlassen, wenn ein neues Lied abgespielt wird</string>
<string name="set_rewind_prev" tools:ignore="Typos">Zurückspulen, bevor das Lied zurück geändert wird</string> <string name="set_rewind_prev" tools:ignore="Typos">Zurückspulen, bevor das Lied zurück geändert wird</string>

View file

@ -30,10 +30,10 @@
<string name="lbl_playback">En reproducción</string> <string name="lbl_playback">En reproducción</string>
<string name="lbl_play">Reproducir</string> <string name="lbl_play">Reproducir</string>
<string name="lbl_shuffle">Mezcla</string> <string name="lbl_shuffle">Mezcla</string>
<string name="lbl_play_all">Reproducir todo</string> <string name="set_playback_mode_all">Reproducir todo</string>
<string name="lbl_play_album">Reproducir por álbum</string> <string name="set_playback_mode_album">Reproducir por álbum</string>
<string name="lbl_play_artist">Reproducir por artista</string> <string name="set_playback_mode_artist">Reproducir por artista</string>
<string name="lbl_play_genre">Reproducir por género</string> <string name="set_playback_mode_genre">Reproducir por género</string>
<string name="lbl_queue">Cola</string> <string name="lbl_queue">Cola</string>
<string name="lbl_play_next">Reproducir siguiente</string> <string name="lbl_play_next">Reproducir siguiente</string>
@ -88,7 +88,7 @@
<string name="set_replay_gain_dynamic">Dinámico</string> <string name="set_replay_gain_dynamic">Dinámico</string>
<string name="set_behavior">Comportamiento</string> <string name="set_behavior">Comportamiento</string>
<string name="set_song_mode">Cuando se selecciona una canción</string> <string name="set_library_song_playback_mode">Cuando se selecciona una canción</string>
<string name="set_keep_shuffle">Recordar mezcla</string> <string name="set_keep_shuffle">Recordar mezcla</string>
<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>

View file

@ -29,10 +29,10 @@
<string name="lbl_playback">Ora in riproduzione</string> <string name="lbl_playback">Ora in riproduzione</string>
<string name="lbl_play">Riproduci</string> <string name="lbl_play">Riproduci</string>
<string name="lbl_shuffle">Mescola</string> <string name="lbl_shuffle">Mescola</string>
<string name="lbl_play_all">Riproduci da tutte le canzoni</string> <string name="set_playback_mode_all">Riproduci da tutte le canzoni</string>
<string name="lbl_play_album">Riproduci dal disco</string> <string name="set_playback_mode_album">Riproduci dal disco</string>
<string name="lbl_play_artist">Riproduci dall\'artista</string> <string name="set_playback_mode_artist">Riproduci dall\'artista</string>
<string name="lbl_play_genre">Riproduci dal genere</string> <string name="set_playback_mode_genre">Riproduci dal genere</string>
<string name="lbl_queue">Coda</string> <string name="lbl_queue">Coda</string>
<string name="lbl_play_next">Riproduci successivo</string> <string name="lbl_play_next">Riproduci successivo</string>
@ -89,7 +89,7 @@
<string name="set_replay_gain_dynamic">Dinamico</string> <string name="set_replay_gain_dynamic">Dinamico</string>
<string name="set_behavior">Comportamento</string> <string name="set_behavior">Comportamento</string>
<string name="set_song_mode">Quando una canzone è selezionata</string> <string name="set_library_song_playback_mode">Quando una canzone è selezionata</string>
<string name="set_keep_shuffle">Mantieni mescolamento</string> <string name="set_keep_shuffle">Mantieni mescolamento</string>
<string name="set_keep_shuffle_desc">Mantiene il mescolamento anche se una nuova canzone è selezionata</string> <string name="set_keep_shuffle_desc">Mantiene il mescolamento anche se una nuova canzone è selezionata</string>
<string name="set_rewind_prev">Riavvolgi prima di saltare indietro</string> <string name="set_rewind_prev">Riavvolgi prima di saltare indietro</string>

View file

@ -33,10 +33,10 @@
<string name="lbl_playback">지금 재생 중</string> <string name="lbl_playback">지금 재생 중</string>
<string name="lbl_play">재생</string> <string name="lbl_play">재생</string>
<string name="lbl_shuffle">무작위</string> <string name="lbl_shuffle">무작위</string>
<string name="lbl_play_all">모든 곡에서 재생</string> <string name="set_playback_mode_all">모든 곡에서 재생</string>
<string name="lbl_play_album">앨범에서 재생</string> <string name="set_playback_mode_album">앨범에서 재생</string>
<string name="lbl_play_artist">아티스트에서 재생</string> <string name="set_playback_mode_artist">아티스트에서 재생</string>
<string name="lbl_play_genre">장르에서 재생</string> <string name="set_playback_mode_genre">장르에서 재생</string>
<string name="lbl_queue">대기열</string> <string name="lbl_queue">대기열</string>
<string name="lbl_play_next">다음 곡 재생</string> <string name="lbl_play_next">다음 곡 재생</string>
@ -102,7 +102,7 @@
<string name="set_pre_amp_warning">주의: 프리앰프를 높게 설정하면 일부 오디오 트랙에서 주파수가 잘릴 수 있습니다.</string> <string name="set_pre_amp_warning">주의: 프리앰프를 높게 설정하면 일부 오디오 트랙에서 주파수가 잘릴 수 있습니다.</string>
<string name="set_behavior">동작</string> <string name="set_behavior">동작</string>
<string name="set_song_mode">음악을 선택했을 때</string> <string name="set_library_song_playback_mode">음악을 선택했을 때</string>
<string name="set_keep_shuffle">무작위 모드 기억</string> <string name="set_keep_shuffle">무작위 모드 기억</string>
<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>

View file

@ -23,10 +23,10 @@
<string name="lbl_play">Afspelen</string> <string name="lbl_play">Afspelen</string>
<string name="lbl_shuffle">Shuffle</string> <string name="lbl_shuffle">Shuffle</string>
<string name="lbl_play_all">Speel van alle nummers </string> <string name="set_playback_mode_all">Speel van alle nummers </string>
<string name="lbl_play_album">Speel af van album </string> <string name="set_playback_mode_album">Speel af van album </string>
<string name="lbl_play_artist">Speel van artiest </string> <string name="set_playback_mode_artist">Speel van artiest </string>
<string name="lbl_play_genre">Speel vanuit genre </string> <string name="set_playback_mode_genre">Speel vanuit genre </string>
<string name="lbl_playback">Afspeelscherm</string> <string name="lbl_playback">Afspeelscherm</string>
<string name="lbl_queue">Wachtrij</string> <string name="lbl_queue">Wachtrij</string>
@ -72,7 +72,7 @@
<string name="set_audio">Audio</string> <string name="set_audio">Audio</string>
<string name="set_behavior">Gedrag</string> <string name="set_behavior">Gedrag</string>
<string name="set_song_mode">Wanneer een liedje is geselecteerd</string> <string name="set_library_song_playback_mode">Wanneer een liedje is geselecteerd</string>
<string name="set_keep_shuffle">Onthoud shuffle</string> <string name="set_keep_shuffle">Onthoud shuffle</string>
<string name="set_keep_shuffle_desc">Houd shuffle aan bij het afspelen van een nieuw nummer</string> <string name="set_keep_shuffle_desc">Houd shuffle aan bij het afspelen van een nieuw nummer</string>
<string name="set_rewind_prev">Terugspoelen voordat je terugspoelt</string> <string name="set_rewind_prev">Terugspoelen voordat je terugspoelt</string>

View file

@ -30,10 +30,10 @@
<string name="lbl_playback">Сейчас играет</string> <string name="lbl_playback">Сейчас играет</string>
<string name="lbl_play">Играть</string> <string name="lbl_play">Играть</string>
<string name="lbl_shuffle">Перемешать</string> <string name="lbl_shuffle">Перемешать</string>
<string name="lbl_play_all">Играть все треки</string> <string name="set_playback_mode_all">Играть все треки</string>
<string name="lbl_play_album">Играть альбом</string> <string name="set_playback_mode_album">Играть альбом</string>
<string name="lbl_play_artist">Играть исполнителя</string> <string name="set_playback_mode_artist">Играть исполнителя</string>
<string name="lbl_play_genre">Играть жанр</string> <string name="set_playback_mode_genre">Играть жанр</string>
<string name="lbl_queue">Очередь</string> <string name="lbl_queue">Очередь</string>
<string name="lbl_play_next">Играть далее</string> <string name="lbl_play_next">Играть далее</string>
@ -90,7 +90,7 @@
<string name="set_replay_gain_dynamic">Динамический</string> <string name="set_replay_gain_dynamic">Динамический</string>
<string name="set_behavior">Поведение</string> <string name="set_behavior">Поведение</string>
<string name="set_song_mode">При выборе трека</string> <string name="set_library_song_playback_mode">При выборе трека</string>
<string name="set_keep_shuffle">Запоминать перемешивание</string> <string name="set_keep_shuffle">Запоминать перемешивание</string>
<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>

View file

@ -29,10 +29,10 @@
<string name="lbl_playback">正在播放</string> <string name="lbl_playback">正在播放</string>
<string name="lbl_play">播放</string> <string name="lbl_play">播放</string>
<string name="lbl_shuffle">随机</string> <string name="lbl_shuffle">随机</string>
<string name="lbl_play_all">从全部歌曲开始播放</string> <string name="set_playback_mode_all">从全部歌曲开始播放</string>
<string name="lbl_play_album">从专辑开始播放</string> <string name="set_playback_mode_album">从专辑开始播放</string>
<string name="lbl_play_artist">从艺术家开始播放</string> <string name="set_playback_mode_artist">从艺术家开始播放</string>
<string name="lbl_play_genre">从流派开始播放</string> <string name="set_playback_mode_genre">从流派开始播放</string>
<string name="lbl_queue">播放队列</string> <string name="lbl_queue">播放队列</string>
<string name="lbl_play_next">作为下一首播放</string> <string name="lbl_play_next">作为下一首播放</string>
@ -88,7 +88,7 @@
<string name="set_replay_gain_dynamic">动态</string> <string name="set_replay_gain_dynamic">动态</string>
<string name="set_behavior">行为</string> <string name="set_behavior">行为</string>
<string name="set_song_mode">选中歌曲时</string> <string name="set_library_song_playback_mode">选中歌曲时</string>
<string name="set_keep_shuffle">记住随机模式</string> <string name="set_keep_shuffle">记住随机模式</string>
<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>

View file

@ -17,7 +17,8 @@
<string name="set_key_pre_amp_with" translatable="false">auxio_pre_amp_with</string> <string name="set_key_pre_amp_with" translatable="false">auxio_pre_amp_with</string>
<string name="set_key_pre_amp_without" translatable="false">auxio_pre_amp_without</string> <string name="set_key_pre_amp_without" translatable="false">auxio_pre_amp_without</string>
<string name="set_key_song_play_mode" translatable="false">KEY_SONG_PLAY_MODE2</string> <string name="set_key_library_song_playback_mode" translatable="false">KEY_SONG_PLAY_MODE2</string>
<string name="set_key_detail_song_playback_mode" translatable="false">auxio_detail_song_play_mode</string>
<string name="set_key_keep_shuffle" translatable="false">KEY_KEEP_SHUFFLE</string> <string name="set_key_keep_shuffle" translatable="false">KEY_KEEP_SHUFFLE</string>
<string name="set_key_rewind_prev" translatable="false">KEY_PREV_REWIND</string> <string name="set_key_rewind_prev" translatable="false">KEY_PREV_REWIND</string>
<string name="set_key_repeat_pause" translatable="false">KEY_LOOP_PAUSE</string> <string name="set_key_repeat_pause" translatable="false">KEY_LOOP_PAUSE</string>
@ -56,14 +57,30 @@
<item>@integer/theme_dark</item> <item>@integer/theme_dark</item>
</integer-array> </integer-array>
<array name="entries_song_playback_mode"> <array name="entries_library_song_playback_mode">
<item>@string/lbl_play_all</item> <item>@string/set_playback_mode_all</item>
<item>@string/lbl_play_artist</item> <item>@string/set_playback_mode_artist</item>
<item>@string/lbl_play_album</item> <item>@string/set_playback_mode_album</item>
<item>@string/lbl_play_genre</item> <item>@string/set_playback_mode_genre</item>
</array> </array>
<string-array name="values_song_playback_mode"> <string-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>
<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 name="values_detail_song_playback_mode">
<item>@integer/play_mode_none</item>
<item>@integer/play_mode_songs</item> <item>@integer/play_mode_songs</item>
<item>@integer/play_mode_artist</item> <item>@integer/play_mode_artist</item>
<item>@integer/play_mode_album</item> <item>@integer/play_mode_album</item>
@ -88,6 +105,7 @@
<integer name="theme_light">1</integer> <integer name="theme_light">1</integer>
<integer name="theme_dark">2</integer> <integer name="theme_dark">2</integer>
<integer name="play_mode_none">-2147483648</integer>
<integer name="play_mode_genre">0xA103</integer> <integer name="play_mode_genre">0xA103</integer>
<integer name="play_mode_artist">0xA104</integer> <integer name="play_mode_artist">0xA104</integer>
<integer name="play_mode_album">0xA105</integer> <integer name="play_mode_album">0xA105</integer>

View file

@ -35,10 +35,6 @@
<string name="lbl_playback">Now Playing</string> <string name="lbl_playback">Now Playing</string>
<string name="lbl_play">Play</string> <string name="lbl_play">Play</string>
<string name="lbl_shuffle">Shuffle</string> <string name="lbl_shuffle">Shuffle</string>
<string name="lbl_play_all">Play from all songs</string>
<string name="lbl_play_album">Play from album</string>
<string name="lbl_play_artist">Play from artist</string>
<string name="lbl_play_genre">Play from genre</string>
<string name="lbl_queue">Queue</string> <string name="lbl_queue">Queue</string>
<string name="lbl_play_next">Play next</string> <string name="lbl_play_next">Play next</string>
@ -118,7 +114,13 @@
<string name="set_pre_amp_warning">Warning: Changing the pre-amp to a high positive value may result in peaking on some audio tracks.</string> <string name="set_pre_amp_warning">Warning: Changing the pre-amp to a high positive value may result in peaking on some audio tracks.</string>
<string name="set_behavior">Behavior</string> <string name="set_behavior">Behavior</string>
<string name="set_song_mode">When a song is selected</string> <string name="set_library_song_playback_mode">Library playback mode</string>
<string name="set_detail_song_playback_mode">Detail playback mode</string>
<string name="set_playback_mode_none">Play from shown item</string>
<string name="set_playback_mode_all">Play from all songs</string>
<string name="set_playback_mode_album">Play from album</string>
<string name="set_playback_mode_artist">Play from artist</string>
<string name="set_playback_mode_genre">Play from genre</string>
<string name="set_keep_shuffle">Remember shuffle</string> <string name="set_keep_shuffle">Remember shuffle</string>
<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>

View file

@ -110,11 +110,20 @@
<org.oxycblt.auxio.settings.ui.IntListPreference <org.oxycblt.auxio.settings.ui.IntListPreference
app:defaultValue="@integer/play_mode_songs" app:defaultValue="@integer/play_mode_songs"
app:entries="@array/entries_song_playback_mode" app:entries="@array/entries_library_song_playback_mode"
app:entryValues="@array/values_song_playback_mode" app:entryValues="@array/values_library_song_playback_mode"
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:key="@string/set_key_song_play_mode" app:key="@string/set_key_library_song_playback_mode"
app:title="@string/set_song_mode" app:title="@string/set_library_song_playback_mode"
app:useSimpleSummaryProvider="true" />
<org.oxycblt.auxio.settings.ui.IntListPreference
app:defaultValue="@integer/play_mode_none"
app:entries="@array/entries_detail_song_playback_mode"
app:entryValues="@array/values_detail_song_playback_mode"
app:iconSpaceReserved="false"
app:key="@string/set_key_detail_song_playback_mode"
app:title="@string/set_detail_song_playback_mode"
app:useSimpleSummaryProvider="true" /> app:useSimpleSummaryProvider="true" />
<org.oxycblt.auxio.settings.ui.M3SwitchPreference <org.oxycblt.auxio.settings.ui.M3SwitchPreference