From 314b9b454cfd51503331b8ddc848df1fe4fd13d9 Mon Sep 17 00:00:00 2001 From: adlifarizi Date: Fri, 15 May 2026 14:32:26 +0700 Subject: [PATCH 1/3] refactor: modify UI components for readability - change selection more action to icon-only - use dynamic spacing between album covers and text in album multi selection to remove empty space - add weight and softWrap in SliderSettingsItem to avoid value text wrap --- .../AlbumMultiSelectionOptionSheet.kt | 10 +++--- .../components/subcomps/SelectionActionRow.kt | 15 +++----- .../screens/SettingsComponents.kt | 34 ++++++++++++++----- 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/components/AlbumMultiSelectionOptionSheet.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/components/AlbumMultiSelectionOptionSheet.kt index 872fc588d..37cee5f1f 100644 --- a/app/src/main/java/com/theveloper/pixelplay/presentation/components/AlbumMultiSelectionOptionSheet.kt +++ b/app/src/main/java/com/theveloper/pixelplay/presentation/components/AlbumMultiSelectionOptionSheet.kt @@ -76,8 +76,7 @@ fun AlbumMultiSelectionOptionSheet( verticalAlignment = Alignment.CenterVertically ) { StackedAlbumCovers( - albums = selectedAlbums.take(4), - modifier = Modifier.width(150.dp) + albums = selectedAlbums.take(4) ) Spacer(modifier = Modifier.width(16.dp)) @@ -227,8 +226,11 @@ private fun StackedAlbumCovers( val borderWidth = 3.dp val borderColor = MaterialTheme.colorScheme.surfaceContainerLow + val numAlbums = albums.size + val totalWidth = if (numAlbums == 0) 0.dp else imageSize + (imageSize - overlap) * (numAlbums - 1) + Box( - modifier = modifier, + modifier = modifier.width(totalWidth), contentAlignment = Alignment.CenterStart ) { albums.forEachIndexed { index, album -> @@ -236,7 +238,7 @@ private fun StackedAlbumCovers( Box( modifier = Modifier .offset { IntOffset(offsetX.dp.roundToPx(), 0) } - .zIndex((albums.size - index).toFloat()) + .zIndex((numAlbums - index).toFloat()) .size(imageSize) .background(borderColor, CircleShape) ) { diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/components/subcomps/SelectionActionRow.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/components/subcomps/SelectionActionRow.kt index c9eb6833c..be6e5e03c 100644 --- a/app/src/main/java/com/theveloper/pixelplay/presentation/components/subcomps/SelectionActionRow.kt +++ b/app/src/main/java/com/theveloper/pixelplay/presentation/components/subcomps/SelectionActionRow.kt @@ -25,7 +25,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.CheckCircle import androidx.compose.material.icons.rounded.Deselect -import androidx.compose.material.icons.rounded.MoreHoriz +import androidx.compose.material.icons.rounded.MoreVert import androidx.compose.material.icons.rounded.SelectAll import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.FilledTonalButton @@ -171,21 +171,14 @@ fun SelectionActionRow( containerColor = MaterialTheme.colorScheme.primaryContainer, contentColor = MaterialTheme.colorScheme.onPrimaryContainer ), - contentPadding = PaddingValues(horizontal = 16.dp), - modifier = Modifier.height(buttonHeight) + contentPadding = PaddingValues(horizontal = 2.dp), + modifier = Modifier.height(buttonHeight).width(36.dp) ) { Icon( - imageVector = Icons.Rounded.MoreHoriz, + imageVector = Icons.Rounded.MoreVert, contentDescription = stringResource(R.string.presentation_batch_g_selection_cd_more), modifier = Modifier.size(20.dp) ) - Spacer(modifier = Modifier.width(6.dp)) - Text( - text = stringResource(R.string.presentation_batch_g_selection_options), - style = MaterialTheme.typography.labelLarge, - fontWeight = FontWeight.Medium, - fontFamily = GoogleSansRounded - ) } } } diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SettingsComponents.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SettingsComponents.kt index 3c5084075..eabcfaa6c 100644 --- a/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SettingsComponents.kt +++ b/app/src/main/java/com/theveloper/pixelplay/presentation/screens/SettingsComponents.kt @@ -389,14 +389,18 @@ fun SliderSettingsItem( ) { Text( text = label, + modifier = Modifier.weight(1f), style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.onSurface ) + Spacer(modifier = Modifier.width(8.dp)) Text( text = valueText(value), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.primary, - fontWeight = FontWeight.Bold + fontWeight = FontWeight.Bold, + maxLines = 1, + softWrap = false ) } Slider( @@ -463,13 +467,19 @@ fun RefreshLibraryItem( enabled = !isSyncing, modifier = Modifier.fillMaxWidth() ) { - Icon( + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically + ) { + Icon( imageVector = Icons.Outlined.Refresh, contentDescription = null, modifier = Modifier.size(18.dp) - ) - Spacer(modifier = Modifier.width(8.dp)) - Text(stringResource(R.string.presentation_batch_f_full_rescan)) + ) + Spacer(modifier = Modifier.width(8.dp)) + Text(stringResource(R.string.presentation_batch_f_full_rescan)) + } } Spacer(modifier = Modifier.height(8.dp)) @@ -484,13 +494,19 @@ fun RefreshLibraryItem( ), border = BorderStroke(1.dp, MaterialTheme.colorScheme.error.copy(alpha = 0.5f)) ) { - Icon( + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically + ) { + Icon( imageVector = Icons.Outlined.DeleteForever, contentDescription = null, modifier = Modifier.size(18.dp) - ) - Spacer(modifier = Modifier.width(8.dp)) - Text(stringResource(R.string.presentation_batch_f_rebuild_database)) + ) + Spacer(modifier = Modifier.width(8.dp)) + Text(stringResource(R.string.presentation_batch_f_rebuild_database)) + } } if (isSyncing) { From 0ff0a3eed6eeb3f2543e1ba711d650ccc5449951 Mon Sep 17 00:00:00 2001 From: adlifarizi Date: Fri, 15 May 2026 14:33:27 +0700 Subject: [PATCH 2/3] feat: add missing Indonesian localization --- app/src/main/res/values-in/strings.xml | 5 + .../strings_presentation_batch_c.xml | 1 + .../strings_presentation_batch_e.xml | 1 + .../strings_presentation_batch_f.xml | 5 + .../strings_presentation_batch_g.xml | 202 ++++++++---------- .../main/res/values-in/strings_screens.xml | 13 ++ 6 files changed, 112 insertions(+), 115 deletions(-) diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 02493daaa..93ecea71b 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -58,6 +58,7 @@ Sinkronisasi selesai Menunggu… Menyinkronkan pustaka… + Menyinkronkan sumber cloud... Lagu tidak dikenal Artis tidak dikenal Album tidak dikenal @@ -78,6 +79,7 @@ Putar Playlist tidak ditemukan. + Disc %d Silakan konfigurasi API key yang valid untuk penyedia AI yang dipilih di Pengaturan. Kesalahan AI: %s Penyedia AI yang dipilih menolak permintaan karena akun tidak memiliki kredit atau kuota yang tersedia. @@ -222,4 +224,7 @@ %1$d%% v%1$d %1$s %2$s + Menyelesaikan di latar belakang... + Memindai lirik... + Membersihkan cache sampul album... diff --git a/app/src/main/res/values-in/strings_presentation_batch_c.xml b/app/src/main/res/values-in/strings_presentation_batch_c.xml index 24d405f95..59fb22063 100644 --- a/app/src/main/res/values-in/strings_presentation_batch_c.xml +++ b/app/src/main/res/values-in/strings_presentation_batch_c.xml @@ -30,6 +30,7 @@ Tambah lagu terpilih Tambah Cari lagu… + Disukai Gagal memuat lagu Muat lebih banyak diff --git a/app/src/main/res/values-in/strings_presentation_batch_e.xml b/app/src/main/res/values-in/strings_presentation_batch_e.xml index 4e52bcd59..1a206dc73 100644 --- a/app/src/main/res/values-in/strings_presentation_batch_e.xml +++ b/app/src/main/res/values-in/strings_presentation_batch_e.xml @@ -5,6 +5,7 @@ Tindakan antrean Bersihkan antrean Simpan sebagai playlist + Temukan lagu saat ini Antrean %1$s Antrean saat ini dihapus diff --git a/app/src/main/res/values-in/strings_presentation_batch_f.xml b/app/src/main/res/values-in/strings_presentation_batch_f.xml index 03c516749..bd593db0d 100644 --- a/app/src/main/res/values-in/strings_presentation_batch_f.xml +++ b/app/src/main/res/values-in/strings_presentation_batch_f.xml @@ -11,6 +11,7 @@ Memproses trek Menyimpan ke database Memindai file lirik + Menyinkronkan sumber cloud... Menyelesaikan sinkronisasi %1$s • %2$d%% (%3$d/%4$d) %1$s… @@ -202,6 +203,8 @@ Ambil lagu terbaru dari saluran ini Hapus saluran Berhenti menyinkronkan dan hapus lagu yang dicache + %1$s akan berhenti disinkronkan dan semua lagu cache dari channel ini akan dihapus. + Hapus Tidak Ada Saluran yang Disinkronkan Tambahkan saluran Telegram publik untuk menyinkronkan\npustaka musik Anda Tambah saluran @@ -226,4 +229,6 @@ %d topik %d topik + Membersihkan cache sampul album... + Hapus channel? diff --git a/app/src/main/res/values-in/strings_presentation_batch_g.xml b/app/src/main/res/values-in/strings_presentation_batch_g.xml index 88d1bc970..19e8493c8 100644 --- a/app/src/main/res/values-in/strings_presentation_batch_g.xml +++ b/app/src/main/res/values-in/strings_presentation_batch_g.xml @@ -285,18 +285,71 @@ Sematkan Ubah nama Hapus - Beta 0.6.0 - Selamat datang di PixelPlayer 0.6.0-beta - Beta ini sekarang difokuskan pada stabilitas, performa, dan pemutaran lintas perangkat sambil merilis integrasi baru yang besar. - Apa yang diharapkan - Penggunaan harian yang lebih cepat: startup, navigasi, dan interaksi pemutar yang lebih lancar di seluruh aplikasi. - Dukungan perangkat yang lebih luas: Android Auto, peningkatan Wear OS, dan keandalan Cast yang lebih kuat. - Ekosistem cloud yang diperluas: daftar putar Telegram, sinkronisasi NetEase, QQ Music, dan pembaruan streaming Google Drive. - Peningkatan keandalan besar-besaran: logika antrean/acak, perilaku pemutaran latar belakang, dan banyak perbaikan UI. - Laporkan masalah - Bagikan langkah-langkah untuk mereproduksi, hasil yang diharapkan, hasil aktual, dan detail perangkat/OS Anda. Rekaman layar singkat sangat membantu. - Buka issue GitHub - Laporkan bug + Beta 0.7.0 + Selamat datang di PixelPlayer 0.7.0-beta + Anda menggunakan versi beta yang mungkin berisi bug, crash, atau fitur eksperimental. Bantu kami meningkatkannya dengan melaporkan masalah. + Yang perlu diharapkan + Bug, crash, atau fitur yang belum selesai dapat terjadi sewaktu-waktu. + Beberapa fitur dapat berubah atau dihapus tanpa pemberitahuan. + Versi beta mungkin lebih tidak stabil dibanding versi rilis. + Selalu periksa pembaruan sebelum melaporkan masalah yang sudah diketahui. + Hal yang dapat berubah, rusak, atau ditingkatkan selama pengujian beta. + Shortcut issue GitHub + Cari terlebih dahulu, lalu buat laporan yang jelas untuk bug, crash, permintaan fitur, atau pertanyaan. + Buka issue yang ada + Laporkan masalah atau crash + Cara melapor + Checklist singkat sebelum membuat issue baru. + Sebelum membuat issue + Cari issue terbuka dan tertutup yang sudah ada untuk menghindari duplikat. + Perbarui ke versi PixelPlayer terbaru dan pastikan masalah masih terjadi. + Mulai ulang aplikasi dan pastikan masalah tetap terjadi. + Coba reproduksi masalah dan catat langkah-langkahnya secara jelas. + Jenis issue apa? + Laporan bug: Ada sesuatu yang tidak berjalan semestinya. + Permintaan fitur: Tambahkan fitur atau peningkatan baru. + Pertanyaan: Gunakan Discussions jika tersedia, atau buat issue dengan label pertanyaan. + Laporan bug + Salin bagian ini saat ada fitur yang bermasalah atau crash. + Laporan Bug + Ringkasan singkat: + Perilaku yang diharapkan: + Perilaku saat ini: + Langkah memutar/reproduksi: 1. 2. 3. + Seberapa sering terjadi? Selalu / Kadang / Jarang. + Screenshot / video: jika tersedia. + Log / stack trace: jika tersedia. + Lingkungan + Versi PixelPlayer: + Sumber instalasi: GitHub Release, debug build, nightly build, dll. + Versi Android: + Model perangkat: + Konteks tambahan: penggunaan kartu SD, pengaturan khusus, izin, dll. + Permintaan fitur + Salin bagian ini jika ingin fitur atau peningkatan baru. + Deskripsi masalah: Masalah apa yang ingin diselesaikan? + Solusi yang diusulkan: Bagaimana fitur ini seharusnya bekerja? + Alternatif yang dipertimbangkan: Apakah ada pendekatan lain? + Cakupan: Layar atau alur mana yang terpengaruh? + Mockup atau gambar referensi jika tersedia. + Judul, privasi, dan cakupan + Buat laporan mudah ditinjau dan aman untuk dibagikan. + Contoh judul issue yang baik + Equalizer: Indikator bergeser saat berpindah tab preset + Pencarian: Riwayat tidak muncul saat query kosong + Fitur: Tambahkan opsi urut playlist \"Baru Ditambahkan\" + Harap hindari + Laporan umum seperti \"Tidak berfungsi\". + Beberapa masalah yang tidak berkaitan dalam satu issue. + Log atau screenshot tanpa sensor yang berisi data pribadi. + Catatan privasi + Sebelum mengunggah log, screenshot, atau video, hapus informasi pribadi atau sensitif. + Build nightly + Perbedaan nightly dengan rilis resmi, serta apa yang perlu disertakan saat terjadi masalah. + Build nightly dibuat dari commit terbaru dan mungkin berisi perubahan yang belum selesai, bug sementara, atau regresi. Build ini lebih eksperimental dibanding rilis resmi. + Akses build tersebut melalui artifact workflow GitHub Actions repositori jika tersedia. + Melaporkan masalah nightly + Saat melaporkan masalah dari build nightly, selalu sebutkan bahwa masalah terjadi pada build nightly, bukan rilis resmi. Sertakan tanggal build, nama atau nomor workflow run, atau commit SHA jika memungkinkan. Periksa juga apakah masalah yang sama terjadi pada rilis resmi terbaru. Peningkatan Beta 0.5.0 Instal bersih direkomendasikan Jika Anda datang dari beta 0.5.0, pembaruan ini mungkin memerlukan data pustaka baru alih-alih status cache lama. @@ -376,6 +429,7 @@ Segarkan koneksi Segarkan perangkat Perangkat terdekat + Diperlukan untuk mendeteksi dan mengontrol perangkat audio Bluetooth yang terhubung. Ketuk untuk menghubungkan Belum ada perangkat Putuskan @@ -402,116 +456,34 @@ Aktifkan Wi‑Fi Buka Bluetooth Putuskan - Menghubungkan... + Menghubungkan… - Apa yang Baru + Sorotan Peningkatan Perbaikan - Sorotan - Apa yang baru + Yang baru Ditambahkan Diubah Diperbaiki - - Dukungan Android Auto kini tersedia untuk pemutaran di dalam mobil. - Dukungan Wear OS telah hadir, termasuk kontrol pemutaran jam-ke-ponsel yang lebih baik. - Integrasi cloud diperluas dengan peningkatan Telegram, NetEase, QQ Music, dan Google Drive. - Baru-baru ini Diputar dan pemulihan antrean persisten menjaga sesi mendengarkan Anda tetap siap. - Cadangkan & Pulihkan v3 dan alat manajemen akun kini disertakan. - Lirik menjadi lebih pintar dengan pencarian manual cadangan dan peningkatan penyimpanan. - - - Peningkatan performa besar-besaran pada startup, pustaka, antrean, dan interaksi pemutar. - Tampilan Pemutar, Cast, Lirik, Artis, dan Genre didesain ulang untuk penggunaan yang lebih lancar. - Alur navigasi dan pencarian lebih andal, dengan penanganan rute yang lebih aman. - Kompatibilitas pemutaran audio ditingkatkan untuk lebih banyak perangkat dan format. - Alur kerja multi-pilihan diperluas untuk lagu, album, dan daftar putar. - - - Perilaku antrean dan acak kini lebih stabil dan mudah diprediksi. - Beberapa kasus tepi pada pemutaran latar belakang dan casting telah diperbaiki. - Masalah pada Sleep Timer, navigasi tab File, dan crash pada artis album telah diperbaiki. - Pemuatan widget dan stabilitas layanan ditingkatkan untuk mengurangi masalah panas berlebih/memori. - Perbaikan bug umum dan penghalusan UI di seluruh aplikasi. - - - Pembaruan UI Material 3 Expressive - Equalizer 10-band & Efek - Alur Sinkronisasi Pustaka Baru - Integrasi AI (Model Gemini) - Impor/Ekspor Daftar Putar M3U - Integrasi Sampul Artis Deezer - Sampul Daftar Putar Kustom - - - Refaktor Arsitektur Pengaturan - Animasi Antrean & Pemutar - Profil Dasar & Performa - Sistem Lirik Lebih Baik dengan Offset Sinkronisasi - - - Peningkatan Stabilitas Casting - Stabilitas Panel Pemutar - Perbaikan Bug Umum & Pembersihan - - - Redesain navigasi utama - Penjelajah file baru untuk memilih direktori sumber - Fungsionalitas Konektivitas dan casting baru - Kontinuitas mulus antara perangkat jarak jauh - Transisi tanpa jeda antar lagu - Kontrol Crossfade - Fitur Transisi Kustom Baru (hanya untuk daftar putar) - Tetap putar setelah menutup aplikasi - Optimalisasi UI - Fitur statistik yang ditingkatkan - Kontrol Antrean yang didesain ulang dengan lebih banyak fitur - Peningkatan dukungan berbagai tipe file untuk pemutaran dan pengeditan metadata - Peningkatan pengontrol izin - Perbaikan bug minor - - - Memperkenalkan hub statistik yang lebih kaya dengan wawasan lebih dalam tentang sesi Anda. - Meluncurkan pemutar cepat melayang untuk membuka dan melihat pratinjau file lokal secara instan. - Menambahkan tab folder dengan navigator gaya pohon dan tampilan siap-daftar-putar. - - - Menyempurnakan UI Material 3 secara keseluruhan untuk pengalaman yang lebih bersih dan kohesif. - Metadata editing now supports cover art change. - Menghaluskan animasi dan transisi di seluruh aplikasi untuk navigasi yang lebih cair. - Meningkatkan tata letak layar artis dengan detail dan polesan yang lebih kaya. - Meningkatkan pembuatan DailyMix dan YourMix dengan pilihan yang lebih pintar dan beragam. - Memperkuat pembuatan daftar putar AI. - Meningkatkan relevansi pencarian dan presentasi untuk penemuan yang lebih cepat. - Memperluas dukungan untuk rentang format file audio yang lebih luas. - - - Menyelesaikan masalah metadata sehingga detail lagu tetap akurat di mana saja. - Memulihkan pintasan notifikasi sehingga melompat kembali ke pemutaran dengan andal. - - - Dukungan Chromecast untuk melakukan cast audio dari perangkat Anda. - Log perubahan dalam aplikasi untuk membuat Anda tetap terinformasi tentang fitur terbaru. - Dukungan untuk file .LRC, baik yang tertanam maupun eksternal. - Dukungan lirik offline. - Lirik yang disinkronkan (sinkron dengan lagu). - Layar baru untuk melihat antrean lengkap. - Urutkan ulang dan hapus lagu dari antrean. - Gerakan mini-player (geser ke bawah untuk menutup). - Menambahkan lebih banyak animasi material. - Pengaturan baru untuk menyesuaikan tampilan dan nuansa. - Pengaturan baru untuk membersihkan cache. + + + Peningkatan integrasi AI dan pembuatan playlist yang lebih cerdas. + Statistik mendengarkan yang lebih lengkap dengan insight dan visualisasi baru. + Alur sinkronisasi pustaka yang lebih baik di semua penyedia cloud. + Pengeditan metadata yang lebih baik dengan dukungan sampul album. - - Redesain total antarmuka pengguna. - Redesain total pemutar. - Peningkatan performa di pustaka. - Peningkatan kecepatan startup aplikasi. - AI kini memberikan hasil yang lebih baik. + + + Peningkatan performa pada startup, pustaka, antrean, dan interaksi pemutar. + Tampilan Material 3 yang disempurnakan untuk pengalaman yang lebih rapi dan konsisten. + Animasi dan transisi yang lebih mulus di seluruh aplikasi. + Pencarian yang lebih relevan dan penemuan lagu yang lebih cepat. - - Memperbaiki berbagai bug di editor tag. - Memperbaiki bug di mana notifikasi pemutaran tidak bisa dihapus. - Memperbaiki beberapa bug yang menyebabkan aplikasi crash. + + + Memperbaiki perilaku antrean dan shuffle agar pemutaran lebih stabil. + Memperbaiki masalah pemutaran latar belakang dan notifikasi. + Perbaikan bug umum dan penyempurnaan UI. + Perangkat terdekat diff --git a/app/src/main/res/values-in/strings_screens.xml b/app/src/main/res/values-in/strings_screens.xml index 44616ba51..42e0b2b91 100644 --- a/app/src/main/res/values-in/strings_screens.xml +++ b/app/src/main/res/values-in/strings_screens.xml @@ -131,6 +131,8 @@ Your\nMix + Mix Anda akan muncul di sini saat PixelPlayer menemukan lagu atau menyinkronkan sumber. + Refresh Putar Acak Sampul album untuk %1$s Opsi @@ -213,6 +215,7 @@ Menyinkronkan Sinkronkan pustaka Putuskan sambungan + Sinkronisasi pustaka selesai %1$d lagu Sinkronisasi Sinkronkan semua @@ -236,4 +239,14 @@ Ditambahkan ke antrean Diputar berikutnya Tidak dapat membagikan lagu: %1$s + Menyinkronkan pustaka... + Belum ada data untuk ditampilkan + Mengambil playlist... + Menyinkronkan playlist: %1$s + Memperbarui pustaka lokal... + Sinkronisasi selesai + Mengambil daftar album... + Mengambil lagu dari %1$s... + Menyimpan %1$d lagu ke database... + Tidak ada lagu pustaka ditemukan From b750ecbe09837b2ec0f8f487a777ac7fd5e0f151 Mon Sep 17 00:00:00 2001 From: adlifarizi Date: Fri, 15 May 2026 18:02:39 +0700 Subject: [PATCH 3/3] feat: add ascending and descending sort options for artist song counts --- .../pixelplay/data/database/MusicDao.kt | 6 ++++-- .../pixelplay/data/model/SortOption.kt | 16 ++++++++++++---- .../presentation/library/LibraryTabId.kt | 3 ++- .../presentation/viewmodel/LibraryStateHolder.kt | 7 ++++++- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/theveloper/pixelplay/data/database/MusicDao.kt b/app/src/main/java/com/theveloper/pixelplay/data/database/MusicDao.kt index 1ea18c03b..88499c0ec 100644 --- a/app/src/main/java/com/theveloper/pixelplay/data/database/MusicDao.kt +++ b/app/src/main/java/com/theveloper/pixelplay/data/database/MusicDao.kt @@ -1340,7 +1340,8 @@ interface MusicDao { ORDER BY CASE WHEN :sortOrder = 'artist_name_az' THEN artists.name END COLLATE NOCASE ASC, CASE WHEN :sortOrder = 'artist_name_za' THEN artists.name END COLLATE NOCASE DESC, - CASE WHEN :sortOrder = 'artist_num_songs' THEN track_count END DESC, + CASE WHEN :sortOrder = 'artist_num_songs_desc' THEN track_count END DESC, + CASE WHEN :sortOrder = 'artist_num_songs_asc' THEN track_count END ASC, artists.name COLLATE NOCASE ASC, artists.id ASC """) @@ -1373,7 +1374,8 @@ interface MusicDao { ORDER BY CASE WHEN :sortOrder = 'artist_name_az' THEN artists.name END COLLATE NOCASE ASC, CASE WHEN :sortOrder = 'artist_name_za' THEN artists.name END COLLATE NOCASE DESC, - CASE WHEN :sortOrder = 'artist_num_songs' THEN track_count END DESC, + CASE WHEN :sortOrder = 'artist_num_songs_desc' THEN track_count END DESC, + CASE WHEN :sortOrder = 'artist_num_songs_asc' THEN track_count END ASC, artists.name COLLATE NOCASE ASC, artists.id ASC LIMIT :limit OFFSET :offset diff --git a/app/src/main/java/com/theveloper/pixelplay/data/model/SortOption.kt b/app/src/main/java/com/theveloper/pixelplay/data/model/SortOption.kt index 63da2239e..e285eb61b 100644 --- a/app/src/main/java/com/theveloper/pixelplay/data/model/SortOption.kt +++ b/app/src/main/java/com/theveloper/pixelplay/data/model/SortOption.kt @@ -170,13 +170,20 @@ sealed class SortOption( methodKey = "artist_name", direction = SortDirection.Descending ) - object ArtistNumSongs : SortOption( - storageKey = "artist_num_songs", - displayName = "Number of Songs", + object ArtistNumSongsDesc : SortOption( + storageKey = "artist_num_songs_desc", + displayName = "Number of Songs (Most)", methodLabel = "Number of Songs", methodKey = "artist_num_songs", direction = SortDirection.Descending ) + object ArtistNumSongsAsc : SortOption( + storageKey = "artist_num_songs_asc", + displayName = "Number of Songs (Fewest)", + methodLabel = "Number of Songs", + methodKey = "artist_num_songs", + direction = SortDirection.Ascending + ) // Playlist Sort Options object PlaylistNameAZ : SortOption( @@ -367,7 +374,8 @@ sealed class SortOption( listOf( ArtistNameAZ, ArtistNameZA, - ArtistNumSongs + ArtistNumSongsDesc, + ArtistNumSongsAsc ) } diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/library/LibraryTabId.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/library/LibraryTabId.kt index b320f0f9f..a62c5b91f 100644 --- a/app/src/main/java/com/theveloper/pixelplay/presentation/library/LibraryTabId.kt +++ b/app/src/main/java/com/theveloper/pixelplay/presentation/library/LibraryTabId.kt @@ -48,7 +48,8 @@ enum class LibraryTabId( sortOptions = listOf( SortOption.ArtistNameAZ, SortOption.ArtistNameZA, - SortOption.ArtistNumSongs + SortOption.ArtistNumSongsDesc, + SortOption.ArtistNumSongsAsc ) ), Playlists( diff --git a/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/LibraryStateHolder.kt b/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/LibraryStateHolder.kt index 5500d1920..cb6671b0b 100644 --- a/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/LibraryStateHolder.kt +++ b/app/src/main/java/com/theveloper/pixelplay/presentation/viewmodel/LibraryStateHolder.kt @@ -475,11 +475,16 @@ class LibraryStateHolder @Inject constructor( compareByDescending { it.name.lowercase() } .thenBy { it.id } ) - SortOption.ArtistNumSongs -> artists.sortedWith( + SortOption.ArtistNumSongsDesc -> artists.sortedWith( compareByDescending { it.songCount } .thenBy { it.name.lowercase() } .thenBy { it.id } ) + SortOption.ArtistNumSongsAsc -> artists.sortedWith( + compareBy { it.songCount } + .thenBy { it.name.lowercase() } + .thenBy { it.id } + ) else -> artists.toList() } }