Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
""")
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -367,7 +374,8 @@ sealed class SortOption(
listOf(
ArtistNameAZ,
ArtistNameZA,
ArtistNumSongs
ArtistNumSongsDesc,
ArtistNumSongsAsc
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down Expand Up @@ -227,16 +226,19 @@ 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 ->
val offsetX = index * (imageSize.value - overlap.value)
Box(
modifier = Modifier
.offset { IntOffset(offsetX.dp.roundToPx(), 0) }
.zIndex((albums.size - index).toFloat())
.zIndex((numAlbums - index).toFloat())
.size(imageSize)
.background(borderColor, CircleShape)
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ enum class LibraryTabId(
sortOptions = listOf(
SortOption.ArtistNameAZ,
SortOption.ArtistNameZA,
SortOption.ArtistNumSongs
SortOption.ArtistNumSongsDesc,
SortOption.ArtistNumSongsAsc
)
),
Playlists(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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))
Expand All @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -475,11 +475,16 @@ class LibraryStateHolder @Inject constructor(
compareByDescending<Artist> { it.name.lowercase() }
.thenBy { it.id }
)
SortOption.ArtistNumSongs -> artists.sortedWith(
SortOption.ArtistNumSongsDesc -> artists.sortedWith(
compareByDescending<Artist> { it.songCount }
.thenBy { it.name.lowercase() }
.thenBy { it.id }
)
SortOption.ArtistNumSongsAsc -> artists.sortedWith(
compareBy<Artist> { it.songCount }
.thenBy { it.name.lowercase() }
.thenBy { it.id }
)
else -> artists.toList()
}
}
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/res/values-in/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
<string name="sync_complete">Sinkronisasi selesai</string>
<string name="sync_pending">Menunggu…</string>
<string name="syncing_library">Menyinkronkan pustaka…</string>
<string name="library_background_sync_cloud">Menyinkronkan sumber cloud...</string>
<string name="unknown_song_title">Lagu tidak dikenal</string>
<string name="unknown_artist">Artis tidak dikenal</string>
<string name="unknown_album">Album tidak dikenal</string>
Expand All @@ -78,6 +79,7 @@
<string name="play_playback">Putar</string>
<string name="playlist_not_found">Playlist tidak ditemukan.</string>

<string name="disc_number_header">Disc %d</string>
<string name="ai_error_api_key">Silakan konfigurasi API key yang valid untuk penyedia AI yang dipilih di Pengaturan.</string>
<string name="ai_error_generic">Kesalahan AI: %s</string>
<string name="ai_error_quota">Penyedia AI yang dipilih menolak permintaan karena akun tidak memiliki kredit atau kuota yang tersedia.</string>
Expand Down Expand Up @@ -222,4 +224,7 @@
<string name="ui_format_percent_d">%1$d%%</string>
<string name="backup_manifest_schema_v">v%1$d</string>
<string name="backup_manifest_device_line">%1$s %2$s</string>
<string name="library_background_sync">Menyelesaikan di latar belakang...</string>
<string name="library_background_sync_lyrics">Memindai lirik...</string>
<string name="library_background_sync_cache">Membersihkan cache sampul album...</string>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
<string name="cd_confirm_add_songs">Tambah lagu terpilih</string>
<string name="song_picker_action_add">Tambah</string>
<string name="song_picker_search_label">Cari lagu…</string>
<string name="song_picker_filter_favorites">Disukai</string>
<string name="song_picker_error_load_failed">Gagal memuat lagu</string>
<string name="song_picker_load_more">Muat lebih banyak</string>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<string name="presentation_batch_e_cd_queue_actions">Tindakan antrean</string>
<string name="presentation_batch_e_action_clear_queue">Bersihkan antrean</string>
<string name="presentation_batch_e_action_save_as_playlist">Simpan sebagai playlist</string>
<string name="presentation_batch_e_action_locate_current_song">Temukan lagu saat ini</string>
<string name="presentation_batch_e_queue_named_suffix">Antrean %1$s</string>
<string name="presentation_batch_e_queue_current">Antrean saat ini</string>
<string name="presentation_batch_e_removed">dihapus</string>
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/res/values-in/strings_presentation_batch_f.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<string name="presentation_batch_f_sync_phase_processing_tracks">Memproses trek</string>
<string name="presentation_batch_f_sync_phase_saving_db">Menyimpan ke database</string>
<string name="presentation_batch_f_sync_phase_scanning_lrc">Memindai file lirik</string>
<string name="presentation_batch_f_sync_phase_syncing_cloud">Menyinkronkan sumber cloud...</string>
<string name="presentation_batch_f_sync_phase_completing">Menyelesaikan sinkronisasi</string>
<string name="presentation_batch_f_sync_progress_detailed">%1$s • %2$d%% (%3$d/%4$d)</string>
<string name="presentation_batch_f_sync_progress_indeterminate">%1$s…</string>
Expand Down Expand Up @@ -202,6 +203,8 @@
<string name="presentation_batch_f_fetch_latest_songs">Ambil lagu terbaru dari saluran ini</string>
<string name="presentation_batch_f_remove_channel">Hapus saluran</string>
<string name="presentation_batch_f_remove_channel_subtitle">Berhenti menyinkronkan dan hapus lagu yang dicache</string>
<string name="presentation_batch_f_remove_channel_confirm_body">%1$s akan berhenti disinkronkan dan semua lagu cache dari channel ini akan dihapus.</string>
<string name="presentation_batch_f_remove_channel_confirm_action">Hapus</string>
<string name="presentation_batch_f_no_channels_synced">Tidak Ada Saluran yang Disinkronkan</string>
<string name="presentation_batch_f_no_channels_body">Tambahkan saluran Telegram publik untuk menyinkronkan\npustaka musik Anda</string>
<string name="presentation_batch_f_add_channel_button">Tambah saluran</string>
Expand All @@ -226,4 +229,6 @@
<item quantity="one">%d topik</item>
<item quantity="other">%d topik</item>
</plurals>
<string name="presentation_batch_f_sync_phase_cleaning_cache">Membersihkan cache sampul album...</string>
<string name="presentation_batch_f_remove_channel_confirm_title">Hapus channel?</string>
</resources>
Loading
Loading