list: expand item menus

Bit of a megapatch that:
- Adds dedicated play, shuffle, and view items to all item menus
(songs haven't been fully implemented yet)
- Adds icons to all item menus
- Re-adds enabled/disabled items to menus
- Makes menu action naming conventions more consistent with the rest
of the app
This commit is contained in:
Alexander Capehart 2023-07-04 11:12:25 -06:00
parent f84b6f68b3
commit ab2b853737
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
68 changed files with 439 additions and 217 deletions

View file

@ -162,7 +162,7 @@ class AlbumDetailFragment :
requireContext().showToast(R.string.lng_queue_added)
true
}
R.id.action_go_artist -> {
R.id.action_artist_details -> {
onNavigateToParentArtist()
true
}
@ -187,7 +187,7 @@ class AlbumDetailFragment :
}
override fun onOpenMenu(item: Song, anchor: View) {
menuModel.openMenu(R.menu.item_album_song, item)
menuModel.open(R.menu.item_album_song, item)
}
override fun onPlay() {

View file

@ -198,8 +198,8 @@ class ArtistDetailFragment :
override fun onOpenMenu(item: Music, anchor: View) {
when (item) {
is Song -> menuModel.openMenu(R.menu.item_artist_song, item)
is Album -> menuModel.openMenu(R.menu.item_artist_album, item)
is Song -> menuModel.open(R.menu.item_artist_song, item)
is Album -> menuModel.open(R.menu.item_artist_album, item)
else -> error("Unexpected datatype: ${item::class.simpleName}")
}
}

View file

@ -196,8 +196,8 @@ class GenreDetailFragment :
override fun onOpenMenu(item: Music, anchor: View) {
when (item) {
is Artist -> menuModel.openMenu(R.menu.item_parent, item)
is Song -> menuModel.openMenu(R.menu.item_song, item)
is Artist -> menuModel.open(R.menu.item_parent, item)
is Song -> menuModel.open(R.menu.item_song, item)
else -> error("Unexpected datatype: ${item::class.simpleName}")
}
}

View file

@ -239,7 +239,7 @@ class PlaylistDetailFragment :
}
override fun onOpenMenu(item: Song, anchor: View) {
menuModel.openMenu(R.menu.item_playlist_song, item)
menuModel.open(R.menu.item_playlist_song, item)
}
override fun onPlay() {

View file

@ -144,7 +144,7 @@ class AlbumListFragment :
}
override fun onOpenMenu(item: Album, anchor: View) {
menuModel.openMenu(R.menu.item_album, item)
menuModel.open(R.menu.item_album, item)
}
private fun updateAlbums(albums: List<Album>) {

View file

@ -120,7 +120,7 @@ class ArtistListFragment :
}
override fun onOpenMenu(item: Artist, anchor: View) {
menuModel.openMenu(R.menu.item_parent, item)
menuModel.open(R.menu.item_parent, item)
}
private fun updateArtists(artists: List<Artist>) {

View file

@ -119,7 +119,7 @@ class GenreListFragment :
}
override fun onOpenMenu(item: Genre, anchor: View) {
menuModel.openMenu(R.menu.item_parent, item)
menuModel.open(R.menu.item_parent, item)
}
private fun updateGenres(genres: List<Genre>) {

View file

@ -117,7 +117,7 @@ class PlaylistListFragment :
}
override fun onOpenMenu(item: Playlist, anchor: View) {
menuModel.openMenu(R.menu.item_playlist, item)
menuModel.open(R.menu.item_playlist, item)
}
private fun updatePlaylists(playlists: List<Playlist>) {

View file

@ -145,7 +145,7 @@ class SongListFragment :
}
override fun onOpenMenu(item: Song, anchor: View) {
menuModel.openMenu(R.menu.item_song, item)
menuModel.open(R.menu.item_song, item)
}
private fun updateSongs(songs: List<Song>) {

View file

@ -40,18 +40,17 @@ import org.oxycblt.auxio.util.logD
* options.
*
* @author Alexander Capehart (OxygenCobalt)
*
* TODO: Handle enabled/disabled states
*/
abstract class MenuDialogFragment<T : Music> :
ViewBindingBottomSheetDialogFragment<DialogMenuBinding>(), ClickableListListener<MenuItem> {
protected abstract val menuModel: MenuViewModel
private val menuAdapter = MenuOptionAdapter(@Suppress("LeakingThis") this)
private val menuAdapter = MenuItemAdapter(@Suppress("LeakingThis") this)
abstract val menuRes: Int
abstract val uid: Music.UID
abstract fun getDisabledItemIds(music: T): Set<Int>
abstract fun updateMusic(binding: DialogMenuBinding, music: T)
abstract fun onClick(music: T, item: MenuItem)
abstract fun onClick(item: MenuItem, music: T)
override fun onCreateBinding(inflater: LayoutInflater) = DialogMenuBinding.inflate(inflater)
@ -66,11 +65,6 @@ abstract class MenuDialogFragment<T : Music> :
itemAnimator = null
}
// Avoid having to use a dummy view and just rely on what AndroidX Toolbar uses.
@SuppressLint("RestrictedApi") val builder = MenuBuilder(requireContext())
MenuInflater(requireContext()).inflate(menuRes, builder)
menuAdapter.update(builder.children.toList(), UpdateInstructions.Diff)
// --- VIEWMODEL SETUP ---
menuModel.setCurrentMenu(uid)
collectImmediately(menuModel.currentMusic, this::updateMusic)
@ -88,11 +82,34 @@ abstract class MenuDialogFragment<T : Music> :
logD("No music to show, navigating away")
findNavController().navigateUp()
}
@Suppress("UNCHECKED_CAST") updateMusic(requireBinding(), music as T)
@Suppress("UNCHECKED_CAST") val castedMusic = music as T
// We need to inflate the menu on every music update since it might have changed
// what options are available (ex. if an artist with no songs has had new songs added).
// Since we don't have (and don't want) a dummy view to inflate this menu, just
// depend on the AndroidX Toolbar internal API and hope for the best.
@SuppressLint("RestrictedApi") val builder = MenuBuilder(requireContext())
MenuInflater(requireContext()).inflate(menuRes, builder)
// Disable any menu options as specified by the impl
val disabledIds = getDisabledItemIds(castedMusic)
val visible =
builder.children.mapTo(mutableListOf()) {
it.isEnabled = !disabledIds.contains(it.itemId)
it
}
menuAdapter.update(visible, UpdateInstructions.Diff)
// Delegate to impl how to show music
updateMusic(requireBinding(), castedMusic)
}
final override fun onClick(item: MenuItem, viewHolder: RecyclerView.ViewHolder) {
// All option selections close the dialog currently.
// TODO: This should change if the app is 100% migrated to menu dialogs
findNavController().navigateUp()
@Suppress("UNCHECKED_CAST") onClick(menuModel.currentMusic.value as T, item)
// Delegate to impl on how to handle items
@Suppress("UNCHECKED_CAST") onClick(item, menuModel.currentMusic.value as T)
}
}

View file

