diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt index 127c84468..b676745cd 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt @@ -158,6 +158,8 @@ constructor( val playlistInstructions: Event get() = _playlistInstructions + private var isEditingPlaylist = false + /** The current [Sort] used for [Song]s in [playlistList]. */ var playlistSongSort: Sort get() = musicSettings.playlistSongSort @@ -412,7 +414,7 @@ constructor( val list = mutableListOf() if (playlist.songs.isNotEmpty()) { - val header = SortHeader(R.string.lbl_songs) + val header = BasicHeader(R.string.lbl_songs) list.add(Divider(header)) list.add(header) if (replace) { diff --git a/app/src/main/java/org/oxycblt/auxio/list/recycler/MaterialDragCallback.kt b/app/src/main/java/org/oxycblt/auxio/list/recycler/MaterialDragCallback.kt new file mode 100644 index 000000000..a2983755d --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/list/recycler/MaterialDragCallback.kt @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2021 Auxio Project + * ExtendedDragCallback.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 . + */ + +package org.oxycblt.auxio.list.recycler + +import android.graphics.Canvas +import android.graphics.drawable.Drawable +import android.view.View +import android.view.animation.AccelerateDecelerateInterpolator +import androidx.core.view.isInvisible +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView +import org.oxycblt.auxio.R +import org.oxycblt.auxio.util.getDimen +import org.oxycblt.auxio.util.getInteger +import org.oxycblt.auxio.util.logD + +/** + * A highly customized [ItemTouchHelper.Callback] that enables some extra eye candy in editable UIs, + * such as an animation when lifting items. Note that this requires a [ViewHolder] implementation in + * order to function. + * + * @author Alexander Capehart (OxygenCobalt) + */ +abstract class MaterialDragCallback : ItemTouchHelper.Callback() { + private var shouldLift = true + + final override fun getMovementFlags( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder + ) = + if (viewHolder is ViewHolder) { + makeFlag( + ItemTouchHelper.ACTION_STATE_DRAG, ItemTouchHelper.UP or ItemTouchHelper.DOWN) or + makeFlag(ItemTouchHelper.ACTION_STATE_SWIPE, ItemTouchHelper.START) + } else { + 0 + } + + final override fun onChildDraw( + c: Canvas, + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + dX: Float, + dY: Float, + actionState: Int, + isCurrentlyActive: Boolean + ) { + val holder = viewHolder as ViewHolder + + // Hook drag events to "lifting" the item (i.e raising it's elevation). Make sure + // this is only done once when the item is initially picked up. + // TODO: I think this is possible to improve with a raw ValueAnimator. + if (shouldLift && isCurrentlyActive && actionState == ItemTouchHelper.ACTION_STATE_DRAG) { + logD("Lifting item") + + val bg = holder.background + val elevation = recyclerView.context.getDimen(R.dimen.elevation_normal) + holder.root + .animate() + .translationZ(elevation) + .setDuration( + recyclerView.context.getInteger(R.integer.anim_fade_exit_duration).toLong()) + .setUpdateListener { + bg.alpha = ((holder.root.translationZ / elevation) * 255).toInt() + } + .setInterpolator(AccelerateDecelerateInterpolator()) + .start() + + shouldLift = false + } + + // We show a background with a delete icon behind the item each time one is swiped + // away. To avoid working with canvas, this is simply placed behind the body. + // That comes with a couple of problems, however. For one, the background view will always + // lag behind the body view, resulting in a noticeable pixel offset when dragging. To fix + // this, we make this a separate view and make this view invisible whenever the item is + // not being swiped. This issue is also the reason why the background is not merged with + // the FrameLayout within the item. + if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { + holder.delete.isInvisible = dX == 0f + } + + // Update other translations. We do not call the default implementation, so we must do + // this ourselves. + holder.body.translationX = dX + holder.root.translationY = dY + } + + final override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { + // When an elevated item is cleared, we reset the elevation using another animation. + val holder = viewHolder as ViewHolder + + // This function can be called multiple times, so only start the animation when the view's + // translationZ is already non-zero. + if (holder.root.translationZ != 0f) { + logD("Dropping item") + + val bg = holder.background + val elevation = recyclerView.context.getDimen(R.dimen.elevation_normal) + holder.root + .animate() + .translationZ(0f) + .setDuration( + recyclerView.context.getInteger(R.integer.anim_fade_exit_duration).toLong()) + .setUpdateListener { + bg.alpha = ((holder.root.translationZ / elevation) * 255).toInt() + } + .setInterpolator(AccelerateDecelerateInterpolator()) + .start() + } + + shouldLift = true + + // Reset translations. We do not call the default implementation, so we must do + // this ourselves. + holder.body.translationX = 0f + holder.root.translationY = 0f + } + + // Long-press events are too buggy, only allow dragging with the handle. + final override fun isLongPressDragEnabled() = false + + /** Required [RecyclerView.ViewHolder] implementation that exposes the following. */ + interface ViewHolder { + /** The root view containing the delete scrim and information. */ + val root: View + /** The body view containing music information. */ + val body: View + /** The scrim view showing the delete icon. Should be behind [body]. */ + val delete: View + /** The drawable of the [body] background that can be elevated. */ + val background: Drawable + } +} diff --git a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt index df4ac8c1d..de1edf36c 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueAdapter.kt @@ -26,9 +26,10 @@ import androidx.core.view.isInvisible import androidx.recyclerview.widget.RecyclerView import com.google.android.material.shape.MaterialShapeDrawable import org.oxycblt.auxio.R -import org.oxycblt.auxio.databinding.ItemQueueSongBinding +import org.oxycblt.auxio.databinding.ItemEditableSongBinding import org.oxycblt.auxio.list.EditableListListener import org.oxycblt.auxio.list.adapter.* +import org.oxycblt.auxio.list.recycler.MaterialDragCallback import org.oxycblt.auxio.list.recycler.SongViewHolder import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.resolveNames @@ -96,34 +97,32 @@ class QueueAdapter(private val listener: EditableListListener) : } /** - * A [PlayingIndicatorAdapter.ViewHolder] that displays a queue [Song]. Use [from] to create an - * instance. + * A [PlayingIndicatorAdapter.ViewHolder] that displays an editable [Song] which can be re-ordered + * and removed. Use [from] to create an instance. * * @author Alexander Capehart (OxygenCobalt) */ -class QueueSongViewHolder private constructor(private val binding: ItemQueueSongBinding) : - PlayingIndicatorAdapter.ViewHolder(binding.root) { - /** The "body" view of this [QueueSongViewHolder] that shows the [Song] information. */ - val bodyView: View +class QueueSongViewHolder private constructor(private val binding: ItemEditableSongBinding) : + PlayingIndicatorAdapter.ViewHolder(binding.root), MaterialDragCallback.ViewHolder { + override val root: View + get() = binding.root + + override val body: View get() = binding.body - /** The background view of this [QueueSongViewHolder] that shows the delete icon. */ - val backgroundView: View + override val delete: View get() = binding.background - /** The actual background drawable of this [QueueSongViewHolder] that can be manipulated. */ - val backgroundDrawable = + override val background = MaterialShapeDrawable.createWithElevationOverlay(binding.root.context).apply { fillColor = binding.context.getAttrColorCompat(R.attr.colorSurface) elevation = binding.context.getDimen(R.dimen.elevation_normal) * 5 alpha = 0 } - /** If this queue item is considered "in the future" (i.e has not played yet). */ var isFuture: Boolean get() = binding.songAlbumCover.isEnabled set(value) { - // Don't want to disable clicking, just indicate the body and handle is disabled binding.songAlbumCover.isEnabled = value binding.songName.isEnabled = value binding.songInfo.isEnabled = value @@ -137,7 +136,7 @@ class QueueSongViewHolder private constructor(private val binding: ItemQueueSong fillColor = binding.context.getAttrColorCompat(R.attr.colorSurface) elevation = binding.context.getDimen(R.dimen.elevation_normal) }, - backgroundDrawable)) + background)) } /** @@ -148,7 +147,7 @@ class QueueSongViewHolder private constructor(private val binding: ItemQueueSong */ @SuppressLint("ClickableViewAccessibility") fun bind(song: Song, listener: EditableListListener) { - listener.bind(song, this, bodyView, binding.songDragHandle) + listener.bind(song, this, body, binding.songDragHandle) binding.songAlbumCover.bind(song) binding.songName.text = song.name.resolve(binding.context) binding.songInfo.text = song.artists.resolveNames(binding.context) @@ -170,7 +169,7 @@ class QueueSongViewHolder private constructor(private val binding: ItemQueueSong * @return A new instance. */ fun from(parent: View) = - QueueSongViewHolder(ItemQueueSongBinding.inflate(parent.context.inflater)) + QueueSongViewHolder(ItemEditableSongBinding.inflate(parent.context.inflater)) /** A comparator that can be used with DiffUtil. */ val DIFF_CALLBACK = SongViewHolder.DIFF_CALLBACK diff --git a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueDragCallback.kt b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueDragCallback.kt index 5b61eb7c4..23d45f62a 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueDragCallback.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueDragCallback.kt @@ -18,15 +18,9 @@ package org.oxycblt.auxio.playback.queue -import android.graphics.Canvas -import android.view.animation.AccelerateDecelerateInterpolator -import androidx.core.view.isInvisible import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView -import org.oxycblt.auxio.R -import org.oxycblt.auxio.util.getDimen -import org.oxycblt.auxio.util.getInteger -import org.oxycblt.auxio.util.logD +import org.oxycblt.auxio.list.recycler.MaterialDragCallback /** * A highly customized [ItemTouchHelper.Callback] that enables some extra eye candy in the queue UI, @@ -34,108 +28,16 @@ import org.oxycblt.auxio.util.logD * * @author Alexander Capehart (OxygenCobalt) */ -class QueueDragCallback(private val playbackModel: QueueViewModel) : ItemTouchHelper.Callback() { - private var shouldLift = true - - override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) = - makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, ItemTouchHelper.UP or ItemTouchHelper.DOWN) or - makeFlag(ItemTouchHelper.ACTION_STATE_SWIPE, ItemTouchHelper.START) - - override fun onChildDraw( - c: Canvas, - recyclerView: RecyclerView, - viewHolder: RecyclerView.ViewHolder, - dX: Float, - dY: Float, - actionState: Int, - isCurrentlyActive: Boolean - ) { - val holder = viewHolder as QueueSongViewHolder - - // Hook drag events to "lifting" the queue item (i.e raising it's elevation). Make sure - // this is only done once when the item is initially picked up. - // TODO: I think this is possible to improve with a raw ValueAnimator. - if (shouldLift && isCurrentlyActive && actionState == ItemTouchHelper.ACTION_STATE_DRAG) { - logD("Lifting queue item") - - val bg = holder.backgroundDrawable - val elevation = recyclerView.context.getDimen(R.dimen.elevation_normal) - holder.itemView - .animate() - .translationZ(elevation) - .setDuration( - recyclerView.context.getInteger(R.integer.anim_fade_exit_duration).toLong()) - .setUpdateListener { - bg.alpha = ((holder.itemView.translationZ / elevation) * 255).toInt() - } - .setInterpolator(AccelerateDecelerateInterpolator()) - .start() - - shouldLift = false - } - - // We show a background with a delete icon behind the queue song each time one is swiped - // away. To avoid working with canvas, this is simply placed behind the queue body. - // That comes with a couple of problems, however. For one, the background view will always - // lag behind the body view, resulting in a noticeable pixel offset when dragging. To fix - // this, we make this a separate view and make this view invisible whenever the item is - // not being swiped. This issue is also the reason why the background is not merged with - // the FrameLayout within the queue item. - if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { - holder.backgroundView.isInvisible = dX == 0f - } - - // Update other translations. We do not call the default implementation, so we must do - // this ourselves. - holder.bodyView.translationX = dX - holder.itemView.translationY = dY - } - - override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { - // When an elevated item is cleared, we reset the elevation using another animation. - val holder = viewHolder as QueueSongViewHolder - - // This function can be called multiple times, so only start the animation when the view's - // translationZ is already non-zero. - if (holder.itemView.translationZ != 0f) { - logD("Dropping queue item") - - val bg = holder.backgroundDrawable - val elevation = recyclerView.context.getDimen(R.dimen.elevation_normal) - holder.itemView - .animate() - .translationZ(0f) - .setDuration( - recyclerView.context.getInteger(R.integer.anim_fade_exit_duration).toLong()) - .setUpdateListener { - bg.alpha = ((holder.itemView.translationZ / elevation) * 255).toInt() - } - .setInterpolator(AccelerateDecelerateInterpolator()) - .start() - } - - shouldLift = true - - // Reset translations. We do not call the default implementation, so we must do - // this ourselves. - holder.bodyView.translationX = 0f - holder.itemView.translationY = 0f - } - +class QueueDragCallback(private val queueModel: QueueViewModel) : MaterialDragCallback() { override fun onMove( recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder - ): Boolean { - logD("${viewHolder.bindingAdapterPosition} ${target.bindingAdapterPosition}") - return playbackModel.moveQueueDataItems( + ) = + queueModel.moveQueueDataItems( viewHolder.bindingAdapterPosition, target.bindingAdapterPosition) - } override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { - playbackModel.removeQueueDataItem(viewHolder.bindingAdapterPosition) + queueModel.removeQueueDataItem(viewHolder.bindingAdapterPosition) } - - // Long-press events are too buggy, only allow dragging with the handle. - override fun isLongPressDragEnabled() = false } diff --git a/app/src/main/res/layout/fragment_queue.xml b/app/src/main/res/layout/fragment_queue.xml index 2fb2319b9..f53cc6d85 100644 --- a/app/src/main/res/layout/fragment_queue.xml +++ b/app/src/main/res/layout/fragment_queue.xml @@ -10,7 +10,7 @@ style="@style/Widget.Auxio.RecyclerView.Linear" android:layout_width="match_parent" android:layout_height="match_parent" - tools:listitem="@layout/item_queue_song" /> + tools:listitem="@layout/item_editable_song" /> @@ -79,7 +79,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/spacing_mid_medium" - android:contentDescription="@string/desc_queue_handle" + android:contentDescription="@string/desc_song_handle" app:icon="@drawable/ic_handle_24" app:layout_constraintBottom_toBottomOf="@+id/song_album_cover" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/values-ar-rIQ/strings.xml b/app/src/main/res/values-ar-rIQ/strings.xml index 3844f401a..50e2518d2 100644 --- a/app/src/main/res/values-ar-rIQ/strings.xml +++ b/app/src/main/res/values-ar-rIQ/strings.xml @@ -89,8 +89,8 @@ تغيير وضع التكرار تشغيل او اطفاء الخلط خلط جميع الاغاني - إزالة اغنية من الطابور - نقل اغنية من الطابور + إزالة اغنية من الطابور + نقل اغنية من الطابور تحريك التبويت إزالة كلمة البحث إزالة المجلد المستبعد diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 6a927398e..ce5bc96c2 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -144,7 +144,7 @@ Гэтая папка не падтрымліваецца Немагчыма аднавіць стан Кампазіцыя %d - Перамясціць песню ў чаргу + Перамясціць песню ў чаргу Не знойдзена прыкладання, якое можа справіцца з гэтай задачай Прайграванне або прыпыненне Немагчыма захаваць стан @@ -153,7 +153,7 @@ Змяніць рэжым паўтору Значок Auxio Уключыце або выключыце перамешванне - Выдаліць гэтую песню з чаргі + Выдаліць гэтую песню з чаргі Перамяшаць усе песні Спыніць прайграванне Адкрыйце чаргу diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 4956c0358..4fd532ca5 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -109,8 +109,8 @@ Změnit režim opakování Vypnout nebo zapnout náhodné přehrávání Náhodně přehrávat vše - Odebrat tuto skladbu z fronty - Přesunout tuto skladbu ve frontě + Odebrat tuto skladbu z fronty + Přesunout tuto skladbu ve frontě Přesunout tuto kartu Vymazat hledání Odebrat složku diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 9b4f49f1c..d6e98eed5 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -125,7 +125,7 @@ Pause bei Wiederholung Pausieren, wenn ein Song wiederholt wird Zufällig an- oder ausschalten - Lied in der Warteschlange verschieben + Lied in der Warteschlange verschieben Verzechnis entfernen Albumcover Keine Musik wird gespielt @@ -133,7 +133,7 @@ Sichtbarkeit und Ordnung der Bibliotheksregisterkarten ändern Name Alle Lieder zufällig - Lied in der Warteschlange löschen + Lied in der Warteschlange löschen Tab versetzen Unbekannter Künstler Dauer diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 0dc0c61bf..99cfeb71b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -91,8 +91,8 @@ Cambiar modo de repetición Act/des mezcla Mezclar todo - Quitar canción de la cola - Mover canción en la cola + Quitar canción de la cola + Mover canción en la cola Mover pestaña Borrar historial de búsqueda Quitar carpeta diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 8a7227404..a74b4072e 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -203,8 +203,8 @@ Advanced Audio Coding (AAC) Free Lossless Audio Codec (FLAC) Vermello - Quitar esta canción da cola - Mover está canción na cola + Quitar esta canción da cola + Mover está canción na cola Mover esta pestana Rosa Morado diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index b183da9dc..b724693bd 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -107,8 +107,8 @@ Zvučni zapis %d Omogućite ili onemogućite miješanje Izmiješaj sve pjesme - Ukoni ovu pjesmu iz popisa pjesama - Premjesti ovu pjesmu u popisu pjesama + Ukoni ovu pjesmu iz popisa pjesama + Premjesti ovu pjesmu u popisu pjesama Pomakni ovu pločicu Izbriši pretražene pojmove Ukloni mapu diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 54f651893..4e9be7cdf 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -139,7 +139,7 @@ Gambar Artis untuk %s Saat diputar dari keterangan item Musik tidak akan dimuat dari folder yang Anda tambahkan. - Hapus lagu antrian ini + Hapus lagu antrian ini Hapus kueri pencarian Penyesuaian tanpa tag Folder musik @@ -159,7 +159,7 @@ Ikon Auxio Sampul album Aktifkan atau nonaktifkan acak - Pindahkan lagu antrian ini + Pindahkan lagu antrian ini Tidak ada musik yang diputar Audio Ogg Cokelat diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 0f15797e2..7a569af56 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -94,8 +94,8 @@ Cambia modalità ripetizione Attiva o disattiva mescolamento Mescola tutte le canzoni - Rimuove questa canzone della coda - Muove questa canzone della coda + Rimuove questa canzone della coda + Muove questa canzone della coda Muove questa scheda Cancella la query di ricerca Rimuovi cartella diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 686f03f87..1a9610f13 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -8,7 +8,7 @@ 曲の長さ 現在の再生状態を保存 このタブを移動 - この再生待ちの曲を移動 + この再生待ちの曲を移動 日付けがありません すべての曲 @@ -91,7 +91,7 @@ 再生状態を復元できません トラック %d 再生またはポーズ - 再生待ちの曲を除去 + 再生待ちの曲を除去 フォルダを除去 Auxio アイコン アルバムカバー diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 4437eb3b0..e1746f7cd 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -107,8 +107,8 @@ 반복 방식 변경 무작위 재생 켜기 또는 끄기 모든 곡 무작위 재생 - 이 대기열의 곡 제거 - 이 대기열의 곡 이동 + 이 대기열의 곡 제거 + 이 대기열의 곡 이동 이 탭 이동 검색 기록 삭제 폴더 제거 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 1fa1c648f..4c1eb493a 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -138,7 +138,7 @@ Pageidaujamas albumui, jei vienas groja Jokių programų nerasta, kurios galėtų atlikti šią užduotį „Auxio“ piktograma - Perkelti šią eilės dainą + Perkelti šią eilės dainą Perkelti šį skirtuką Muzikos krovimas nepavyko „Auxio“ reikia leidimo skaityti jūsų muzikos biblioteką @@ -173,7 +173,7 @@ Išvalyti paieškos užklausą Muzika nebus įkeliama iš pridėtų aplankų jūs pridėsite. Įtraukti - Pašalinti šią eilės dainą + Pašalinti šią eilės dainą Groti iš visų dainų Groti iš parodyto elemento Groti iš albumo diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index c866a1b81..0ecf86df0 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -65,8 +65,8 @@ സംഗീതം കളിക്കുന്നില്ല മഞ്ഞ %d തിരഞ്ഞെടുത്തു - വരിയിലെ ഈ ഗാനം നീക്കം ചെയ്യുക - വരിയിലെ ഈ ഗാനം നീക്കുക + വരിയിലെ ഈ ഗാനം നീക്കം ചെയ്യുക + വരിയിലെ ഈ ഗാനം നീക്കുക പുനഃസജ്ജമാക്കുക തവിട്ട് %1$s, %2$s diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index bcbe1c649..263a5a955 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -162,8 +162,8 @@ Afspeelstatus herstellen Herstel de eerder opgeslagen afspeelstatus (indien aanwezig) Geen staat kan hersteld worden - Verwijder dit wachtrij liedje - Verplaats dit wachtrij liedje + Verwijder dit wachtrij liedje + Verplaats dit wachtrij liedje Verplaats deze tab Album cover Geen tracknummer diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 44c4a5d8c..7e70b3cda 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -196,8 +196,8 @@ ਲਾਇਬ੍ਰੇਰੀ ਸੰਗੀਤ ਫੋਲਡਰ ਕਤਾਰ ਖੋਲ੍ਹੋ - ਇਸ ਕਤਾਰ ਗੀਤ ਨੂੰ ਹਟਾਓ - ਇਸ ਕਤਾਰ ਗੀਤ ਨੂੰ ਮੂਵ ਕਰੋ + ਇਸ ਕਤਾਰ ਗੀਤ ਨੂੰ ਹਟਾਓ + ਇਸ ਕਤਾਰ ਗੀਤ ਨੂੰ ਮੂਵ ਕਰੋ ਦੁਹਰਾਓ ਮੋਡ ਬਦਲੋ ਸ਼ਫਲ ਚਾਲੂ ਜਾਂ ਬੰਦ ਕਰੋ ਸਾਰੇ ਗੀਤਾਂ ਨੂੰ ਸ਼ਫਲ ਕਰੋ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 65c74d5ac..55c1e2434 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -137,7 +137,7 @@ Automatycznie odtwórz muzykę po podłączeniu słuchawek (może nie działać na wszystkich urządzeniach) Odśwież muzykę Odśwież bibliotekę muzyczną używając tagów z pamięci cache, jeśli są dostępne - Usuń utwór z kolejki + Usuń utwór z kolejki Preferuj album Automatycznie odśwież FLAC @@ -173,7 +173,7 @@ Automatycznie odśwież bibliotekę po wykryciu zmian (wymaga stałego powiadomienia) Wyklucz Zawrzyj - Zmień pozycję utworu w kolejce + Zmień pozycję utworu w kolejce Przesuń kartę Wizerunek wykonawcy dla %s Ładuję bibliotekę muzyczną… diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 39f7febb4..b8e2b2539 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -123,7 +123,7 @@ Pular para a música anterior Alterar o modo de repetição Aleatorizar todas das músicas - Remover esta música da fila + Remover esta música da fila Limpar histórico de pesquisa Capa do álbum para %s Mover esta aba @@ -147,7 +147,7 @@ Áudio Matroska Codificação de Audio Avançada (AAC) Free Lossless Audio Codec (FLAC) - Mover esta música da fila + Mover esta música da fila Dinâmico Duração total: %s Carregando sua biblioteca de músicas… (%1$d/%2$d) diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 3e7f7a265..ff331f33f 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -98,7 +98,7 @@ O Auxio precisa de permissão para ler a sua biblioteca de músicas Sem pastas Esta pasta não é compatível - Mover esta música da fila + Mover esta música da fila Remover pasta Compilações de remix Compilação ao vivo @@ -195,7 +195,7 @@ Restaurar o estado de reprodução salvo anteriormente (se houver) Ativar ou desativar a reprodução aleatória Embaralhar todas as músicas - Remover esta música de fila + Remover esta música de fila Áudio Matroska Codificação de Audio Avançada (AAC) Álbum diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 1b85b95a9..39ff8b565 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -93,8 +93,8 @@ Режим повтора Перемешивание Перемешать все треки - Удалить трек из очереди - Переместить трек в очереди + Удалить трек из очереди + Переместить трек в очереди Переместить вкладку Очистить поисковый запрос Удалить папку diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 93c6c8733..c73aa22c3 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -192,7 +192,7 @@ Eklendiği tarih Remix albüm Canlı albüm - Bu şarkıyı kuyruktan kaldır + Bu şarkıyı kuyruktan kaldır Tekliler Tekli Karışık kaset @@ -254,7 +254,7 @@ Müzik olmayanları hariç tut Durum temizlenemedi ReplayGain stratejisi - Bu şarkıyı kuyrukta taşı + Bu şarkıyı kuyrukta taşı %1$s, %2$s Müzik ve görüntülerin nasıl yükleneceğini denetleyin Müzik diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 53d4c2948..c618eb6f9 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -218,8 +218,8 @@ Невідомий жанр Відкрити чергу Жовтий - Перемістити пісню в черзі - Видалити пісню з черги + Перемістити пісню в черзі + Видалити пісню з черги Блакитний Зеленувато-блакитний Фіолетовий diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index db6995078..ff969df42 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -93,8 +93,8 @@ 更改重复播放模式 开启或关闭随机播放模式 随机播放所有曲目 - 移除队列曲目 - 移动队列曲目 + 移除队列曲目 + 移动队列曲目 移动该标签 清除搜索队列 移除文件夹 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a7bcf57cb..ecf466dda 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -311,8 +311,8 @@ Create a new playlist Stop playback - Remove this queue song - Move this queue song + Remove this song + Move this song Open the queue Move this tab Clear search query