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 86d4aee4c..dffde42ac 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt @@ -186,42 +186,44 @@ constructor( } override fun onMusicChanges(changes: MusicRepository.Changes) { - if (!changes.deviceLibrary) return - val deviceLibrary = musicRepository.deviceLibrary ?: return - val userLibrary = musicRepository.userLibrary ?: return - // If we are showing any item right now, we will need to refresh it (and any information // related to it) with the new library in order to prevent stale items from showing up // in the UI. + val deviceLibrary = musicRepository.deviceLibrary + if (changes.deviceLibrary && deviceLibrary != null) { + val song = currentSong.value + if (song != null) { + _currentSong.value = deviceLibrary.findSong(song.uid)?.also(::refreshAudioInfo) + logD("Updated song to ${currentSong.value}") + } - val song = currentSong.value - if (song != null) { - _currentSong.value = deviceLibrary.findSong(song.uid)?.also(::refreshAudioInfo) - logD("Updated song to ${currentSong.value}") + val album = currentAlbum.value + if (album != null) { + _currentAlbum.value = deviceLibrary.findAlbum(album.uid)?.also(::refreshAlbumList) + logD("Updated album to ${currentAlbum.value}") + } + + val artist = currentArtist.value + if (artist != null) { + _currentArtist.value = + deviceLibrary.findArtist(artist.uid)?.also(::refreshArtistList) + logD("Updated artist to ${currentArtist.value}") + } + + val genre = currentGenre.value + if (genre != null) { + _currentGenre.value = deviceLibrary.findGenre(genre.uid)?.also(::refreshGenreList) + logD("Updated genre to ${currentGenre.value}") + } } - val album = currentAlbum.value - if (album != null) { - _currentAlbum.value = deviceLibrary.findAlbum(album.uid)?.also(::refreshAlbumList) - logD("Updated album to ${currentAlbum.value}") - } - - val artist = currentArtist.value - if (artist != null) { - _currentArtist.value = deviceLibrary.findArtist(artist.uid)?.also(::refreshArtistList) - logD("Updated artist to ${currentArtist.value}") - } - - val genre = currentGenre.value - if (genre != null) { - _currentGenre.value = deviceLibrary.findGenre(genre.uid)?.also(::refreshGenreList) - logD("Updated genre to ${currentGenre.value}") - } - - val playlist = currentPlaylist.value - if (playlist != null) { - _currentPlaylist.value = - userLibrary.findPlaylist(playlist.uid)?.also(::refreshPlaylistList) + val userLibrary = musicRepository.userLibrary + if (changes.userLibrary && userLibrary != null) { + val playlist = currentPlaylist.value + if (playlist != null) { + _currentPlaylist.value = + userLibrary.findPlaylist(playlist.uid)?.also(::refreshPlaylistList) + } } } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/PlaylistDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/PlaylistDetailFragment.kt index fb3fdd90d..d1214f6b2 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/PlaylistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/PlaylistDetailFragment.kt @@ -126,6 +126,10 @@ class PlaylistDetailFragment : requireContext().showToast(R.string.lng_queue_added) true } + R.id.action_delete -> { + musicModel.deletePlaylist(currentPlaylist) + true + } else -> false } } diff --git a/app/src/main/java/org/oxycblt/auxio/list/ListFragment.kt b/app/src/main/java/org/oxycblt/auxio/list/ListFragment.kt index 213b28980..f2e050e40 100644 --- a/app/src/main/java/org/oxycblt/auxio/list/ListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/list/ListFragment.kt @@ -255,6 +255,9 @@ abstract class ListFragment : playbackModel.addToQueue(playlist) requireContext().showToast(R.string.lng_queue_added) } + R.id.action_delete -> { + musicModel.deletePlaylist(playlist) + } else -> { error("Unexpected menu item selected") } diff --git a/app/src/main/java/org/oxycblt/auxio/music/Music.kt b/app/src/main/java/org/oxycblt/auxio/music/Music.kt index bfc48927b..37cbf83bc 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Music.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Music.kt @@ -350,8 +350,8 @@ interface Playlist : MusicParent { } /** - * Run [Name.resolve] on each instance in the given list and concatenate them into a [String] - * in a localized manner. + * Run [Name.resolve] on each instance in the given list and concatenate them into a [String] in a + * localized manner. * * @param context [Context] required * @return A concatenated string. diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt index 3b6291056..99e93ffb0 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt @@ -118,6 +118,13 @@ interface MusicRepository { */ fun createPlaylist(name: String, songs: List) + /** + * Delete a [Playlist]. + * + * @param playlist The playlist to delete. + */ + fun deletePlaylist(playlist: Playlist) + /** * Add the given [Song]s to a [Playlist]. * @@ -262,6 +269,15 @@ constructor( } } + override fun deletePlaylist(playlist: Playlist) { + val userLibrary = userLibrary ?: return + userLibrary.deletePlaylist(playlist) + for (listener in updateListeners) { + listener.onMusicChanges( + MusicRepository.Changes(deviceLibrary = false, userLibrary = true)) + } + } + override fun addToPlaylist(songs: List, playlist: Playlist) { val userLibrary = userLibrary ?: return userLibrary.addToPlaylist(playlist, songs) diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicViewModel.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicViewModel.kt index ea487ba46..df53b581d 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicViewModel.kt @@ -106,6 +106,17 @@ constructor( } } + /** + * Delete a [Playlist]. + * + * @param playlist The playlist to delete. + * + * TODO: Prompt the user before deleting. + */ + fun deletePlaylist(playlist: Playlist) { + musicRepository.deletePlaylist(playlist) + } + /** * Add a [Song] to a [Playlist]. * diff --git a/app/src/main/java/org/oxycblt/auxio/music/device/DeviceLibrary.kt b/app/src/main/java/org/oxycblt/auxio/music/device/DeviceLibrary.kt index f292303b5..44ac4e99d 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/device/DeviceLibrary.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/device/DeviceLibrary.kt @@ -210,6 +210,8 @@ private class DeviceLibraryImpl(rawSongs: List, settings: MusicSettings albums: List, settings: MusicSettings ): List { + // TODO: Debug an issue with my current library config that results in two duplicate + // artists. // Add every raw artist credited to each Song/Album to the grouping. This way, // different multi-artist combinations are not treated as different artists. val musicByArtist = mutableMapOf>() diff --git a/app/src/main/java/org/oxycblt/auxio/music/metadata/SeparatorsDialog.kt b/app/src/main/java/org/oxycblt/auxio/music/metadata/SeparatorsDialog.kt index c413fa2bd..5fa612667 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/metadata/SeparatorsDialog.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/metadata/SeparatorsDialog.kt @@ -99,11 +99,6 @@ class SeparatorsDialog : ViewBindingDialogFragment() { return separators } - /** - * Defines the allowed separator characters that can be used to delimit multi-value tags. - * - * @author Alexander Capehart (OxygenCobalt) - */ private object Separators { const val COMMA = ',' const val SEMICOLON = ';' diff --git a/app/src/main/java/org/oxycblt/auxio/music/metadata/TagWorker.kt b/app/src/main/java/org/oxycblt/auxio/music/metadata/TagWorker.kt index 504491033..115462a8a 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/metadata/TagWorker.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/metadata/TagWorker.kt @@ -130,6 +130,9 @@ private class TagWorkerImpl( // 3. ID3v2.4 Release Date, as it is the second most common date type // 4. ID3v2.3 Original Date, as it is like #1 // 5. ID3v2.3 Release Year, as it is the most common date type + // TODO: Show original and normal dates side-by-side + // TODO: Handle dates that are in "January" because the actual specific release date + // isn't known? (textFrames["TDOR"]?.run { Date.from(first()) } ?: textFrames["TDRC"]?.run { Date.from(first()) } ?: textFrames["TDRL"]?.run { Date.from(first()) } diff --git a/app/src/main/java/org/oxycblt/auxio/music/user/UserLibrary.kt b/app/src/main/java/org/oxycblt/auxio/music/user/UserLibrary.kt index 4e5239f7d..f2df2d1a5 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/user/UserLibrary.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/user/UserLibrary.kt @@ -80,6 +80,13 @@ interface MutableUserLibrary : UserLibrary { */ fun createPlaylist(name: String, songs: List) + /** + * Delete a [Playlist]. + * + * @param playlist The playlist to delete. + */ + fun deletePlaylist(playlist: Playlist) + /** * Add [Song]s to a [Playlist]. * @@ -120,6 +127,11 @@ private class UserLibraryImpl( playlistMap[playlistImpl.uid] = playlistImpl } + @Synchronized + override fun deletePlaylist(playlist: Playlist) { + playlistMap.remove(playlist.uid) + } + @Synchronized override fun addToPlaylist(playlist: Playlist, songs: List) { val playlistImpl = diff --git a/app/src/main/res/menu/menu_playlist_actions.xml b/app/src/main/res/menu/menu_playlist_actions.xml index df535f77d..4f852e49f 100644 --- a/app/src/main/res/menu/menu_playlist_actions.xml +++ b/app/src/main/res/menu/menu_playlist_actions.xml @@ -12,4 +12,7 @@ + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_playlist_detail.xml b/app/src/main/res/menu/menu_playlist_detail.xml index e480d9191..c3e30e8b9 100644 --- a/app/src/main/res/menu/menu_playlist_detail.xml +++ b/app/src/main/res/menu/menu_playlist_detail.xml @@ -6,4 +6,7 @@ + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cbc3db5e4..2bd4d67d2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -79,6 +79,7 @@ Playlist Playlists New playlist + Delete Search