list: add sort menu scaffold
Add the base dialog that will replace the prior sort menus in-app.
This commit is contained in:
parent
5ed69e8b72
commit
ec7f2d979a
46 changed files with 429 additions and 50 deletions
|
@ -76,6 +76,7 @@ class AlbumDetailFragment :
|
||||||
override val listModel: ListViewModel by activityViewModels()
|
override val listModel: ListViewModel by activityViewModels()
|
||||||
override val musicModel: MusicViewModel by activityViewModels()
|
override val musicModel: MusicViewModel by activityViewModels()
|
||||||
override val playbackModel: PlaybackViewModel by activityViewModels()
|
override val playbackModel: PlaybackViewModel by activityViewModels()
|
||||||
|
|
||||||
// Information about what album to display is initially within the navigation arguments
|
// Information about what album to display is initially within the navigation arguments
|
||||||
// as a UID, as that is the only safe way to parcel an album.
|
// as a UID, as that is the only safe way to parcel an album.
|
||||||
private val args: AlbumDetailFragmentArgs by navArgs()
|
private val args: AlbumDetailFragmentArgs by navArgs()
|
||||||
|
|
|
@ -165,6 +165,8 @@ data class Sort(val mode: Mode, val direction: Direction) {
|
||||||
val intCode: Int
|
val intCode: Int
|
||||||
/** The item ID of this sort mode in menu resources. */
|
/** The item ID of this sort mode in menu resources. */
|
||||||
val itemId: Int
|
val itemId: Int
|
||||||
|
/** The string resource of the human-readable name of this sort mode. */
|
||||||
|
val stringRes: Int
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a [Comparator] that sorts [Song]s according to this [Mode].
|
* Get a [Comparator] that sorts [Song]s according to this [Mode].
|
||||||
|
@ -223,6 +225,9 @@ data class Sort(val mode: Mode, val direction: Direction) {
|
||||||
override val itemId: Int
|
override val itemId: Int
|
||||||
get() = R.id.option_sort_name
|
get() = R.id.option_sort_name
|
||||||
|
|
||||||
|
override val stringRes: Int
|
||||||
|
get() = R.string.lbl_name
|
||||||
|
|
||||||
override fun getSongComparator(direction: Direction) =
|
override fun getSongComparator(direction: Direction) =
|
||||||
compareByDynamic(direction, BasicComparator.SONG)
|
compareByDynamic(direction, BasicComparator.SONG)
|
||||||
|
|
||||||
|
@ -251,6 +256,9 @@ data class Sort(val mode: Mode, val direction: Direction) {
|
||||||
override val itemId: Int
|
override val itemId: Int
|
||||||
get() = R.id.option_sort_album
|
get() = R.id.option_sort_album
|
||||||
|
|
||||||
|
override val stringRes: Int
|
||||||
|
get() = R.string.lbl_album
|
||||||
|
|
||||||
override fun getSongComparator(direction: Direction): Comparator<Song> =
|
override fun getSongComparator(direction: Direction): Comparator<Song> =
|
||||||
MultiComparator(
|
MultiComparator(
|
||||||
compareByDynamic(direction, BasicComparator.ALBUM) { it.album },
|
compareByDynamic(direction, BasicComparator.ALBUM) { it.album },
|
||||||
|
@ -271,6 +279,9 @@ data class Sort(val mode: Mode, val direction: Direction) {
|
||||||
override val itemId: Int
|
override val itemId: Int
|
||||||
get() = R.id.option_sort_artist
|
get() = R.id.option_sort_artist
|
||||||
|
|
||||||
|
override val stringRes: Int
|
||||||
|
get() = R.string.lbl_artist
|
||||||
|
|
||||||
override fun getSongComparator(direction: Direction): Comparator<Song> =
|
override fun getSongComparator(direction: Direction): Comparator<Song> =
|
||||||
MultiComparator(
|
MultiComparator(
|
||||||
compareByDynamic(direction, ListComparator.ARTISTS) { it.artists },
|
compareByDynamic(direction, ListComparator.ARTISTS) { it.artists },
|
||||||
|
@ -300,6 +311,9 @@ data class Sort(val mode: Mode, val direction: Direction) {
|
||||||
override val itemId: Int
|
override val itemId: Int
|
||||||
get() = R.id.option_sort_year
|
get() = R.id.option_sort_year
|
||||||
|
|
||||||
|
override val stringRes: Int
|
||||||
|
get() = R.string.lbl_date
|
||||||
|
|
||||||
override fun getSongComparator(direction: Direction): Comparator<Song> =
|
override fun getSongComparator(direction: Direction): Comparator<Song> =
|
||||||
MultiComparator(
|
MultiComparator(
|
||||||
compareByDynamic(direction, NullableComparator.DATE_RANGE) { it.album.dates },
|
compareByDynamic(direction, NullableComparator.DATE_RANGE) { it.album.dates },
|
||||||
|
@ -322,6 +336,9 @@ data class Sort(val mode: Mode, val direction: Direction) {
|
||||||
override val itemId: Int
|
override val itemId: Int
|
||||||
get() = R.id.option_sort_duration
|
get() = R.id.option_sort_duration
|
||||||
|
|
||||||
|
override val stringRes: Int
|
||||||
|
get() = R.string.lbl_duration
|
||||||
|
|
||||||
override fun getSongComparator(direction: Direction): Comparator<Song> =
|
override fun getSongComparator(direction: Direction): Comparator<Song> =
|
||||||
MultiComparator(
|
MultiComparator(
|
||||||
compareByDynamic(direction) { it.durationMs }, compareBy(BasicComparator.SONG))
|
compareByDynamic(direction) { it.durationMs }, compareBy(BasicComparator.SONG))
|
||||||
|
@ -357,6 +374,9 @@ data class Sort(val mode: Mode, val direction: Direction) {
|
||||||
override val itemId: Int
|
override val itemId: Int
|
||||||
get() = R.id.option_sort_count
|
get() = R.id.option_sort_count
|
||||||
|
|
||||||
|
override val stringRes: Int
|
||||||
|
get() = R.string.lbl_song_count
|
||||||
|
|
||||||
override fun getAlbumComparator(direction: Direction): Comparator<Album> =
|
override fun getAlbumComparator(direction: Direction): Comparator<Album> =
|
||||||
MultiComparator(
|
MultiComparator(
|
||||||
compareByDynamic(direction) { it.songs.size }, compareBy(BasicComparator.ALBUM))
|
compareByDynamic(direction) { it.songs.size }, compareBy(BasicComparator.ALBUM))
|
||||||
|
@ -388,6 +408,9 @@ data class Sort(val mode: Mode, val direction: Direction) {
|
||||||
override val itemId: Int
|
override val itemId: Int
|
||||||
get() = R.id.option_sort_disc
|
get() = R.id.option_sort_disc
|
||||||
|
|
||||||
|
override val stringRes: Int
|
||||||
|
get() = R.string.lbl_disc
|
||||||
|
|
||||||
override fun getSongComparator(direction: Direction): Comparator<Song> =
|
override fun getSongComparator(direction: Direction): Comparator<Song> =
|
||||||
MultiComparator(
|
MultiComparator(
|
||||||
compareByDynamic(direction, NullableComparator.DISC) { it.disc },
|
compareByDynamic(direction, NullableComparator.DISC) { it.disc },
|
||||||
|
@ -407,6 +430,9 @@ data class Sort(val mode: Mode, val direction: Direction) {
|
||||||
override val itemId: Int
|
override val itemId: Int
|
||||||
get() = R.id.option_sort_track
|
get() = R.id.option_sort_track
|
||||||
|
|
||||||
|
override val stringRes: Int
|
||||||
|
get() = R.string.lbl_track
|
||||||
|
|
||||||
override fun getSongComparator(direction: Direction): Comparator<Song> =
|
override fun getSongComparator(direction: Direction): Comparator<Song> =
|
||||||
MultiComparator(
|
MultiComparator(
|
||||||
compareBy(NullableComparator.DISC) { it.disc },
|
compareBy(NullableComparator.DISC) { it.disc },
|
||||||
|
@ -427,6 +453,9 @@ data class Sort(val mode: Mode, val direction: Direction) {
|
||||||
override val itemId: Int
|
override val itemId: Int
|
||||||
get() = R.id.option_sort_date_added
|
get() = R.id.option_sort_date_added
|
||||||
|
|
||||||
|
override val stringRes: Int
|
||||||
|
get() = R.string.lbl_date_added
|
||||||
|
|
||||||
override fun getSongComparator(direction: Direction): Comparator<Song> =
|
override fun getSongComparator(direction: Direction): Comparator<Song> =
|
||||||
MultiComparator(
|
MultiComparator(
|
||||||
compareByDynamic(direction) { it.dateAdded }, compareBy(BasicComparator.SONG))
|
compareByDynamic(direction) { it.dateAdded }, compareBy(BasicComparator.SONG))
|
||||||
|
|
|
@ -44,7 +44,7 @@ class MenuItemAdapter(private val listener: ClickableListListener<MenuItem>) :
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A [DialogRecyclerView.ViewHolder] that displays a list of menu options based on [MenuItem].
|
* A [DialogRecyclerView.ViewHolder] that displays a [MenuItem].
|
||||||
*
|
*
|
||||||
* @author Alexander Capehart (OxygenCobalt)
|
* @author Alexander Capehart (OxygenCobalt)
|
||||||
*/
|
*/
|
||||||
|
@ -54,7 +54,7 @@ class MenuItemViewHolder private constructor(private val binding: ItemMenuOption
|
||||||
* Bind new data to this instance.
|
* Bind new data to this instance.
|
||||||
*
|
*
|
||||||
* @param item The new [MenuItem] to bind.
|
* @param item The new [MenuItem] to bind.
|
||||||
* @param listener An [ClickableListListener] to bind interactions to.
|
* @param listener A [ClickableListListener] to bind interactions to.
|
||||||
*/
|
*/
|
||||||
fun bind(item: MenuItem, listener: ClickableListListener<MenuItem>) {
|
fun bind(item: MenuItem, listener: ClickableListListener<MenuItem>) {
|
||||||
listener.bind(item, this)
|
listener.bind(item, this)
|
||||||
|
|
|
@ -22,7 +22,6 @@ import android.content.Context
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.view.WindowInsets
|
|
||||||
import androidx.annotation.AttrRes
|
import androidx.annotation.AttrRes
|
||||||
import androidx.core.view.isInvisible
|
import androidx.core.view.isInvisible
|
||||||
import androidx.core.view.updatePadding
|
import androidx.core.view.updatePadding
|
||||||
|
@ -32,7 +31,6 @@ import com.google.android.material.divider.MaterialDivider
|
||||||
import org.oxycblt.auxio.R
|
import org.oxycblt.auxio.R
|
||||||
import org.oxycblt.auxio.list.recycler.DialogRecyclerView.ViewHolder
|
import org.oxycblt.auxio.list.recycler.DialogRecyclerView.ViewHolder
|
||||||
import org.oxycblt.auxio.util.getDimenPixels
|
import org.oxycblt.auxio.util.getDimenPixels
|
||||||
import org.oxycblt.auxio.util.systemBarInsetsCompat
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A [RecyclerView] intended for use in Dialogs, adding features such as:
|
* A [RecyclerView] intended for use in Dialogs, adding features such as:
|
||||||
|
@ -76,13 +74,6 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr
|
||||||
invalidateDividers()
|
invalidateDividers()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onApplyWindowInsets(insets: WindowInsets): WindowInsets {
|
|
||||||
// Update the RecyclerView's padding such that the bottom insets are applied
|
|
||||||
// while still preserving bottom padding.
|
|
||||||
updatePadding(bottom = insets.systemBarInsetsCompat.bottom)
|
|
||||||
return insets
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onScrolled(dx: Int, dy: Int) {
|
override fun onScrolled(dx: Int, dy: Int) {
|
||||||
super.onScrolled(dx, dy)
|
super.onScrolled(dx, dy)
|
||||||
// Scroll event occurred, need to update the dividers.
|
// Scroll event occurred, need to update the dividers.
|
||||||
|
|
89
app/src/main/java/org/oxycblt/auxio/list/sort/SortDialog.kt
Normal file
89
app/src/main/java/org/oxycblt/auxio/list/sort/SortDialog.kt
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 Auxio Project
|
||||||
|
* SortDialog.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
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.oxycblt.auxio.list.sort
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import androidx.core.view.updatePadding
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import org.oxycblt.auxio.R
|
||||||
|
import org.oxycblt.auxio.databinding.DialogSortBinding
|
||||||
|
import org.oxycblt.auxio.list.ClickableListListener
|
||||||
|
import org.oxycblt.auxio.list.Sort
|
||||||
|
import org.oxycblt.auxio.list.adapter.UpdateInstructions
|
||||||
|
import org.oxycblt.auxio.ui.ViewBindingBottomSheetDialogFragment
|
||||||
|
import org.oxycblt.auxio.util.systemBarInsetsCompat
|
||||||
|
|
||||||
|
abstract class SortDialog :
|
||||||
|
ViewBindingBottomSheetDialogFragment<DialogSortBinding>(), ClickableListListener<Sort.Mode> {
|
||||||
|
private val modeAdapter = SortModeAdapter(this)
|
||||||
|
|
||||||
|
abstract fun getInitialSort(): Sort
|
||||||
|
|
||||||
|
abstract fun applyChosenSort(sort: Sort)
|
||||||
|
|
||||||
|
abstract fun getModeChoices(): List<Sort.Mode>
|
||||||
|
|
||||||
|
override fun onCreateBinding(inflater: LayoutInflater) = DialogSortBinding.inflate(inflater)
|
||||||
|
|
||||||
|
override fun onBindingCreated(binding: DialogSortBinding, savedInstanceState: Bundle?) {
|
||||||
|
super.onBindingCreated(binding, savedInstanceState)
|
||||||
|
|
||||||
|
// --- UI SETUP ---
|
||||||
|
binding.root.setOnApplyWindowInsetsListener { v, insets ->
|
||||||
|
v.updatePadding(bottom = insets.systemBarInsetsCompat.bottom)
|
||||||
|
insets
|
||||||
|
}
|
||||||
|
|
||||||
|
binding.sortModeRecycler.adapter = modeAdapter
|
||||||
|
|
||||||
|
binding.sortCancel.setOnClickListener { dismiss() }
|
||||||
|
|
||||||
|
binding.sortSave.setOnClickListener {
|
||||||
|
val initial = getInitialSort()
|
||||||
|
// FIXME: This won't work for the playlist sort dialog.
|
||||||
|
val mode = modeAdapter.currentMode ?: initial.mode
|
||||||
|
val direction =
|
||||||
|
when (binding.sortDirectionGroup.checkedButtonId) {
|
||||||
|
R.id.sort_direction_asc -> Sort.Direction.ASCENDING
|
||||||
|
R.id.sort_direction_dsc -> Sort.Direction.DESCENDING
|
||||||
|
else -> initial.direction
|
||||||
|
}
|
||||||
|
applyChosenSort(Sort(mode, direction))
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- STATE SETUP ---
|
||||||
|
val initial = getInitialSort()
|
||||||
|
|
||||||
|
modeAdapter.update(getModeChoices(), UpdateInstructions.Diff)
|
||||||
|
modeAdapter.setSelected(initial.mode)
|
||||||
|
|
||||||
|
val directionId =
|
||||||
|
when (initial.direction) {
|
||||||
|
Sort.Direction.ASCENDING -> R.id.sort_direction_asc
|
||||||
|
Sort.Direction.DESCENDING -> R.id.sort_direction_dsc
|
||||||
|
}
|
||||||
|
binding.sortDirectionGroup.check(directionId)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onClick(item: Sort.Mode, viewHolder: RecyclerView.ViewHolder) {
|
||||||
|
modeAdapter.setSelected(item)
|
||||||
|
}
|
||||||
|
}
|
121
app/src/main/java/org/oxycblt/auxio/list/sort/SortModeAdapter.kt
Normal file
121
app/src/main/java/org/oxycblt/auxio/list/sort/SortModeAdapter.kt
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 Auxio Project
|
||||||
|
* SortModeAdapter.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
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.oxycblt.auxio.list.sort
|
||||||
|
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
|
import org.oxycblt.auxio.databinding.ItemSortModeBinding
|
||||||
|
import org.oxycblt.auxio.list.ClickableListListener
|
||||||
|
import org.oxycblt.auxio.list.Sort
|
||||||
|
import org.oxycblt.auxio.list.adapter.FlexibleListAdapter
|
||||||
|
import org.oxycblt.auxio.list.recycler.DialogRecyclerView
|
||||||
|
import org.oxycblt.auxio.util.context
|
||||||
|
import org.oxycblt.auxio.util.inflater
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A [FlexibleListAdapter] that displays a list of [Sort.Mode]s.
|
||||||
|
*
|
||||||
|
* @param listener A [ClickableListListener] to bind interactions to.
|
||||||
|
* @author Alexander Capehart (OxygenCobalt)
|
||||||
|
*/
|
||||||
|
class SortModeAdapter(private val listener: ClickableListListener<Sort.Mode>) :
|
||||||
|
FlexibleListAdapter<Sort.Mode, SortModeViewHolder>(SortModeViewHolder.DIFF_CALLBACK) {
|
||||||
|
/** The currently selected [Sort.Mode] item in this adapter. */
|
||||||
|
var currentMode: Sort.Mode? = null
|
||||||
|
private set
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
|
||||||
|
SortModeViewHolder.from(parent)
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: SortModeViewHolder, position: Int) {
|
||||||
|
throw NotImplementedError()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: SortModeViewHolder, position: Int, payload: List<Any>) {
|
||||||
|
val mode = getItem(position)
|
||||||
|
if (payload.isEmpty()) {
|
||||||
|
holder.bind(mode, listener)
|
||||||
|
}
|
||||||
|
holder.setSelected(mode == currentMode)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select a new [Sort.Mode] option, unselecting the prior one. Does nothing if [mode] equals
|
||||||
|
* [currentMode].
|
||||||
|
*
|
||||||
|
* @param mode The new [Sort.Mode] to select. Should be in the adapter data.
|
||||||
|
*/
|
||||||
|
fun setSelected(mode: Sort.Mode) {
|
||||||
|
if (mode == currentMode) return
|
||||||
|
val oldMode = currentList.indexOf(currentMode)
|
||||||
|
val newMode = currentList.indexOf(mode)
|
||||||
|
currentMode = mode
|
||||||
|
if (oldMode > -1) {
|
||||||
|
notifyItemChanged(oldMode, PAYLOAD_SELECTION_CHANGED)
|
||||||
|
}
|
||||||
|
notifyItemChanged(newMode, PAYLOAD_SELECTION_CHANGED)
|
||||||
|
}
|
||||||
|
|
||||||
|
private companion object {
|
||||||
|
val PAYLOAD_SELECTION_CHANGED = Any()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A [DialogRecyclerView.ViewHolder] that displays a [Sort.Mode].
|
||||||
|
*
|
||||||
|
* @author Alexander Capehart (OxygenCobalt)
|
||||||
|
*/
|
||||||
|
class SortModeViewHolder private constructor(private val binding: ItemSortModeBinding) :
|
||||||
|
DialogRecyclerView.ViewHolder(binding.root) {
|
||||||
|
/**
|
||||||
|
* Bind new data to this instance.
|
||||||
|
*
|
||||||
|
* @param mode The new [Sort.Mode] to bind.
|
||||||
|
* @param listener A [ClickableListListener] to bind interactions to.
|
||||||
|
*/
|
||||||
|
fun bind(mode: Sort.Mode, listener: ClickableListListener<Sort.Mode>) {
|
||||||
|
listener.bind(mode, this)
|
||||||
|
binding.sortRadio.text = binding.context.getString(mode.stringRes)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set if this view should be shown as selected or not.
|
||||||
|
*
|
||||||
|
* @param selected True if selected, false if not.
|
||||||
|
*/
|
||||||
|
fun setSelected(selected: Boolean) {
|
||||||
|
binding.sortRadio.isChecked = selected
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun from(parent: View) =
|
||||||
|
SortModeViewHolder(ItemSortModeBinding.inflate(parent.context.inflater))
|
||||||
|
|
||||||
|
val DIFF_CALLBACK =
|
||||||
|
object : DiffUtil.ItemCallback<Sort.Mode>() {
|
||||||
|
override fun areItemsTheSame(oldItem: Sort.Mode, newItem: Sort.Mode) =
|
||||||
|
oldItem == newItem
|
||||||
|
|
||||||
|
override fun areContentsTheSame(oldItem: Sort.Mode, newItem: Sort.Mode) =
|
||||||
|
oldItem == newItem
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
<com.google.android.material.bottomsheet.BottomSheetDragHandleView
|
<com.google.android.material.bottomsheet.BottomSheetDragHandleView
|
||||||
android:id="@+id/menu_handle"
|
android:id="@+id/menu_handle"
|
||||||
|
@ -70,7 +70,7 @@
|
||||||
tools:text="Info A" />
|
tools:text="Info A" />
|
||||||
|
|
||||||
<com.google.android.material.divider.MaterialDivider
|
<com.google.android.material.divider.MaterialDivider
|
||||||
android:id="@+id/menu_divider"
|
android:id="@+id/menu_mode_group"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="@dimen/spacing_medium"
|
android:layout_marginTop="@dimen/spacing_medium"
|
||||||
|
@ -85,6 +85,6 @@
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:overScrollMode="never"
|
android:overScrollMode="never"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/menu_divider"
|
app:layout_constraintTop_toBottomOf="@+id/menu_mode_group"
|
||||||
tools:listitem="@layout/item_menu_option" />
|
tools:listitem="@layout/item_menu_option" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
|
@ -27,7 +27,7 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="@dimen/spacing_large"
|
android:layout_marginStart="@dimen/spacing_large"
|
||||||
android:layout_marginTop="@dimen/spacing_small"
|
android:layout_marginTop="@dimen/spacing_tiny"
|
||||||
android:layout_marginEnd="@dimen/spacing_large"
|
android:layout_marginEnd="@dimen/spacing_large"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/dirs_mode_header"
|
app:layout_constraintTop_toBottomOf="@+id/dirs_mode_header"
|
||||||
|
|
110
app/src/main/res/layout/dialog_sort.xml
Normal file
110
app/src/main/res/layout/dialog_sort.xml
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
<LinearLayout 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:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Required to use a LinearLayout here for space allocation to stop the BottomSheetDialog
|
||||||
|
from flipping out and not allowing the RecyclerView to scroll fully.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<com.google.android.material.bottomsheet.BottomSheetDragHandleView
|
||||||
|
android:id="@+id/menu_handle"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/sort_name"
|
||||||
|
style="@style/Widget.Auxio.TextView.Primary"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="@dimen/spacing_medium"
|
||||||
|
android:text="Sort By"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintVertical_chainStyle="packed" />
|
||||||
|
|
||||||
|
<org.oxycblt.auxio.list.recycler.DialogRecyclerView
|
||||||
|
android:id="@+id/sort_mode_recycler"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
style="@style/Widget.Auxio.RecyclerView.Linear"
|
||||||
|
tools:listitem="@layout/item_sort_mode" />
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/sort_header"
|
||||||
|
style="@style/Widget.Auxio.TextView.Header"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Direction"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButtonToggleGroup
|
||||||
|
android:id="@+id/sort_direction_group"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="@dimen/spacing_tiny"
|
||||||
|
android:gravity="center"
|
||||||
|
android:layout_marginHorizontal="@dimen/spacing_medium"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/sort_header"
|
||||||
|
app:selectionRequired="false"
|
||||||
|
app:singleSelection="true"
|
||||||
|
tools:layout_editor_absoluteX="24dp">
|
||||||
|
|
||||||
|
<org.oxycblt.auxio.ui.RippleFixMaterialButton
|
||||||
|
android:id="@+id/sort_direction_asc"
|
||||||
|
style="@style/Widget.Material3.Button.OutlinedButton"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="@string/lbl_sort_asc"
|
||||||
|
tools:icon="@drawable/ic_check_24" />
|
||||||
|
|
||||||
|
<org.oxycblt.auxio.ui.RippleFixMaterialButton
|
||||||
|
android:id="@+id/sort_direction_dsc"
|
||||||
|
style="@style/Widget.Material3.Button.OutlinedButton"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="@string/lbl_sort_dsc" />
|
||||||
|
|
||||||
|
</com.google.android.material.button.MaterialButtonToggleGroup>
|
||||||
|
|
||||||
|
<org.oxycblt.auxio.ui.RippleFixMaterialButton
|
||||||
|
android:id="@+id/sort_cancel"
|
||||||
|
style="@style/Widget.Material3.Button.TextButton.Dialog"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="@dimen/spacing_small"
|
||||||
|
android:text="@string/lbl_cancel"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/sort_save"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/sort_save"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/sort_save" />
|
||||||
|
|
||||||
|
<org.oxycblt.auxio.ui.RippleFixMaterialButton
|
||||||
|
android:id="@+id/sort_save"
|
||||||
|
style="@style/Widget.Material3.Button.TextButton.Dialog"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="@dimen/spacing_medium"
|
||||||
|
android:layout_marginBottom="@dimen/spacing_mid_medium"
|
||||||
|
android:layout_marginTop="@dimen/spacing_mid_medium"
|
||||||
|
android:text="@string/lbl_ok"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/sort_direction_group" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
29
app/src/main/res/layout/item_sort_mode.xml
Normal file
29
app/src/main/res/layout/item_sort_mode.xml
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout 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:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:paddingTop="@dimen/spacing_tiny"
|
||||||
|
android:paddingBottom="@dimen/spacing_tiny">
|
||||||
|
|
||||||
|
<com.google.android.material.radiobutton.MaterialRadioButton
|
||||||
|
android:id="@+id/sort_radio"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="@dimen/spacing_mid_medium"
|
||||||
|
android:layout_marginEnd="@dimen/spacing_mid_medium"
|
||||||
|
android:clickable="false"
|
||||||
|
android:focusable="false"
|
||||||
|
android:drawableTint="?attr/colorControlNormal"
|
||||||
|
android:paddingStart="@dimen/spacing_medium"
|
||||||
|
android:textAlignment="viewStart"
|
||||||
|
android:textAppearance="@style/TextAppearance.Auxio.BodyLarge"
|
||||||
|
tools:ignore="RtlSymmetry,contentDescription"
|
||||||
|
tools:text="Name" />
|
||||||
|
|
||||||
|
</FrameLayout>
|
|
@ -16,6 +16,6 @@
|
||||||
android:title="@string/lbl_sort_asc" />
|
android:title="@string/lbl_sort_asc" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/option_sort_dec"
|
android:id="@+id/option_sort_dec"
|
||||||
android:title="@string/lbl_sort_dec" />
|
android:title="@string/lbl_sort_dsc" />
|
||||||
</group>
|
</group>
|
||||||
</menu>
|
</menu>
|
|
@ -22,6 +22,6 @@
|
||||||
android:title="@string/lbl_sort_asc" />
|
android:title="@string/lbl_sort_asc" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/option_sort_dec"
|
android:id="@+id/option_sort_dec"
|
||||||
android:title="@string/lbl_sort_dec" />
|
android:title="@string/lbl_sort_dsc" />
|
||||||
</group>
|
</group>
|
||||||
</menu>
|
</menu>
|
|
@ -25,6 +25,6 @@
|
||||||
android:title="@string/lbl_sort_asc" />
|
android:title="@string/lbl_sort_asc" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/option_sort_dec"
|
android:id="@+id/option_sort_dec"
|
||||||
android:title="@string/lbl_sort_dec" />
|
android:title="@string/lbl_sort_dsc" />
|
||||||
</group>
|
</group>
|
||||||
</menu>
|
</menu>
|
|
@ -45,7 +45,7 @@
|
||||||
android:title="@string/lbl_sort_asc" />
|
android:title="@string/lbl_sort_asc" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/option_sort_dec"
|
android:id="@+id/option_sort_dec"
|
||||||
android:title="@string/lbl_sort_dec" />
|
android:title="@string/lbl_sort_dsc" />
|
||||||
</group>
|
</group>
|
||||||
</menu>
|
</menu>
|
||||||
</item>
|
</item>
|
||||||
|
|
|
@ -162,6 +162,9 @@
|
||||||
<action
|
<action
|
||||||
android:id="@+id/play_from_genre"
|
android:id="@+id/play_from_genre"
|
||||||
app:destination="@id/play_from_genre_dialog" />
|
app:destination="@id/play_from_genre_dialog" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/sort"
|
||||||
|
app:destination="@id/sort_dialog" />
|
||||||
</fragment>
|
</fragment>
|
||||||
|
|
||||||
<fragment
|
<fragment
|
||||||
|
@ -388,4 +391,10 @@
|
||||||
android:name="parcel"
|
android:name="parcel"
|
||||||
app:argType="org.oxycblt.auxio.list.Menu$ForPlaylist$Parcel" />
|
app:argType="org.oxycblt.auxio.list.Menu$ForPlaylist$Parcel" />
|
||||||
</dialog>
|
</dialog>
|
||||||
|
|
||||||
|
<dialog
|
||||||
|
android:id="@+id/sort_dialog"
|
||||||
|
android:name="org.oxycblt.auxio.list.sort.SortDialog"
|
||||||
|
android:label="sort_dialog"
|
||||||
|
tools:layout="@layout/dialog_sort" />
|
||||||
</navigation>
|
</navigation>
|
|
@ -157,7 +157,7 @@
|
||||||
<string name="lbl_shuffle_shortcut_long">تشغيل كل الاغاني بشكل عشوائي</string>
|
<string name="lbl_shuffle_shortcut_long">تشغيل كل الاغاني بشكل عشوائي</string>
|
||||||
<string name="lbl_ok">حسنا</string>
|
<string name="lbl_ok">حسنا</string>
|
||||||
<string name="lbl_state_restored">اعادة الحالة</string>
|
<string name="lbl_state_restored">اعادة الحالة</string>
|
||||||
<string name="lbl_sort_dec">تنازلي</string>
|
<string name="lbl_sort_dsc">تنازلي</string>
|
||||||
<string name="lbl_song_detail">عرض الخصائص</string>
|
<string name="lbl_song_detail">عرض الخصائص</string>
|
||||||
<string name="lbl_state_wiped">مسح الحالة</string>
|
<string name="lbl_state_wiped">مسح الحالة</string>
|
||||||
<string name="lbl_live_group">مباشر</string>
|
<string name="lbl_live_group">مباشر</string>
|
||||||
|
|
|
@ -61,7 +61,7 @@
|
||||||
<string name="lbl_date_added">تاريخ الإضافة</string>
|
<string name="lbl_date_added">تاريخ الإضافة</string>
|
||||||
<string name="lbl_sort">فرز</string>
|
<string name="lbl_sort">فرز</string>
|
||||||
<string name="lbl_sort_asc">تصاعدياً</string>
|
<string name="lbl_sort_asc">تصاعدياً</string>
|
||||||
<string name="lbl_sort_dec">تنازلياً</string>
|
<string name="lbl_sort_dsc">تنازلياً</string>
|
||||||
<string name="lbl_playback">يتم الآن تشغيل</string>
|
<string name="lbl_playback">يتم الآن تشغيل</string>
|
||||||
<string name="lbl_equalizer">المُعادِل</string>
|
<string name="lbl_equalizer">المُعادِل</string>
|
||||||
<string name="lbl_play">تشغيل</string>
|
<string name="lbl_play">تشغيل</string>
|
||||||
|
|
|
@ -77,7 +77,7 @@
|
||||||
<string name="lbl_shuffle_shortcut_short">Ператасаваць</string>
|
<string name="lbl_shuffle_shortcut_short">Ператасаваць</string>
|
||||||
<string name="lbl_cancel">Адмяніць</string>
|
<string name="lbl_cancel">Адмяніць</string>
|
||||||
<string name="lbl_sort_asc">Па ўзрастанні</string>
|
<string name="lbl_sort_asc">Па ўзрастанні</string>
|
||||||
<string name="lbl_sort_dec">Па змяншэнні</string>
|
<string name="lbl_sort_dsc">Па змяншэнні</string>
|
||||||
<string name="lbl_play_next">Гуляць далей</string>
|
<string name="lbl_play_next">Гуляць далей</string>
|
||||||
<string name="lbl_queue_add">Дадаць у чаргу</string>
|
<string name="lbl_queue_add">Дадаць у чаргу</string>
|
||||||
<string name="lbl_equalizer">Эквалайзер</string>
|
<string name="lbl_equalizer">Эквалайзер</string>
|
||||||
|
|
|
@ -279,7 +279,7 @@
|
||||||
<string name="set_playback">Přehrávání</string>
|
<string name="set_playback">Přehrávání</string>
|
||||||
<string name="set_library">Knihovna</string>
|
<string name="set_library">Knihovna</string>
|
||||||
<string name="set_state">Perzistence</string>
|
<string name="set_state">Perzistence</string>
|
||||||
<string name="lbl_sort_dec">Sestupně</string>
|
<string name="lbl_sort_dsc">Sestupně</string>
|
||||||
<string name="lbl_playlists">Seznamy skladeb</string>
|
<string name="lbl_playlists">Seznamy skladeb</string>
|
||||||
<string name="desc_playlist_image">Obrázek seznamu skladeb pro %s</string>
|
<string name="desc_playlist_image">Obrázek seznamu skladeb pro %s</string>
|
||||||
<string name="lbl_playlist">Seznam skladeb</string>
|
<string name="lbl_playlist">Seznam skladeb</string>
|
||||||
|
|
|
@ -270,7 +270,7 @@
|
||||||
<string name="set_audio_desc">Ton und Wiedergabeverhalten konfigurieren</string>
|
<string name="set_audio_desc">Ton und Wiedergabeverhalten konfigurieren</string>
|
||||||
<string name="set_state">Persistenz</string>
|
<string name="set_state">Persistenz</string>
|
||||||
<string name="set_replay_gain">Lautstärkeanpassung ReplayGain</string>
|
<string name="set_replay_gain">Lautstärkeanpassung ReplayGain</string>
|
||||||
<string name="lbl_sort_dec">Absteigend</string>
|
<string name="lbl_sort_dsc">Absteigend</string>
|
||||||
<string name="desc_playlist_image">Wiedergabelistenbild für %s</string>
|
<string name="desc_playlist_image">Wiedergabelistenbild für %s</string>
|
||||||
<string name="lbl_playlist">Wiedergabeliste</string>
|
<string name="lbl_playlist">Wiedergabeliste</string>
|
||||||
<string name="lbl_playlists">Wiedergabelisten</string>
|
<string name="lbl_playlists">Wiedergabelisten</string>
|
||||||
|
|
|
@ -274,7 +274,7 @@
|
||||||
<string name="set_ui_desc">Cambiar el tema y los colores de la aplicación</string>
|
<string name="set_ui_desc">Cambiar el tema y los colores de la aplicación</string>
|
||||||
<string name="set_personalize_desc">Personalizar los controles y el comportamiento de la interfaz de usuario</string>
|
<string name="set_personalize_desc">Personalizar los controles y el comportamiento de la interfaz de usuario</string>
|
||||||
<string name="set_library">Biblioteca</string>
|
<string name="set_library">Biblioteca</string>
|
||||||
<string name="lbl_sort_dec">Descendente</string>
|
<string name="lbl_sort_dsc">Descendente</string>
|
||||||
<string name="lbl_playlists">Listas de reproducción</string>
|
<string name="lbl_playlists">Listas de reproducción</string>
|
||||||
<string name="desc_playlist_image">Imagen de la lista de reproducción para %s</string>
|
<string name="desc_playlist_image">Imagen de la lista de reproducción para %s</string>
|
||||||
<string name="lbl_playlist">Lista de reproducción</string>
|
<string name="lbl_playlist">Lista de reproducción</string>
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
<string name="lbl_disc">Levy</string>
|
<string name="lbl_disc">Levy</string>
|
||||||
<string name="lbl_track">Raita</string>
|
<string name="lbl_track">Raita</string>
|
||||||
<string name="lbl_date_added">Lisäyspäivä</string>
|
<string name="lbl_date_added">Lisäyspäivä</string>
|
||||||
<string name="lbl_sort_dec">Laskevasti</string>
|
<string name="lbl_sort_dsc">Laskevasti</string>
|
||||||
<string name="lbl_playback">Nyt toistetaan</string>
|
<string name="lbl_playback">Nyt toistetaan</string>
|
||||||
<string name="lbl_equalizer">Taajuuskorjain</string>
|
<string name="lbl_equalizer">Taajuuskorjain</string>
|
||||||
<string name="lbl_play">Toista</string>
|
<string name="lbl_play">Toista</string>
|
||||||
|
|
|
@ -157,7 +157,7 @@
|
||||||
<string name="lng_observing">Surveillance de votre bibliothèque musicale pour les changements…</string>
|
<string name="lng_observing">Surveillance de votre bibliothèque musicale pour les changements…</string>
|
||||||
<string name="set_round_mode">Couvertures arrondies</string>
|
<string name="set_round_mode">Couvertures arrondies</string>
|
||||||
<string name="set_round_mode_desc">Activer les coins arrondis sur des éléments d\'interface utilisateur supplémentaires (nécessite que les couvertures d\'album soient arrondies)</string>
|
<string name="set_round_mode_desc">Activer les coins arrondis sur des éléments d\'interface utilisateur supplémentaires (nécessite que les couvertures d\'album soient arrondies)</string>
|
||||||
<string name="lbl_sort_dec">Descendant</string>
|
<string name="lbl_sort_dsc">Descendant</string>
|
||||||
<string name="lbl_state_restored">Etat restauré</string>
|
<string name="lbl_state_restored">Etat restauré</string>
|
||||||
<string name="set_personalize_desc">Personnaliser les commandes et le comportement de l\'interface utilisateur</string>
|
<string name="set_personalize_desc">Personnaliser les commandes et le comportement de l\'interface utilisateur</string>
|
||||||
<string name="set_action_mode_next">Passer au suivant</string>
|
<string name="set_action_mode_next">Passer au suivant</string>
|
||||||
|
|
|
@ -124,7 +124,7 @@
|
||||||
<string name="lbl_ep_live">EP en directo</string>
|
<string name="lbl_ep_live">EP en directo</string>
|
||||||
<string name="lbl_ep_remix">EP remix</string>
|
<string name="lbl_ep_remix">EP remix</string>
|
||||||
<string name="lbl_sort_asc">Ascendente</string>
|
<string name="lbl_sort_asc">Ascendente</string>
|
||||||
<string name="lbl_sort_dec">Descendente</string>
|
<string name="lbl_sort_dsc">Descendente</string>
|
||||||
<string name="lbl_equalizer">Ecualizador</string>
|
<string name="lbl_equalizer">Ecualizador</string>
|
||||||
<string name="lbl_shuffle_selected">Aleatorio seleccionado</string>
|
<string name="lbl_shuffle_selected">Aleatorio seleccionado</string>
|
||||||
<string name="lbl_sample_rate">Frecuencia de mostraxe</string>
|
<string name="lbl_sample_rate">Frecuencia de mostraxe</string>
|
||||||
|
|
|
@ -99,7 +99,7 @@
|
||||||
<string name="set_play_song_from_all">सभी गीतों से चलाएं</string>
|
<string name="set_play_song_from_all">सभी गीतों से चलाएं</string>
|
||||||
<string name="fmt_deletion_info">%s हटाएँ\? इसे पूर्ववत नहीं किया जा सकता।</string>
|
<string name="fmt_deletion_info">%s हटाएँ\? इसे पूर्ववत नहीं किया जा सकता।</string>
|
||||||
<string name="fmt_lib_song_count">लोड किए गए गाने: %d</string>
|
<string name="fmt_lib_song_count">लोड किए गए गाने: %d</string>
|
||||||
<string name="lbl_sort_dec">अवरोही</string>
|
<string name="lbl_sort_dsc">अवरोही</string>
|
||||||
<string name="lbl_play_selected">चयनित चलाएँ</string>
|
<string name="lbl_play_selected">चयनित चलाएँ</string>
|
||||||
<string name="lbl_shuffle_selected">फेरबदल का चयन किया गया</string>
|
<string name="lbl_shuffle_selected">फेरबदल का चयन किया गया</string>
|
||||||
<string name="lbl_state_wiped">स्थिति साफ की गई</string>
|
<string name="lbl_state_wiped">स्थिति साफ की गई</string>
|
||||||
|
|
|
@ -255,7 +255,7 @@
|
||||||
<string name="lbl_reset">Resetiraj</string>
|
<string name="lbl_reset">Resetiraj</string>
|
||||||
<string name="set_replay_gain">ReplayGain izjednačavanje glasnoće</string>
|
<string name="set_replay_gain">ReplayGain izjednačavanje glasnoće</string>
|
||||||
<string name="set_dirs_list">Mape</string>
|
<string name="set_dirs_list">Mape</string>
|
||||||
<string name="lbl_sort_dec">Silazni</string>
|
<string name="lbl_sort_dsc">Silazni</string>
|
||||||
<string name="set_ui_desc">Promijenite temu i boje aplikacije</string>
|
<string name="set_ui_desc">Promijenite temu i boje aplikacije</string>
|
||||||
<string name="set_personalize_desc">Prilagodite kontrole i ponašanje korisničkog sučelja</string>
|
<string name="set_personalize_desc">Prilagodite kontrole i ponašanje korisničkog sučelja</string>
|
||||||
<string name="set_content_desc">Upravljajte učitavanjem glazbe i slika</string>
|
<string name="set_content_desc">Upravljajte učitavanjem glazbe i slika</string>
|
||||||
|
|
|
@ -74,7 +74,7 @@
|
||||||
<string name="lbl_ep_remix">Remix EP</string>
|
<string name="lbl_ep_remix">Remix EP</string>
|
||||||
<string name="lbl_name">Név</string>
|
<string name="lbl_name">Név</string>
|
||||||
<string name="lbl_date">Dátum</string>
|
<string name="lbl_date">Dátum</string>
|
||||||
<string name="lbl_sort_dec">Csökkenő</string>
|
<string name="lbl_sort_dsc">Csökkenő</string>
|
||||||
<string name="lbl_play_selected">Kiválasztott lejátszása</string>
|
<string name="lbl_play_selected">Kiválasztott lejátszása</string>
|
||||||
<string name="lbl_new_playlist">Új lejátszólista</string>
|
<string name="lbl_new_playlist">Új lejátszólista</string>
|
||||||
<string name="def_genre">Ismeretlen műfaj</string>
|
<string name="def_genre">Ismeretlen műfaj</string>
|
||||||
|
|
|
@ -274,7 +274,7 @@
|
||||||
<string name="set_state">Persistenza</string>
|
<string name="set_state">Persistenza</string>
|
||||||
<string name="set_personalize_desc">Personalizza controlli e comportamento dell\'UI</string>
|
<string name="set_personalize_desc">Personalizza controlli e comportamento dell\'UI</string>
|
||||||
<string name="set_audio_desc">Configura comportamento di suono e riproduzione</string>
|
<string name="set_audio_desc">Configura comportamento di suono e riproduzione</string>
|
||||||
<string name="lbl_sort_dec">Discendente</string>
|
<string name="lbl_sort_dsc">Discendente</string>
|
||||||
<string name="lbl_playlist">Playlist</string>
|
<string name="lbl_playlist">Playlist</string>
|
||||||
<string name="lbl_playlists">Playlist</string>
|
<string name="lbl_playlists">Playlist</string>
|
||||||
<string name="set_intelligent_sorting">Ordinazione intelligente</string>
|
<string name="set_intelligent_sorting">Ordinazione intelligente</string>
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
<string name="lbl_date_added">תאריך הוספה</string>
|
<string name="lbl_date_added">תאריך הוספה</string>
|
||||||
<string name="lbl_sort">מיון</string>
|
<string name="lbl_sort">מיון</string>
|
||||||
<string name="lbl_sort_asc">עולה</string>
|
<string name="lbl_sort_asc">עולה</string>
|
||||||
<string name="lbl_sort_dec">יורד</string>
|
<string name="lbl_sort_dsc">יורד</string>
|
||||||
<string name="lbl_playback">מושמע כעת</string>
|
<string name="lbl_playback">מושמע כעת</string>
|
||||||
<string name="lbl_equalizer">איקוולייזר</string>
|
<string name="lbl_equalizer">איקוולייזר</string>
|
||||||
<string name="lbl_play">ניגון</string>
|
<string name="lbl_play">ניגון</string>
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
<string name="lbl_file_name">ファイル名</string>
|
<string name="lbl_file_name">ファイル名</string>
|
||||||
<string name="lbl_date_added">追加した日付け</string>
|
<string name="lbl_date_added">追加した日付け</string>
|
||||||
<string name="lbl_sample_rate">サンプルレート</string>
|
<string name="lbl_sample_rate">サンプルレート</string>
|
||||||
<string name="lbl_sort_dec">降順</string>
|
<string name="lbl_sort_dsc">降順</string>
|
||||||
<string name="lbl_play">再生</string>
|
<string name="lbl_play">再生</string>
|
||||||
<string name="lbl_shuffle">シャフル</string>
|
<string name="lbl_shuffle">シャフル</string>
|
||||||
<string name="lbl_shuffle_selected">選択曲をシャフル</string>
|
<string name="lbl_shuffle_selected">選択曲をシャフル</string>
|
||||||
|
|
|
@ -270,7 +270,7 @@
|
||||||
<string name="set_state">지속</string>
|
<string name="set_state">지속</string>
|
||||||
<string name="set_behavior">동작</string>
|
<string name="set_behavior">동작</string>
|
||||||
<string name="set_personalize_desc">UI 제어 및 동작 커스텀</string>
|
<string name="set_personalize_desc">UI 제어 및 동작 커스텀</string>
|
||||||
<string name="lbl_sort_dec">내림차순</string>
|
<string name="lbl_sort_dsc">내림차순</string>
|
||||||
<string name="lbl_playlist">재생목록</string>
|
<string name="lbl_playlist">재생목록</string>
|
||||||
<string name="lbl_playlists">재생목록</string>
|
<string name="lbl_playlists">재생목록</string>
|
||||||
<string name="desc_playlist_image">%s의 재생 목록 이미지</string>
|
<string name="desc_playlist_image">%s의 재생 목록 이미지</string>
|
||||||
|
|
|
@ -267,7 +267,7 @@
|
||||||
<string name="set_replay_gain">ReplayGain</string>
|
<string name="set_replay_gain">ReplayGain</string>
|
||||||
<string name="set_dirs_list">Aplankalai</string>
|
<string name="set_dirs_list">Aplankalai</string>
|
||||||
<string name="set_state">Pastovumas</string>
|
<string name="set_state">Pastovumas</string>
|
||||||
<string name="lbl_sort_dec">Mažėjantis</string>
|
<string name="lbl_sort_dsc">Mažėjantis</string>
|
||||||
<string name="set_intelligent_sorting_desc">Teisingai surūšiuoti pavadinimus, kurie prasideda skaičiais arba žodžiais, tokiais kaip „the“ (geriausiai veikia su anglų kalbos muzika)</string>
|
<string name="set_intelligent_sorting_desc">Teisingai surūšiuoti pavadinimus, kurie prasideda skaičiais arba žodžiais, tokiais kaip „the“ (geriausiai veikia su anglų kalbos muzika)</string>
|
||||||
<string name="set_intelligent_sorting">Išmanusis rūšiavimas</string>
|
<string name="set_intelligent_sorting">Išmanusis rūšiavimas</string>
|
||||||
<string name="lbl_playlist">Grojaraštis</string>
|
<string name="lbl_playlist">Grojaraštis</string>
|
||||||
|
|
|
@ -90,7 +90,7 @@
|
||||||
<string name="lbl_artist_details">കലാകാരനിലേക്ക് പോകുക</string>
|
<string name="lbl_artist_details">കലാകാരനിലേക്ക് പോകുക</string>
|
||||||
<string name="lbl_song_detail">സവിശേഷതകൾ കാണുക</string>
|
<string name="lbl_song_detail">സവിശേഷതകൾ കാണുക</string>
|
||||||
<string name="lbl_state_saved">സ്ഥിതി സംരക്ഷിച്ചു</string>
|
<string name="lbl_state_saved">സ്ഥിതി സംരക്ഷിച്ചു</string>
|
||||||
<string name="lbl_sort_dec">അവരോഹണം</string>
|
<string name="lbl_sort_dsc">അവരോഹണം</string>
|
||||||
<string name="lbl_state_restored">സ്ഥിതി പുനഃസ്ഥാപിച്ചു</string>
|
<string name="lbl_state_restored">സ്ഥിതി പുനഃസ്ഥാപിച്ചു</string>
|
||||||
<string name="lbl_wiki">വിക്കി</string>
|
<string name="lbl_wiki">വിക്കി</string>
|
||||||
<string name="lbl_state_wiped">സ്ഥിതി മായ്ച്ചു</string>
|
<string name="lbl_state_wiped">സ്ഥിതി മായ്ച്ചു</string>
|
||||||
|
|
|
@ -201,7 +201,7 @@
|
||||||
<item quantity="one">%d album</item>
|
<item quantity="one">%d album</item>
|
||||||
<item quantity="other">%d album</item>
|
<item quantity="other">%d album</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="lbl_sort_dec">Synkende</string>
|
<string name="lbl_sort_dsc">Synkende</string>
|
||||||
<string name="lbl_track">Spor</string>
|
<string name="lbl_track">Spor</string>
|
||||||
<string name="lbl_date_added">Dato tillagt</string>
|
<string name="lbl_date_added">Dato tillagt</string>
|
||||||
<string name="lbl_sort">Sorter</string>
|
<string name="lbl_sort">Sorter</string>
|
||||||
|
|
|
@ -246,7 +246,7 @@
|
||||||
<string name="lbl_genre">Genre</string>
|
<string name="lbl_genre">Genre</string>
|
||||||
<string name="set_separators_and">Ampersand (&)</string>
|
<string name="set_separators_and">Ampersand (&)</string>
|
||||||
<string name="lbl_edit">Bewerken</string>
|
<string name="lbl_edit">Bewerken</string>
|
||||||
<string name="lbl_sort_dec">Aflopend</string>
|
<string name="lbl_sort_dsc">Aflopend</string>
|
||||||
<string name="err_did_not_wipe">Kan status niet wissen</string>
|
<string name="err_did_not_wipe">Kan status niet wissen</string>
|
||||||
<string name="desc_playlist_image">Afspeellijst-afbeelding voor %s</string>
|
<string name="desc_playlist_image">Afspeellijst-afbeelding voor %s</string>
|
||||||
<string name="def_song_count">Geen nummers</string>
|
<string name="def_song_count">Geen nummers</string>
|
||||||
|
|
|
@ -75,7 +75,7 @@
|
||||||
<string name="info_app_desc">ਐਂਡਰੌਇਡ ਲਈ ਇੱਕ ਸਰਲ, ਤਰਕਸੰਗਤ ਸੰਗੀਤ ਪਲੇਅਰ।</string>
|
<string name="info_app_desc">ਐਂਡਰੌਇਡ ਲਈ ਇੱਕ ਸਰਲ, ਤਰਕਸੰਗਤ ਸੰਗੀਤ ਪਲੇਅਰ।</string>
|
||||||
<string name="lbl_search">ਖੋਜੋ</string>
|
<string name="lbl_search">ਖੋਜੋ</string>
|
||||||
<string name="lbl_song_count">ਗੀਤ ਦੀ ਗਿਣਤੀ</string>
|
<string name="lbl_song_count">ਗੀਤ ਦੀ ਗਿਣਤੀ</string>
|
||||||
<string name="lbl_sort_dec">ਘਟਦੇ ਹੋਏ</string>
|
<string name="lbl_sort_dsc">ਘਟਦੇ ਹੋਏ</string>
|
||||||
<string name="lbl_play_selected">ਚੁਣਿਆ ਹੋਇਆ ਚਲਾਓ</string>
|
<string name="lbl_play_selected">ਚੁਣਿਆ ਹੋਇਆ ਚਲਾਓ</string>
|
||||||
<string name="lbl_artist_details">ਕਲਾਕਾਰ \'ਤੇ ਜਾਓ</string>
|
<string name="lbl_artist_details">ਕਲਾਕਾਰ \'ਤੇ ਜਾਓ</string>
|
||||||
<string name="lbl_file_name">ਫਾਈਲ ਦਾ ਨਾਮ</string>
|
<string name="lbl_file_name">ਫਾਈਲ ਦਾ ਨਾਮ</string>
|
||||||
|
|
|
@ -275,7 +275,7 @@
|
||||||
<string name="set_music">Muzyka</string>
|
<string name="set_music">Muzyka</string>
|
||||||
<string name="err_did_not_wipe">Nie można wyczyścić stanu odtwarzania</string>
|
<string name="err_did_not_wipe">Nie można wyczyścić stanu odtwarzania</string>
|
||||||
<string name="err_did_not_save">Nie można zapisać stanu odtwarzania</string>
|
<string name="err_did_not_save">Nie można zapisać stanu odtwarzania</string>
|
||||||
<string name="lbl_sort_dec">Malejąco</string>
|
<string name="lbl_sort_dsc">Malejąco</string>
|
||||||
<string name="lbl_playlists">Playlisty</string>
|
<string name="lbl_playlists">Playlisty</string>
|
||||||
<string name="lbl_playlist">Playlista</string>
|
<string name="lbl_playlist">Playlista</string>
|
||||||
<string name="desc_playlist_image">Obraz playlisty %s</string>
|
<string name="desc_playlist_image">Obraz playlisty %s</string>
|
||||||
|
|
|
@ -272,7 +272,7 @@
|
||||||
<string name="set_state">Persistência</string>
|
<string name="set_state">Persistência</string>
|
||||||
<string name="set_behavior">Comportamento</string>
|
<string name="set_behavior">Comportamento</string>
|
||||||
<string name="set_dirs_list">Pastas</string>
|
<string name="set_dirs_list">Pastas</string>
|
||||||
<string name="lbl_sort_dec">Descendente</string>
|
<string name="lbl_sort_dsc">Descendente</string>
|
||||||
<string name="set_intelligent_sorting">Ignorar artigos ao classificar</string>
|
<string name="set_intelligent_sorting">Ignorar artigos ao classificar</string>
|
||||||
<string name="set_intelligent_sorting_desc">Ignore palavras como \"the\" ao classificar por nome (funciona melhor com músicas em inglês)</string>
|
<string name="set_intelligent_sorting_desc">Ignore palavras como \"the\" ao classificar por nome (funciona melhor com músicas em inglês)</string>
|
||||||
</resources>
|
</resources>
|
|
@ -260,7 +260,7 @@
|
||||||
<item quantity="other">%d artistas</item>
|
<item quantity="other">%d artistas</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="set_replay_gain">Equalização de volume ReplayGain</string>
|
<string name="set_replay_gain">Equalização de volume ReplayGain</string>
|
||||||
<string name="lbl_sort_dec">Descendente</string>
|
<string name="lbl_sort_dsc">Descendente</string>
|
||||||
<string name="set_ui_desc">Mude o tema e as cores do app</string>
|
<string name="set_ui_desc">Mude o tema e as cores do app</string>
|
||||||
<string name="set_personalize_desc">Personalize os controles e o comportamento da interface do usuário</string>
|
<string name="set_personalize_desc">Personalize os controles e o comportamento da interface do usuário</string>
|
||||||
<string name="set_content_desc">Controle como a música e as imagens são carregadas</string>
|
<string name="set_content_desc">Controle como a música e as imagens são carregadas</string>
|
||||||
|
|
|
@ -137,7 +137,7 @@
|
||||||
<string name="lbl_play_selected">Redare selecție</string>
|
<string name="lbl_play_selected">Redare selecție</string>
|
||||||
<string name="lbl_playlist">Listă de redare</string>
|
<string name="lbl_playlist">Listă de redare</string>
|
||||||
<string name="lbl_playlists">Liste de redare</string>
|
<string name="lbl_playlists">Liste de redare</string>
|
||||||
<string name="lbl_sort_dec">Descrescător</string>
|
<string name="lbl_sort_dsc">Descrescător</string>
|
||||||
<string name="lbl_shuffle_selected">Selecție aleatorie aleasă</string>
|
<string name="lbl_shuffle_selected">Selecție aleatorie aleasă</string>
|
||||||
<string name="set_action_mode_next">Treceți la următoarea</string>
|
<string name="set_action_mode_next">Treceți la următoarea</string>
|
||||||
<string name="set_play_song_from_artist">Redă de la artist</string>
|
<string name="set_play_song_from_artist">Redă de la artist</string>
|
||||||
|
|
|
@ -277,7 +277,7 @@
|
||||||
<string name="set_playback">Воспроизведение</string>
|
<string name="set_playback">Воспроизведение</string>
|
||||||
<string name="set_dirs_list">Папки</string>
|
<string name="set_dirs_list">Папки</string>
|
||||||
<string name="set_state">Состояние воспроизведения</string>
|
<string name="set_state">Состояние воспроизведения</string>
|
||||||
<string name="lbl_sort_dec">По убыванию</string>
|
<string name="lbl_sort_dsc">По убыванию</string>
|
||||||
<string name="lbl_playlist">Плейлист</string>
|
<string name="lbl_playlist">Плейлист</string>
|
||||||
<string name="lbl_playlists">Плейлисты</string>
|
<string name="lbl_playlists">Плейлисты</string>
|
||||||
<string name="desc_playlist_image">Обложка плейлиста для %s</string>
|
<string name="desc_playlist_image">Обложка плейлиста для %s</string>
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
<string name="lbl_track">Spår</string>
|
<string name="lbl_track">Spår</string>
|
||||||
<string name="lbl_date_added">Datum tillagt</string>
|
<string name="lbl_date_added">Datum tillagt</string>
|
||||||
<string name="lbl_sort_asc">Stigande</string>
|
<string name="lbl_sort_asc">Stigande</string>
|
||||||
<string name="lbl_sort_dec">Fallande</string>
|
<string name="lbl_sort_dsc">Fallande</string>
|
||||||
<string name="lbl_playback">Nu spelar</string>
|
<string name="lbl_playback">Nu spelar</string>
|
||||||
<string name="lbl_equalizer">Utjämnare</string>
|
<string name="lbl_equalizer">Utjämnare</string>
|
||||||
<string name="lbl_play">Spela</string>
|
<string name="lbl_play">Spela</string>
|
||||||
|
|
|
@ -263,7 +263,7 @@
|
||||||
<string name="set_playback">Oynatma</string>
|
<string name="set_playback">Oynatma</string>
|
||||||
<string name="set_library">Kütüphane</string>
|
<string name="set_library">Kütüphane</string>
|
||||||
<string name="set_state">Kalıcılık</string>
|
<string name="set_state">Kalıcılık</string>
|
||||||
<string name="lbl_sort_dec">Azalan</string>
|
<string name="lbl_sort_dsc">Azalan</string>
|
||||||
<string name="set_ui_desc">Uygulamanın temasını ve renklerini değiştirin</string>
|
<string name="set_ui_desc">Uygulamanın temasını ve renklerini değiştirin</string>
|
||||||
<string name="set_dirs_list">Klasörler</string>
|
<string name="set_dirs_list">Klasörler</string>
|
||||||
<string name="set_personalize_desc">Arayüz kontrollerini ve davranışını özelleştirin</string>
|
<string name="set_personalize_desc">Arayüz kontrollerini ve davranışını özelleştirin</string>
|
||||||
|
|
|
@ -274,7 +274,7 @@
|
||||||
<string name="set_state">Стан відтворення</string>
|
<string name="set_state">Стан відтворення</string>
|
||||||
<string name="set_audio_desc">Налаштуйте звук і поведінку при відтворенні</string>
|
<string name="set_audio_desc">Налаштуйте звук і поведінку при відтворенні</string>
|
||||||
<string name="set_dirs_list">Папки</string>
|
<string name="set_dirs_list">Папки</string>
|
||||||
<string name="lbl_sort_dec">За спаданням</string>
|
<string name="lbl_sort_dsc">За спаданням</string>
|
||||||
<string name="desc_playlist_image">Зображення списку відтворення для %s</string>
|
<string name="desc_playlist_image">Зображення списку відтворення для %s</string>
|
||||||
<string name="lbl_playlist">Список відтворення</string>
|
<string name="lbl_playlist">Список відтворення</string>
|
||||||
<string name="lbl_playlists">Списки відтворення</string>
|
<string name="lbl_playlists">Списки відтворення</string>
|
||||||
|
|
|
@ -268,7 +268,7 @@
|
||||||
<string name="set_dirs_list">文件夹</string>
|
<string name="set_dirs_list">文件夹</string>
|
||||||
<string name="set_music">音乐</string>
|
<string name="set_music">音乐</string>
|
||||||
<string name="set_audio_desc">配置声音和播放行为</string>
|
<string name="set_audio_desc">配置声音和播放行为</string>
|
||||||
<string name="lbl_sort_dec">降序</string>
|
<string name="lbl_sort_dsc">降序</string>
|
||||||
<string name="lbl_playlist">播放列表</string>
|
<string name="lbl_playlist">播放列表</string>
|
||||||
<string name="lbl_playlists">播放列表</string>
|
<string name="lbl_playlists">播放列表</string>
|
||||||
<string name="desc_playlist_image">%s 的播放列表图片</string>
|
<string name="desc_playlist_image">%s 的播放列表图片</string>
|
||||||
|
|
|
@ -105,7 +105,7 @@
|
||||||
|
|
||||||
<string name="lbl_sort">Sort</string>
|
<string name="lbl_sort">Sort</string>
|
||||||
<string name="lbl_sort_asc">Ascending</string>
|
<string name="lbl_sort_asc">Ascending</string>
|
||||||
<string name="lbl_sort_dec">Descending</string>
|
<string name="lbl_sort_dsc">Descending</string>
|
||||||
|
|
||||||
<string name="lbl_playback">Now playing</string>
|
<string name="lbl_playback">Now playing</string>
|
||||||
<string name="lbl_equalizer">Equalizer</string>
|
<string name="lbl_equalizer">Equalizer</string>
|
||||||
|
|
Loading…
Reference in a new issue