@ -51,6 +51,8 @@ class SongMenuDialogFragment : MenuDialogFragment<Song>() {
override val uid: Music.UID
get() = args.songUid
override fun getDisabledItemIds(music: Song) = setOf<Int>()
override fun updateMusic(binding: DialogMenuBinding, music: Song) {
val context = requireContext()
binding.menuCover.bind(music)
@ -59,7 +61,7 @@ class SongMenuDialogFragment : MenuDialogFragment<Song>() {
binding.menuInfo.text = music.artists.resolveNames(context)
}
override fun onClick(music: Song, item: MenuItem) {
override fun onClick(item: MenuItem, music: Song) {
when (item.itemId) {
R.id.action_play_next -> {
playbackModel.playNext(music)
@ -69,11 +71,11 @@ class SongMenuDialogFragment : MenuDialogFragment<Song>() {
playbackModel.addToQueue(music)
requireContext().showToast(R.string.lng_queue_added)
}
R.id.action_go_artist -> detailModel.showArtist(music)
R.id.action_go_album -> detailModel.showAlbum(music)
R.id.action_artist_details -> detailModel.showArtist(music)
R.id.action_album_details -> detailModel.showAlbum(music)
R.id.action_share -> requireContext().share(music)
R.id.action_playlist_add -> musicModel.addToPlaylist(music)
R.id.action_song_detail -> detailModel.showSong(music)
R.id.action_detail -> detailModel.showSong(music)
else -> error("Unexpected menu item selected $item")
}
}
@ -92,6 +94,8 @@ class AlbumMenuDialogFragment : MenuDialogFragment<Album>() {
override val uid: Music.UID
get() = args.albumUid
override fun getDisabledItemIds(music: Album) = setOf<Int>()
override fun updateMusic(binding: DialogMenuBinding, music: Album) {
val context = requireContext()
binding.menuCover.bind(music)
@ -100,10 +104,11 @@ class AlbumMenuDialogFragment : MenuDialogFragment<Album>() {
binding.menuInfo.text = music.artists.resolveNames(context)
}
override fun onClick(music: Album, item: MenuItem) {
override fun onClick(item: MenuItem, music: Album) {
when (item.itemId) {
R.id.action_play -> playbackModel.play(music)
R.id.action_shuffle -> playbackModel.shuffle(music)
R.id.action_detail -> detailModel.showAlbum(music)
R.id.action_play_next -> {
playbackModel.playNext(music)
requireContext().showToast(R.string.lng_queue_added)
@ -112,7 +117,7 @@ class AlbumMenuDialogFragment : MenuDialogFragment<Album>() {
playbackModel.addToQueue(music)
requireContext().showToast(R.string.lng_queue_added)
}
R.id.action_go_artist -> detailModel.showArtist(music)
R.id.action_artist_details -> detailModel.showArtist(music)
R.id.action_playlist_add -> musicModel.addToPlaylist(music)
R.id.action_share -> requireContext().share(music)
else -> error("Unexpected menu item selected $item")
@ -123,6 +128,7 @@ class AlbumMenuDialogFragment : MenuDialogFragment<Album>() {
@AndroidEntryPoint
class ArtistMenuDialogFragment : MenuDialogFragment<Artist>() {
override val menuModel: MenuViewModel by activityViewModels()
private val detailModel: DetailViewModel by activityViewModels()
private val musicModel: MusicViewModel by activityViewModels()
private val playbackModel: PlaybackViewModel by activityViewModels()
private val args: ArtistMenuDialogFragmentArgs by navArgs()
@ -132,6 +138,19 @@ class ArtistMenuDialogFragment : MenuDialogFragment<Artist>() {
override val uid: Music.UID
get() = args.artistUid
override fun getDisabledItemIds(music: Artist) =
if (music.songs.isEmpty()) {
setOf(
R.id.action_play,
R.id.action_shuffle,
R.id.action_play_next,
R.id.action_queue_add,
R.id.action_playlist_add,
R.id.action_share)
} else {
setOf()
}
override fun updateMusic(binding: DialogMenuBinding, music: Artist) {
val context = requireContext()
binding.menuCover.bind(music)
@ -148,10 +167,11 @@ class ArtistMenuDialogFragment : MenuDialogFragment<Artist>() {
})
}
override fun onClick(music: Artist, item: MenuItem) {
override fun onClick(item: MenuItem, music: Artist) {
when (item.itemId) {
R.id.action_play -> playbackModel.play(music)
R.id.action_shuffle -> playbackModel.shuffle(music)
R.id.action_detail -> detailModel.showArtist(music)
R.id.action_play_next -> {
playbackModel.playNext(music)
requireContext().showToast(R.string.lng_queue_added)
@ -170,6 +190,7 @@ class ArtistMenuDialogFragment : MenuDialogFragment<Artist>() {
@AndroidEntryPoint
class GenreMenuDialogFragment : MenuDialogFragment<Genre>() {
override val menuModel: MenuViewModel by activityViewModels()
private val detailModel: DetailViewModel by activityViewModels()
private val musicModel: MusicViewModel by activityViewModels()
private val playbackModel: PlaybackViewModel by activityViewModels()
private val args: GenreMenuDialogFragmentArgs by navArgs()
@ -179,6 +200,8 @@ class GenreMenuDialogFragment : MenuDialogFragment<Genre>() {
override val uid: Music.UID
get() = args.genreUid
override fun getDisabledItemIds(music: Genre) = setOf<Int>()
override fun updateMusic(binding: DialogMenuBinding, music: Genre) {
val context = requireContext()
binding.menuCover.bind(music)
@ -191,10 +214,11 @@ class GenreMenuDialogFragment : MenuDialogFragment<Genre>() {
context.getPlural(R.plurals.fmt_song_count, music.songs.size))
}
override fun onClick(music: Genre, item: MenuItem) {
override fun onClick(item: MenuItem, music: Genre) {
when (item.itemId) {
R.id.action_play -> playbackModel.play(music)
R.id.action_shuffle -> playbackModel.shuffle(music)
R.id.action_detail -> detailModel.showGenre(music)
R.id.action_play_next -> {
playbackModel.playNext(music)
requireContext().showToast(R.string.lng_queue_added)
@ -213,6 +237,7 @@ class GenreMenuDialogFragment : MenuDialogFragment<Genre>() {
@AndroidEntryPoint
class PlaylistMenuDialogFragment : MenuDialogFragment<Playlist>() {
override val menuModel: MenuViewModel by activityViewModels()
private val detailModel: DetailViewModel by activityViewModels()
private val musicModel: MusicViewModel by activityViewModels()
private val playbackModel: PlaybackViewModel by activityViewModels()
private val args: PlaylistMenuDialogFragmentArgs by navArgs()
@ -222,18 +247,37 @@ class PlaylistMenuDialogFragment : MenuDialogFragment<Playlist>() {
override val uid: Music.UID
get() = args.playlistUid
override fun getDisabledItemIds(music: Playlist) =
if (music.songs.isEmpty()) {
setOf(
R.id.action_play,
R.id.action_shuffle,
R.id.action_play_next,
R.id.action_queue_add,
R.id.action_playlist_add,
R.id.action_share)
} else {
setOf()
}
override fun updateMusic(binding: DialogMenuBinding, music: Playlist) {
val context = requireContext()
binding.menuCover.bind(music)
binding.menuType.text = getString(R.string.lbl_playlist)
binding.menuName.text = music.name.resolve(context)
binding.menuInfo.text = context.getPlural(R.plurals.fmt_song_count, music.songs.size)
binding.menuInfo.text =
if (music.songs.isNotEmpty()) {
context.getPlural(R.plurals.fmt_song_count, music.songs.size)
} else {
getString(R.string.def_song_count)
}
}
override fun onClick(music: Playlist, item: MenuItem) {
override fun onClick(item: MenuItem, music: Playlist) {
when (item.itemId) {
R.id.action_play -> playbackModel.play(music)
R.id.action_shuffle -> playbackModel.shuffle(music)
R.id.action_detail -> detailModel.showPlaylist(music)
R.id.action_play_next -> {
playbackModel.playNext(music)
requireContext().showToast(R.string.lng_queue_added)

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2023 Auxio Project
* MenuOptionAdapter.kt is part of Auxio.
* MenuItemAdapter.kt is part of Auxio.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -30,15 +30,15 @@ import org.oxycblt.auxio.util.inflater
/**
* Displays a list of [MenuItem]s as custom list items.
*
* @param listener A [MenuOptionAdapter] to bind interactions to.
* @param listener A [ClickableListListener] to bind interactions to.
* @author Alexander Capehart (OxygenCobalt)
*/
class MenuOptionAdapter(private val listener: ClickableListListener<MenuItem>) :
FlexibleListAdapter<MenuItem, MenuOptionViewHolder>(MenuOptionViewHolder.DIFF_CALLBACK) {
class MenuItemAdapter(private val listener: ClickableListListener<MenuItem>) :
FlexibleListAdapter<MenuItem, MenuItemViewHolder>(MenuItemViewHolder.DIFF_CALLBACK) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
MenuOptionViewHolder.from(parent)
MenuItemViewHolder.from(parent)
override fun onBindViewHolder(holder: MenuOptionViewHolder, position: Int) {
override fun onBindViewHolder(holder: MenuItemViewHolder, position: Int) {
holder.bind(getItem(position), listener)
}
}
@ -48,11 +48,21 @@ class MenuOptionAdapter(private val listener: ClickableListListener<MenuItem>) :
*
* @author Alexander Capehart (OxygenCobalt)
*/
class MenuOptionViewHolder private constructor(private val binding: ItemMenuOptionBinding) :
class MenuItemViewHolder private constructor(private val binding: ItemMenuOptionBinding) :
DialogRecyclerView.ViewHolder(binding.root) {
/**
* Bind new data to this instance.
*
* @param item The new [MenuItem] to bind.
* @param listener An [ClickableListListener] to bind interactions to.
*/
fun bind(item: MenuItem, listener: ClickableListListener<MenuItem>) {
listener.bind(item, this)
binding.title.text = item.title
binding.title.apply {
text = item.title
setCompoundDrawablesRelativeWithIntrinsicBounds(item.icon, null, null, null)
isEnabled = item.isEnabled
}
}
companion object {
@ -63,7 +73,7 @@ class MenuOptionViewHolder private constructor(private val binding: ItemMenuOpti
* @return A new instance.
*/
fun from(parent: ViewGroup) =
MenuOptionViewHolder(ItemMenuOptionBinding.inflate(parent.context.inflater))
MenuItemViewHolder(ItemMenuOptionBinding.inflate(parent.context.inflater))
/** A comparator that can be used with DiffUtil. */
val DIFF_CALLBACK =

View file

@ -56,22 +56,19 @@ class MenuViewModel @Inject constructor(private val musicRepository: MusicReposi
musicRepository.removeUpdateListener(this)
}
fun openMenu(@MenuRes menuRes: Int, song: Song) =
openMenuImpl(PendingMenu.ForSong(menuRes, song))
fun open(@MenuRes menuRes: Int, song: Song) = openImpl(PendingMenu.ForSong(menuRes, song))
fun openMenu(@MenuRes menuRes: Int, album: Album) =
openMenuImpl(PendingMenu.ForAlbum(menuRes, album))
fun open(@MenuRes menuRes: Int, album: Album) = openImpl(PendingMenu.ForAlbum(menuRes, album))
fun openMenu(@MenuRes menuRes: Int, artist: Artist) =
openMenuImpl(PendingMenu.ForArtist(menuRes, artist))
fun open(@MenuRes menuRes: Int, artist: Artist) =
openImpl(PendingMenu.ForArtist(menuRes, artist))
fun openMenu(@MenuRes menuRes: Int, genre: Genre) =
openMenuImpl(PendingMenu.ForGenre(menuRes, genre))
fun open(@MenuRes menuRes: Int, genre: Genre) = openImpl(PendingMenu.ForGenre(menuRes, genre))
fun openMenu(@MenuRes menuRes: Int, playlist: Playlist) =
openMenuImpl(PendingMenu.ForPlaylist(menuRes, playlist))
fun open(@MenuRes menuRes: Int, playlist: Playlist) =
openImpl(PendingMenu.ForPlaylist(menuRes, playlist))
private fun openMenuImpl(pendingMenu: PendingMenu) {
private fun openImpl(pendingMenu: PendingMenu) {
val existing = _pendingMenu.flow.value
if (existing != null) {
logW("Already opening $existing, ignoring $pendingMenu")

View file

@ -164,11 +164,11 @@ class PlaybackPanelFragment :
}
true
}
R.id.action_go_artist -> {
R.id.action_artist_details -> {
navigateToCurrentArtist()
true
}
R.id.action_go_album -> {
R.id.action_album_details -> {
navigateToCurrentAlbum()
true
}
@ -176,7 +176,7 @@ class PlaybackPanelFragment :
playbackModel.song.value?.let(musicModel::addToPlaylist)
true
}
R.id.action_song_detail -> {
R.id.action_detail -> {
playbackModel.song.value?.let(detailModel::showSong)
true
}

View file

@ -184,11 +184,11 @@ class SearchFragment : ListFragment<Music, FragmentSearchBinding>() {
override fun onOpenMenu(item: Music, anchor: View) {
when (item) {
is Song -> menuModel.openMenu(R.menu.item_song, item)
is Album -> menuModel.openMenu(R.menu.item_album, item)
is Artist -> menuModel.openMenu(R.menu.item_parent, item)
is Genre -> menuModel.openMenu(R.menu.item_parent, item)
is Playlist -> menuModel.openMenu(R.menu.item_playlist, item)
is Song -> menuModel.open(R.menu.item_song, item)
is Album -> menuModel.open(R.menu.item_album, item)
is Artist -> menuModel.open(R.menu.item_parent, item)
is Genre -> menuModel.open(R.menu.item_parent, item)
is Playlist -> menuModel.open(R.menu.item_playlist, item)
}
}

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M360,720L800,720Q800,720 800,720Q800,720 800,720L800,613L360,613L360,720ZM160,347L280,347L280,240L160,240Q160,240 160,240Q160,240 160,240L160,347ZM160,534L280,534L280,427L160,427L160,534ZM160,720L280,720L280,613L160,613L160,720Q160,720 160,720Q160,720 160,720ZM360,534L800,534L800,427L360,427L360,534ZM360,347L800,347L800,240Q800,240 800,240Q800,240 800,240L360,240L360,347ZM160,800Q127,800 103.5,776.5Q80,753 80,720L80,240Q80,207 103.5,183.5Q127,160 160,160L800,160Q833,160 856.5,183.5Q880,207 880,240L880,720Q880,753 856.5,776.5Q833,800 800,800L160,800Z"/>
</vector>

View file

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M13,14H15V11H18V9H15V6H13V9H10V11H13ZM8,18Q7.175,18 6.588,17.413Q6,16.825 6,16V4Q6,3.175 6.588,2.587Q7.175,2 8,2H20Q20.825,2 21.413,2.587Q22,3.175 22,4V16Q22,16.825 21.413,17.413Q20.825,18 20,18ZM8,16H20Q20,16 20,16Q20,16 20,16V4Q20,4 20,4Q20,4 20,4H8Q8,4 8,4Q8,4 8,4V16Q8,16 8,16Q8,16 8,16ZM4,22Q3.175,22 2.588,21.413Q2,20.825 2,20V6H4V20Q4,20 4,20Q4,20 4,20H18V22ZM8,4Q8,4 8,4Q8,4 8,4V16Q8,16 8,16Q8,16 8,16Q8,16 8,16Q8,16 8,16V4Q8,4 8,4Q8,4 8,4Z"/>
</vector>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M780,900L720,840L840,720L720,600L780,540L960,720L780,900ZM320,840L320,760L160,760Q127,760 103.5,736.5Q80,713 80,680L80,200Q80,167 103.5,143.5Q127,120 160,120L800,120Q833,120 856.5,143.5Q880,167 880,200L880,480L800,480L800,200Q800,200 800,200Q800,200 800,200L160,200Q160,200 160,200Q160,200 160,200L160,680Q160,680 160,680Q160,680 160,680L680,680L680,760L600,760L600,840L320,840ZM440,600L520,600L520,480L640,480L640,400L520,400L520,280L440,280L440,400L320,400L320,480L440,480L440,600ZM160,680L160,680Q160,680 160,680Q160,680 160,680L160,200Q160,200 160,200Q160,200 160,200L160,200Q160,200 160,200Q160,200 160,200L160,680L160,680L160,680Z"/>
</vector>

View file

@ -3,9 +3,10 @@
xmlns:aapt="http://schemas.android.com/aapt">
<!--
Yes, this whole file is the material equalizer icon influenced by Spotify's
equalizer animation with each vector inlined using aapt:attr so that it does
not clutter the drawable folder.
I kind of like Spotify's little equalizer playing indicator, so I tried to make
the material symbols equalizer icon animate in a similar way. I got the best
results doing it frame by frame, but to avoid cluttering the drawable folder I
bundled them up with AAPT inlining, hence this monster of a file.
-->
<!-- Frame 1 -->

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M120,640L120,560L400,560L400,640L120,640ZM120,480L120,400L560,400L560,480L120,480ZM120,320L120,240L560,240L560,320L120,320ZM640,800L640,640L480,640L480,560L640,560L640,400L720,400L720,560L880,560L880,640L720,640L720,800L640,800Z"/>
</vector>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M440,600L520,600L520,480L640,480L640,400L520,400L520,280L440,280L440,400L320,400L320,480L440,480L440,600ZM320,840L320,760L160,760Q127,760 103.5,736.5Q80,713 80,680L80,200Q80,167 103.5,143.5Q127,120 160,120L800,120Q833,120 856.5,143.5Q880,167 880,200L880,680Q880,713 856.5,736.5Q833,760 800,760L640,760L640,840L320,840ZM160,680L800,680Q800,680 800,680Q800,680 800,680L800,200Q800,200 800,200Q800,200 800,200L160,200Q160,200 160,200Q160,200 160,200L160,680Q160,680 160,680Q160,680 160,680ZM160,680Q160,680 160,680Q160,680 160,680L160,200Q160,200 160,200Q160,200 160,200L160,200Q160,200 160,200Q160,200 160,200L160,680Q160,680 160,680Q160,680 160,680L160,680Z"/>
</vector>

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M720,880Q670,880 635,845Q600,810 600,760Q600,753 601,745.5Q602,738 604,732L322,568Q305,583 284,591.5Q263,600 240,600Q190,600 155,565Q120,530 120,480Q120,430 155,395Q190,360 240,360Q263,360 284,368.5Q305,377 322,392L604,228Q602,222 601,214.5Q600,207 600,200Q600,150 635,115Q670,80 720,80Q770,80 805,115Q840,150 840,200Q840,250 805,285Q770,320 720,320Q697,320 676,311.5Q655,303 638,288L356,452Q358,458 359,465.5Q360,473 360,480Q360,487 359,494.5Q358,502 356,508L638,672Q655,657 676,648.5Q697,640 720,640Q770,640 805,675Q840,710 840,760Q840,810 805,845Q770,880 720,880ZM720,240Q737,240 748.5,228.5Q760,217 760,200Q760,183 748.5,171.5Q737,160 720,160Q703,160 691.5,171.5Q680,183 680,200Q680,217 691.5,228.5Q703,240 720,240ZM240,520Q257,520 268.5,508.5Q280,497 280,480Q280,463 268.5,451.5Q257,440 240,440Q223,440 211.5,451.5Q200,463 200,480Q200,497 211.5,508.5Q223,520 240,520ZM720,800Q737,800 748.5,788.5Q760,777 760,760Q760,743 748.5,731.5Q737,720 720,720Q703,720 691.5,731.5Q680,743 680,760Q680,777 691.5,788.5Q703,800 720,800ZM720,200Q720,200 720,200Q720,200 720,200Q720,200 720,200Q720,200 720,200Q720,200 720,200Q720,200 720,200Q720,200 720,200Q720,200 720,200ZM240,480Q240,480 240,480Q240,480 240,480Q240,480 240,480Q240,480 240,480Q240,480 240,480Q240,480 240,480Q240,480 240,480Q240,480 240,480ZM720,760Q720,760 720,760Q720,760 720,760Q720,760 720,760Q720,760 720,760Q720,760 720,760Q720,760 720,760Q720,760 720,760Q720,760 720,760Z"/>
</vector>

View file

@ -20,7 +20,7 @@
<path
android:name="note"
android:fillColor="@android:color/transparent"
android:pathData="M 13,4.0000207 17,8 M 12.999969,4.0004121 V 17.000315 m 0,-2.94e-4 -3.0000004,3 -2.9999997,-3 2.9999997,-3 M 7.021336,16.939069"
android:pathData="M13 4l4 4m-4-4v13m0 0l-3 3-3-3 3-3"
android:strokeWidth="2"
android:strokeColor="@android:color/white"
android:strokeLineCap="round"

View file

@ -1,12 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.appcompat.widget.AppCompatTextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@android:id/title"
android:textAppearance="@style/TextAppearance.Auxio.TitleMedium"
android:padding="@dimen/spacing_medium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:background="@drawable/ui_item_ripple"
android:padding="@dimen/spacing_medium"
android:textColor="@color/sel_selectable_text_primary"
style="@style/Widget.Auxio.TextView.Icon.Clickable"
app:drawableStartCompat="@drawable/ic_edit_24"
app:drawableTint="@color/sel_activatable_icon"
tools:text="Songs" />

View file

@ -1,18 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_play"
android:title="@string/lbl_play"
android:icon="@drawable/ic_play_24" />
<item
android:id="@+id/action_shuffle"
android:title="@string/lbl_shuffle"
android:icon="@drawable/ic_shuffle_off_24"/>
<item
android:id="@+id/action_detail"
android:title="@string/lbl_parent_detail"
android:icon="@drawable/ic_details_24" />
<item
android:id="@+id/action_play_next"
android:title="@string/lbl_play_next" />
android:title="@string/lbl_play_next"
android:icon="@drawable/ic_play_next_24"/>
<item
android:id="@+id/action_queue_add"
android:title="@string/lbl_queue_add" />
<item
android:id="@+id/action_go_artist"
android:title="@string/lbl_go_artist" />
android:title="@string/lbl_queue_add"
android:icon="@drawable/ic_queue_add_24"/>
<item
android:id="@+id/action_playlist_add"
android:title="@string/lbl_playlist_add" />
android:title="@string/lbl_playlist_add"
android:icon="@drawable/ic_playlist_add_24"/>
<item
android:id="@+id/action_artist_details"
android:title="@string/lbl_artist_details"
android:icon="@drawable/ic_artist_24" />
<item
android:id="@+id/action_share"
android:title="@string/lbl_share" />
android:title="@string/lbl_share"
android:icon="@drawable/ic_share_24"/>
</menu>

View file

@ -1,20 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_play"
android:title="@string/lbl_play"
android:icon="@drawable/ic_play_24" />
<item
android:id="@+id/action_shuffle"
android:title="@string/lbl_shuffle"
android:icon="@drawable/ic_shuffle_off_24"/>
<item
android:id="@+id/action_play_next"
android:title="@string/lbl_play_next" />
android:title="@string/lbl_play_next"
android:icon="@drawable/ic_play_next_24"/>
<item
android:id="@+id/action_queue_add"
android:title="@string/lbl_queue_add" />
<item
android:id="@+id/action_go_artist"
android:title="@string/lbl_go_artist" />
android:title="@string/lbl_queue_add"
android:icon="@drawable/ic_queue_add_24"/>
<item
android:id="@+id/action_playlist_add"
android:title="@string/lbl_playlist_add" />
android:title="@string/lbl_playlist_add"
android:icon="@drawable/ic_playlist_add_24"/>
<item
android:id="@+id/action_song_detail"
android:title="@string/lbl_song_detail" />
android:id="@+id/action_artist_details"
android:title="@string/lbl_artist_details"
android:icon="@drawable/ic_artist_24" />
<item
android:id="@+id/action_detail"
android:title="@string/lbl_song_detail"
android:icon="@drawable/ic_details_24" />
<item
android:id="@+id/action_share"
android:title="@string/lbl_share" />

View file

@ -4,21 +4,29 @@
<item
android:id="@+id/action_play"
android:title="@string/lbl_play"
app:showAsAction="never" />
android:icon="@drawable/ic_play_24" />
<item
android:id="@+id/action_shuffle"
android:title="@string/lbl_shuffle"
app:showAsAction="never" />
android:icon="@drawable/ic_shuffle_off_24"/>
<item
android:id="@+id/action_detail"
android:title="@string/lbl_parent_detail"
android:icon="@drawable/ic_details_24" />
<item
android:id="@+id/action_play_next"
android:title="@string/lbl_play_next" />
android:title="@string/lbl_play_next"
android:icon="@drawable/ic_play_next_24"/>
<item
android:id="@+id/action_queue_add"
android:title="@string/lbl_queue_add" />
android:title="@string/lbl_queue_add"
android:icon="@drawable/ic_queue_add_24"/>
<item
android:id="@+id/action_playlist_add"
android:title="@string/lbl_playlist_add" />
android:title="@string/lbl_playlist_add"
android:icon="@drawable/ic_playlist_add_24"/>
<item
android:id="@+id/action_share"
android:title="@string/lbl_share" />
android:title="@string/lbl_share"
android:icon="@drawable/ic_share_24"/>
</menu>

View file

@ -1,21 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_play"
android:title="@string/lbl_play"
android:icon="@drawable/ic_play_24" />
<item
android:id="@+id/action_shuffle"
android:title="@string/lbl_shuffle"
android:icon="@drawable/ic_shuffle_off_24"/>
<item
android:id="@+id/action_play_next"
android:title="@string/lbl_play_next" />
android:title="@string/lbl_play_next"
android:icon="@drawable/ic_play_next_24"/>
<item
android:id="@+id/action_queue_add"
android:title="@string/lbl_queue_add" />
<item
android:id="@+id/action_go_album"
android:title="@string/lbl_go_album" />
android:title="@string/lbl_queue_add"
android:icon="@drawable/ic_queue_add_24"/>
<item
android:id="@+id/action_playlist_add"
android:title="@string/lbl_playlist_add" />
android:title="@string/lbl_playlist_add"
android:icon="@drawable/ic_playlist_add_24"/>
<item
android:id="@+id/action_song_detail"
android:title="@string/lbl_song_detail" />
android:id="@+id/action_album_details"
android:title="@string/lbl_album_details"
android:icon="@drawable/ic_album_24" />
<item
android:id="@+id/action_detail"
android:title="@string/lbl_song_detail"
android:icon="@drawable/ic_details_24" />
<item
android:id="@+id/action_share"
android:title="@string/lbl_share" />
android:title="@string/lbl_share"
android:icon="@drawable/ic_share_24"/>
</menu>

View file

@ -2,20 +2,31 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_play"
android:title="@string/lbl_play" />
android:title="@string/lbl_play"
android:icon="@drawable/ic_play_24" />
<item
android:id="@+id/action_shuffle"
android:title="@string/lbl_shuffle" />
android:title="@string/lbl_shuffle"
android:icon="@drawable/ic_shuffle_off_24"/>
<item
android:id="@+id/action_detail"
android:title="@string/lbl_parent_detail"
android:icon="@drawable/ic_details_24" />
<item
android:id="@+id/action_play_next"
android:title="@string/lbl_play_next" />
android:title="@string/lbl_play_next"
android:icon="@drawable/ic_play_next_24"/>
<item
android:id="@+id/action_queue_add"
android:title="@string/lbl_queue_add" />
android:title="@string/lbl_queue_add"
android:icon="@drawable/ic_queue_add_24"/>
<item
android:id="@+id/action_playlist_add"
android:title="@string/lbl_playlist_add" />
android:title="@string/lbl_playlist_add"
android:icon="@drawable/ic_playlist_add_24" />
<item
android:id="@+id/action_share"
android:title="@string/lbl_share" />
android:title="@string/lbl_share"
android:icon="@drawable/ic_share_24"/>
</menu>

View file

@ -2,23 +2,34 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_play"
android:title="@string/lbl_play" />
android:title="@string/lbl_play"
android:icon="@drawable/ic_play_24" />
<item
android:id="@+id/action_shuffle"
android:title="@string/lbl_shuffle" />
android:title="@string/lbl_shuffle"
android:icon="@drawable/ic_shuffle_off_24"/>
<item
android:id="@+id/action_detail"
android:title="@string/lbl_parent_detail"
android:icon="@drawable/ic_details_24" />
<item
android:id="@+id/action_play_next"
android:title="@string/lbl_play_next" />
android:title="@string/lbl_play_next"
android:icon="@drawable/ic_play_next_24"/>
<item
android:id="@+id/action_queue_add"
android:title="@string/lbl_queue_add" />
android:title="@string/lbl_queue_add"
android:icon="@drawable/ic_queue_add_24"/>
<item
android:id="@+id/action_rename"
android:title="@string/lbl_rename" />
android:title="@string/lbl_rename"
android:icon="@drawable/ic_edit_24"/>
<item
android:id="@+id/action_delete"
android:title="@string/lbl_delete" />
android:title="@string/lbl_delete"
android:icon="@drawable/ic_delete_24"/>
<item
android:id="@+id/action_share"
android:title="@string/lbl_share" />
android:title="@string/lbl_share"
android:icon="@drawable/ic_share_24"/>
</menu>

View file

@ -1,21 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_play"
android:title="@string/lbl_play"
android:icon="@drawable/ic_play_24" />
<item
android:id="@+id/action_shuffle"
android:title="@string/lbl_shuffle"
android:icon="@drawable/ic_shuffle_off_24" />
<item
android:id="@+id/action_play_next"
android:title="@string/lbl_play_next" />
android:title="@string/lbl_play_next"
android:icon="@drawable/ic_details_24" />
<item
android:id="@+id/action_queue_add"
android:title="@string/lbl_queue_add" />
android:title="@string/lbl_queue_add"
android:icon="@drawable/ic_queue_add_24" />
<item
android:id="@+id/action_go_artist"
android:title="@string/lbl_go_artist" />
android:id="@+id/action_artist_details"
android:title="@string/lbl_artist_details"
android:icon="@drawable/ic_artist_24" />
<item
android:id="@+id/action_go_album"
android:title="@string/lbl_go_album" />
android:id="@+id/action_album_details"
android:title="@string/lbl_album_details"
android:icon="@drawable/ic_album_24" />
<item
android:id="@+id/action_song_detail"
android:title="@string/lbl_song_detail" />
android:id="@+id/action_detail"
android:title="@string/lbl_song_detail"
android:icon="@drawable/ic_details_24" />
<item
android:id="@+id/action_share"
android:title="@string/lbl_share" />
android:title="@string/lbl_share"
android:icon="@drawable/ic_share_24"/>
</menu>

View file

@ -1,24 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_play"
android:title="@string/lbl_play"
android:icon="@drawable/ic_play_24" />
<item
android:id="@+id/action_shuffle"
android:title="@string/lbl_shuffle"
android:icon="@drawable/ic_shuffle_off_24" />
<item
android:id="@+id/action_play_next"
android:title="@string/lbl_play_next" />
android:title="@string/lbl_play_next"
android:icon="@drawable/ic_play_next_24" />
<item
android:id="@+id/action_queue_add"
android:title="@string/lbl_queue_add" />
<item
android:id="@+id/action_go_artist"
android:title="@string/lbl_go_artist" />
<item
android:id="@+id/action_go_album"
android:title="@string/lbl_go_album" />
android:title="@string/lbl_queue_add"
android:icon="@drawable/ic_queue_add_24" />
<item
android:id="@+id/action_playlist_add"
android:title="@string/lbl_playlist_add" />
android:title="@string/lbl_playlist_add"
android:icon="@drawable/ic_playlist_add_24" />
<item
android:id="@+id/action_song_detail"
android:title="@string/lbl_song_detail" />
android:id="@+id/action_artist_details"
android:title="@string/lbl_artist_details"
android:icon="@drawable/ic_artist_24" />
<item
android:id="@+id/action_album_details"
android:title="@string/lbl_album_details"
android:icon="@drawable/ic_album_24" />
<item
android:id="@+id/action_detail"
android:title="@string/lbl_song_detail"
android:icon="@drawable/ic_details_24" />
<item
android:id="@+id/action_share"
android:title="@string/lbl_share" />
android:title="@string/lbl_share"
android:icon="@drawable/ic_share_24" />
</menu>

View file

@ -7,8 +7,8 @@
android:id="@+id/action_queue_add"
android:title="@string/lbl_queue_add" />
<item
android:id="@+id/action_go_artist"
android:title="@string/lbl_go_artist" />
android:id="@+id/action_artist_details"
android:title="@string/lbl_artist_details" />
<item
android:id="@+id/action_playlist_add"
android:title="@string/lbl_playlist_add" />

View file

@ -7,18 +7,18 @@
android:title="@string/lbl_equalizer"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_go_artist"
android:title="@string/lbl_go_artist"
android:id="@+id/action_artist_details"
android:title="@string/lbl_artist_details"
app:showAsAction="never" />
<item
android:id="@+id/action_go_album"
android:title="@string/lbl_go_album"
android:id="@+id/action_album_details"
android:title="@string/lbl_album_details"
app:showAsAction="never" />
<item
android:id="@+id/action_playlist_add"
android:title="@string/lbl_playlist_add" />
<item
android:id="@+id/action_song_detail"
android:id="@+id/action_detail"
android:title="@string/lbl_song_detail"
app:showAsAction="never" />
<item

View file

@ -4,7 +4,7 @@
<item
android:id="@+id/action_selection_play_next"
android:title="@string/lbl_play_next"
android:icon="@drawable/ic_play_next"
android:icon="@drawable/ic_play_next_24"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/action_selection_queue_add"

View file

@ -30,8 +30,8 @@
<string name="lbl_play_next">شغل الاغنية التالية</string>
<string name="lbl_queue_add">أضف إلى الطابور</string>
<string name="lng_queue_added">تمت الإضافة إلى الطابور</string>
<string name="lbl_go_artist">أذهب إلى الفنان</string>
<string name="lbl_go_album">أذهب إلى الالبوم</string>
<string name="lbl_artist_details">أذهب إلى الفنان</string>
<string name="lbl_album_details">أذهب إلى الالبوم</string>
<string name="lbl_state_saved">تم حفظ الحالة</string>
<string name="lbl_add">أضف</string>
<string name="lbl_save">حفظ</string>

View file

@ -83,8 +83,8 @@
<string name="lbl_equalizer">Эквалайзер</string>
<string name="lbl_play_selected">Гуляць выбрана</string>
<string name="lbl_queue">Чарга</string>
<string name="lbl_go_album">Перайсці да альбома</string>
<string name="lbl_go_artist">Перайсці да выканаўцы</string>
<string name="lbl_album_details">Перайсці да альбома</string>
<string name="lbl_artist_details">Перайсці да выканаўцы</string>
<string name="lbl_file_name">Імя файла</string>
<string name="lbl_song_detail">Праглядзіце ўласцівасці</string>
<string name="lbl_props">Уласцівасці песні</string>

View file

@ -36,8 +36,8 @@
<string name="lbl_play_next">Přehrát další</string>
<string name="lbl_queue_add">Přidat do fronty</string>
<string name="lng_queue_added">Přidáno do fronty</string>
<string name="lbl_go_artist">Přejít na umělce</string>
<string name="lbl_go_album">Přejít na album</string>
<string name="lbl_artist_details">Přejít na umělce</string>
<string name="lbl_album_details">Přejít na album</string>
<string name="lbl_state_saved">Stav uložen</string>
<!-- Actual string: Ok -->
<string name="lbl_ok">OK</string>

View file

@ -22,8 +22,8 @@
<string name="lbl_play_next">Als Nächstes abspielen</string>
<string name="lbl_queue_add">Zur Warteschlange hinzufügen</string>
<string name="lng_queue_added">Der Warteschlange hinzugefügt</string>
<string name="lbl_go_artist">Zum Künstler gehen</string>
<string name="lbl_go_album">Zum Album gehen</string>
<string name="lbl_artist_details">Zum Künstler gehen</string>
<string name="lbl_album_details">Zum Album gehen</string>
<string name="lbl_state_saved">Wiedergabezustand gespeichert</string>
<string name="lbl_add">Hinzufügen</string>
<string name="lbl_save">Speichern</string>

View file

@ -19,8 +19,8 @@
<string name="lbl_play_next">Επόμενο</string>
<string name="lbl_queue_add">Προσθήκη στην ουρά αναπ/γής</string>
<string name="lng_queue_added">Προστέθηκε ένας τίτλος στην ουρά αναπαραγωγής</string>
<string name="lbl_go_artist">Πήγαινε στον καλλιτέχνη</string>
<string name="lbl_go_album">Πήγαινε στο άλμπουμ</string>
<string name="lbl_artist_details">Πήγαινε στον καλλιτέχνη</string>
<string name="lbl_album_details">Πήγαινε στο άλμπουμ</string>
<string name="lbl_about">Σχετικά με</string>
<string name="lbl_version">Έκδοση</string>
<string name="lbl_code">Πηγαίος κώδικας</string>

View file

@ -30,8 +30,8 @@
<string name="lbl_play_next">Reproducir siguiente</string>
<string name="lbl_queue_add">Agregar a la cola</string>
<string name="lng_queue_added">Agregado a la cola</string>
<string name="lbl_go_artist">Ir al artista</string>
<string name="lbl_go_album">Ir al álbum</string>
<string name="lbl_artist_details">Ir al artista</string>
<string name="lbl_album_details">Ir al álbum</string>
<string name="lbl_state_saved">Estado guardado</string>
<string name="lbl_add">Agregar</string>
<string name="lbl_save">Guardar</string>

View file

@ -41,7 +41,7 @@
<string name="lbl_shuffle">Sekoita</string>
<string name="lbl_queue">Jono</string>
<string name="lbl_queue_add">Lisää jonoon</string>
<string name="lbl_go_album">Siirry albumiin</string>
<string name="lbl_album_details">Siirry albumiin</string>
<string name="lbl_song_detail">Näytä ominaisuudet</string>
<string name="lbl_props">Kappaleen ominaisuudet</string>
<string name="lbl_file_name">Tiedostonimi</string>
@ -211,7 +211,7 @@
</plurals>
<string name="lbl_sort_asc">Nousevasti</string>
<string name="lbl_play_next">Toista seuraava</string>
<string name="lbl_go_artist">Siirry esittäjään</string>
<string name="lbl_artist_details">Siirry esittäjään</string>
<string name="set_content">Sisältö</string>
<string name="set_music">Musiikki</string>
<string name="set_images">Kuvat</string>

View file

@ -42,8 +42,8 @@
<string name="lbl_play_next">Tugtugin pagkatapos</string>
<string name="lbl_queue_add">Idagdag sa pila</string>
<string name="lng_queue_added">Idiinagdag sa pila</string>
<string name="lbl_go_artist">Puntahan ang artista</string>
<string name="lbl_go_album">Puntahan ang album</string>
<string name="lbl_artist_details">Puntahan ang artista</string>
<string name="lbl_album_details">Puntahan ang album</string>
<string name="lbl_song_detail">Tignan ang katangian</string>
<string name="lbl_props">Katangian ng kanta</string>
<string name="lbl_file_name">Pangalan ng file</string>

View file

@ -20,8 +20,8 @@
<string name="lbl_play_next">Jouer ensuite</string>
<string name="lbl_queue_add">Ajouter à la file d\'attente</string>
<string name="lng_queue_added">Ajouté à la file d\'attente</string>
<string name="lbl_go_album">Aller à l\'album</string>
<string name="lbl_go_artist">Aller à l\'artiste</string>
<string name="lbl_album_details">Aller à l\'album</string>
<string name="lbl_artist_details">Aller à l\'artiste</string>
<string name="lbl_about">À propos</string>
<string name="lbl_version">Version</string>
<string name="lbl_code">Code source</string>

View file

@ -32,7 +32,7 @@
<string name="lbl_single_live">Sinxelo en directo</string>
<string name="lbl_compilation_live">Compilación en directo</string>
<string name="lbl_mixes">Mesturas</string>
<string name="lbl_go_album">Ir ao álbum</string>
<string name="lbl_album_details">Ir ao álbum</string>
<string name="lbl_genres">Xéneros</string>
<string name="lbl_genre">Xénero</string>
<string name="lbl_filter">Filtro</string>
@ -53,7 +53,7 @@
<string name="lbl_queue">Cola</string>
<string name="lbl_queue_add">Engadir á cola</string>
<string name="set_exclude_non_music">Excluir o que non é música</string>
<string name="lbl_go_artist">Ir ao artista</string>
<string name="lbl_artist_details">Ir ao artista</string>
<string name="lbl_file_name">Nome do arquivo</string>
<string name="lbl_shuffle_shortcut_short">Mesturar</string>
<string name="lbl_shuffle_shortcut_long">Mesturar todo</string>

View file

@ -13,8 +13,8 @@
<string name="lbl_sort">क्रमबद्ध</string>
<string name="lbl_play">चलाएं</string>
<string name="lbl_shuffle">शफ़ल</string>
<string name="lbl_go_artist">कलाकार पर जाएं</string>
<string name="lbl_go_album">एल्बम पर जाएं</string>
<string name="lbl_artist_details">कलाकार पर जाएं</string>
<string name="lbl_album_details">एल्बम पर जाएं</string>
<string name="lbl_queue">पंक्ति</string>
<string name="lbl_queue_add">क़तार में जोड़ें</string>
<string name="lng_queue_added">कतार में जोड़ा गया</string>

View file

@ -179,8 +179,8 @@
<string name="lbl_queue_add">Dodaj u popis pjesama</string>
<string name="lng_queue_added">Dodano u popis pjesama</string>
<string name="lbl_song_detail">Prikaži svojstva</string>
<string name="lbl_go_artist">Idi na izvođača</string>
<string name="lbl_go_album">Idi na album</string>
<string name="lbl_artist_details">Idi na izvođača</string>
<string name="lbl_album_details">Idi na album</string>
<string name="set_keep_shuffle_desc">Ostavi miješanje omogućeno kada se druga pjesma reproducira</string>
<string name="set_root_title">Postavke</string>
<string name="set_theme">Tema</string>

View file

@ -20,8 +20,8 @@
<string name="lbl_play_next">Következő lejátszása</string>
<string name="lbl_queue_add">Várósorhoz ad</string>
<string name="lng_queue_added">Sorbaállítva</string>
<string name="lbl_go_artist">Ugrás előadóhoz</string>
<string name="lbl_go_album">Ugrás albumhoz</string>
<string name="lbl_artist_details">Ugrás előadóhoz</string>
<string name="lbl_album_details">Ugrás albumhoz</string>
<string name="lbl_about">Rólunk</string>
<string name="lbl_version">Verzió</string>
<string name="lbl_code">Forráskód</string>

View file

@ -20,8 +20,8 @@
<string name="lbl_play_next">Putar berikutnya</string>
<string name="lbl_queue_add">Tambahkan ke antrean</string>
<string name="lng_queue_added">Ditambahkan ke antrean</string>
<string name="lbl_go_artist">Buka artis</string>
<string name="lbl_go_album">Buka album</string>
<string name="lbl_artist_details">Buka artis</string>
<string name="lbl_album_details">Buka album</string>
<string name="lbl_about">Tentang</string>
<string name="lbl_version">Versi</string>
<string name="lbl_code">Kode sumber</string>

View file

@ -30,8 +30,8 @@
<string name="lbl_play_next">Riproduci successivo</string>
<string name="lbl_queue_add">Accoda</string>
<string name="lng_queue_added">Accodato</string>
<string name="lbl_go_artist">Vai all\'artista</string>
<string name="lbl_go_album">Vai all\'album</string>
<string name="lbl_artist_details">Vai all\'artista</string>
<string name="lbl_album_details">Vai all\'album</string>
<string name="lbl_state_saved">Stato salvato</string>
<string name="lbl_add">Aggiungi</string>
<string name="lbl_save">Salva</string>

View file

@ -45,7 +45,7 @@
<string name="lbl_shuffle_selected">ערבוב הנבחרים</string>
<string name="lbl_play_next">ניגון הבא</string>
<string name="lbl_queue_add">הוספה לתור</string>
<string name="lbl_go_album">מעבר לאלבום</string>
<string name="lbl_album_details">מעבר לאלבום</string>
<string name="lbl_song_detail">הצגת מאפיינים</string>
<string name="lbl_props">מאפייני שיר</string>
<string name="lbl_format">תבנית</string>
@ -132,7 +132,7 @@
<string name="lbl_name">שם</string>
<string name="lbl_track">רצועה</string>
<string name="lbl_queue">תור</string>
<string name="lbl_go_artist">מעבר לאומן</string>
<string name="lbl_artist_details">מעבר לאומן</string>
<string name="lbl_file_name">שם קובץ</string>
<string name="lbl_shuffle_shortcut_short">ערבוב</string>
<string name="lbl_state_restored">המצב שוחזר</string>

View file

@ -116,8 +116,8 @@
<plurals name="fmt_artist_count">
<item quantity="other">%d 人のアーティスト</item>
</plurals>
<string name="lbl_go_artist">アーティストに移動</string>
<string name="lbl_go_album">アルバムに移動</string>
<string name="lbl_artist_details">アーティストに移動</string>
<string name="lbl_album_details">アルバムに移動</string>
<string name="lbl_props">曲のプロパティ</string>
<string name="lng_queue_added">再生待ちに追加</string>
<string name="lng_author">開発者 アレクサンダー・ケイプハート (Alexander Capehart)</string>

View file

@ -34,8 +34,8 @@
<string name="lbl_play_next">다음 곡 재생</string>
<string name="lbl_queue_add">대기열에 추가</string>
<string name="lng_queue_added">대기열에 추가됨</string>
<string name="lbl_go_artist">아티스트로 이동</string>
<string name="lbl_go_album">앨범으로 이동</string>
<string name="lbl_artist_details">아티스트로 이동</string>
<string name="lbl_album_details">앨범으로 이동</string>
<string name="lbl_state_saved">상태 저장됨</string>
<!-- Actual string: Ok -->
<string name="lbl_ok">확인</string>

View file

@ -16,8 +16,8 @@
<string name="lbl_play_next">Groti kitą</string>
<string name="lbl_queue_add">Pridėti į eilę</string>
<string name="lbl_queue">Eilė</string>
<string name="lbl_go_artist">Eiti į atlikėją</string>
<string name="lbl_go_album">Eiti į albumą</string>
<string name="lbl_artist_details">Eiti į atlikėją</string>
<string name="lbl_album_details">Eiti į albumą</string>
<string name="lbl_song_detail">Peržiūrėti ypatybes</string>
<string name="lbl_size">Dydis</string>
<string name="lbl_bitrate">Bitų srautas</string>

View file

@ -87,7 +87,7 @@
<item quantity="one">%d പാട്ട്</item>
<item quantity="other">%d പാട്ടുകൾ</item>
</plurals>
<string name="lbl_go_artist">കലാകാരനിലേക്ക് പോകുക</string>
<string name="lbl_artist_details">കലാകാരനിലേക്ക് പോകുക</string>
<string name="lbl_song_detail">സവിശേഷതകൾ കാണുക</string>
<string name="lbl_state_saved">സ്ഥിതി സംരക്ഷിച്ചു</string>
<string name="lbl_sort_dec">അവരോഹണം</string>

View file

@ -25,8 +25,8 @@
<string name="lbl_play_next">Afspelen als volgende</string>
<string name="lbl_queue_add">Toevoegen aan wachtrij</string>
<string name="lng_queue_added">Toegevoegd aan de wachtrij</string>
<string name="lbl_go_artist">Ga naar artiest</string>
<string name="lbl_go_album">Ga naar album</string>
<string name="lbl_artist_details">Ga naar artiest</string>
<string name="lbl_album_details">Ga naar album</string>
<string name="lbl_state_saved">Staat gered</string>
<string name="lbl_add">Toevoegen</string>
<string name="lbl_save">Opslaan</string>

View file

@ -53,7 +53,7 @@
<string name="lbl_queue">ਕਤਾਰ</string>
<string name="lbl_play_next">ਅਗਲਾ ਚਲਾਓ</string>
<string name="lbl_queue_add">ਕਤਾਰ ਵਿੱਚ ਸ਼ਾਮਿਲ ਕਰੋ</string>
<string name="lbl_go_album">ਐਲਬਮ \'ਤੇ ਜਾਓ</string>
<string name="lbl_album_details">ਐਲਬਮ \'ਤੇ ਜਾਓ</string>
<string name="lbl_song_detail">ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਵੇਖੋ</string>
<string name="lbl_props">ਗੀਤ ਦੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ</string>
<string name="lbl_relative_path">ਪੇਰੈਂਟ ਮਾਰਗ</string>
@ -77,7 +77,7 @@
<string name="lbl_song_count">ਗੀਤ ਦੀ ਗਿਣਤੀ</string>
<string name="lbl_sort_dec">ਘਟਦੇ ਹੋਏ</string>
<string name="lbl_play_selected">ਚੁਣਿਆ ਹੋਇਆ ਚਲਾਓ</string>
<string name="lbl_go_artist">ਕਲਾਕਾਰ \'ਤੇ ਜਾਓ</string>
<string name="lbl_artist_details">ਕਲਾਕਾਰ \'ਤੇ ਜਾਓ</string>
<string name="lbl_file_name">ਫਾਈਲ ਦਾ ਨਾਮ</string>
<string name="lbl_bitrate">ਬਿੱਟ ਰੇਟ</string>
<string name="lbl_sample_rate">ਸੈਂਪਲ ਰੇਟ</string>

View file

@ -20,8 +20,8 @@
<string name="lbl_play_next">Odtwórz następny</string>
<string name="lbl_queue_add">Dodaj do kolejki</string>
<string name="lng_queue_added">Dodano do kolejki</string>
<string name="lbl_go_artist">Przejdź do wykonawcy</string>
<string name="lbl_go_album">Przejdź do albumu</string>
<string name="lbl_artist_details">Przejdź do wykonawcy</string>
<string name="lbl_album_details">Przejdź do albumu</string>
<string name="lbl_about">O aplikacji</string>
<string name="lbl_version">Wersja</string>
<string name="lbl_code">Kod źródłowy</string>

View file

@ -19,8 +19,8 @@
<string name="lbl_play_next">Reproduzir próxima</string>
<string name="lbl_queue_add">Adicionar à fila</string>
<string name="lng_queue_added">Adicionada à fila</string>
<string name="lbl_go_artist">Ir para o artista</string>
<string name="lbl_go_album">Ir para o álbum</string>
<string name="lbl_artist_details">Ir para o artista</string>
<string name="lbl_album_details">Ir para o álbum</string>
<string name="lbl_about">Sobre</string>
<string name="lbl_version">Versão</string>
<string name="lbl_code">Código-fonte</string>

View file

@ -20,8 +20,8 @@
<string name="lbl_play_next">Reproduzir a próxima</string>
<string name="lbl_queue_add">Adicionar à fila</string>
<string name="lng_queue_added">Adicionada à fila</string>
<string name="lbl_go_artist">Ir para o artista</string>
<string name="lbl_go_album">Ir para o álbum</string>
<string name="lbl_artist_details">Ir para o artista</string>
<string name="lbl_album_details">Ir para o álbum</string>
<string name="lbl_about">Sobre</string>
<string name="lbl_version">Versão</string>
<string name="lbl_code">Código fonte</string>

View file

@ -20,8 +20,8 @@
<string name="lbl_play_next">Redă următoarea</string>
<string name="lbl_queue_add">Adăugați la lista de așteptare</string>
<string name="lng_queue_added">A fost adăugat la lista de așteptare</string>
<string name="lbl_go_artist">Mergi la artist</string>
<string name="lbl_go_album">Accesaţi albumul</string>
<string name="lbl_artist_details">Mergi la artist</string>
<string name="lbl_album_details">Accesaţi albumul</string>
<string name="lbl_about">Despre</string>
<string name="lbl_version">Versiune</string>
<string name="lbl_code">Cod sursă</string>

View file

@ -30,8 +30,8 @@
<string name="lbl_play_next">Играть далее</string>
<string name="lbl_queue_add">Добавить в очередь</string>
<string name="lng_queue_added">Добавлено в очередь</string>
<string name="lbl_go_artist">Перейти к исполнителю</string>
<string name="lbl_go_album">Перейти к альбому</string>
<string name="lbl_artist_details">Перейти к исполнителю</string>
<string name="lbl_album_details">Перейти к альбому</string>
<string name="lbl_state_saved">Позиция сохранена</string>
<string name="lbl_add">Добавить</string>
<string name="lbl_save">Сохранить</string>

View file

@ -48,8 +48,8 @@
<string name="lbl_queue"></string>
<string name="lbl_play_next">Spela nästa</string>
<string name="lbl_playlist_add">Lägg till spellista</string>
<string name="lbl_go_artist">Gå till konstnär</string>
<string name="lbl_go_album">Gå till album</string>
<string name="lbl_artist_details">Gå till konstnär</string>
<string name="lbl_album_details">Gå till album</string>
<string name="lbl_song_detail">Visa egenskaper</string>
<string name="lbl_share">Dela</string>
<string name="lbl_props">Egenskaper för låt</string>

View file

@ -20,8 +20,8 @@
<string name="lbl_play_next">Sonraki şarkı</string>
<string name="lbl_queue_add">Kuyruğa ekle</string>
<string name="lng_queue_added">Kuyruğa eklendi</string>
<string name="lbl_go_artist">Sanatçıya git</string>
<string name="lbl_go_album">Albüme git</string>
<string name="lbl_artist_details">Sanatçıya git</string>
<string name="lbl_album_details">Albüme git</string>
<string name="lbl_about">Hakkında</string>
<string name="lbl_version">Sürüm</string>
<string name="lbl_code">Kaynak kodu</string>

View file

@ -19,8 +19,8 @@
<string name="lbl_play_next">Відтворити наступним</string>
<string name="lbl_queue_add">Додати в чергу</string>
<string name="lng_queue_added">Додано в чергу</string>
<string name="lbl_go_artist">Перейти до виконавця</string>
<string name="lbl_go_album">Перейти до альбому</string>
<string name="lbl_artist_details">Перейти до виконавця</string>
<string name="lbl_album_details">Перейти до альбому</string>
<string name="lbl_about">Про застосунок</string>
<string name="lbl_version">Версія</string>
<string name="lbl_code">Вихідний код</string>

View file

@ -30,8 +30,8 @@
<string name="lbl_play_next">作为下一首播放</string>
<string name="lbl_queue_add">加入播放队列</string>
<string name="lng_queue_added">已加入播放队列</string>
<string name="lbl_go_artist">查看艺术家</string>
<string name="lbl_go_album">查看专辑</string>
<string name="lbl_artist_details">查看艺术家</string>
<string name="lbl_album_details">查看专辑</string>
<string name="lbl_state_saved">已保存播放进度</string>
<string name="lbl_add">添加</string>
<string name="lbl_save">保存</string>

View file

@ -20,8 +20,8 @@
<string name="lbl_play_next">下一首播放</string>
<string name="lbl_queue_add">添加到隊列</string>
<string name="lng_queue_added">已加入隊列</string>
<string name="lbl_go_artist">前往該歌手頁面</string>
<string name="lbl_go_album">專輯</string>
<string name="lbl_artist_details">前往該歌手頁面</string>
<string name="lbl_album_details">專輯</string>
<string name="lbl_about">關於</string>
<string name="lbl_version">版本</string>
<string name="lbl_code">在 GitHub 上檢視</string>

View file

@ -120,9 +120,11 @@
<string name="lbl_playlist_add">Add to playlist</string>
<string name="lbl_go_artist">Go to artist</string>
<string name="lbl_go_album">Go to album</string>
<string name="lbl_artist_details">Go to artist</string>
<string name="lbl_album_details">Go to album</string>
<string name="lbl_song_detail">View properties</string>
<string name="lbl_parent_detail">View</string>
<string name="lbl_share">Share</string>
<string name="lbl_props">Song properties</string>