diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeGenerator.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeGenerator.kt index 605088af6..e09d593c8 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/HomeGenerator.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/HomeGenerator.kt @@ -36,6 +36,8 @@ interface HomeGenerator { fun release() + fun empty(): Boolean + fun songs(): List fun albums(): List @@ -49,6 +51,8 @@ interface HomeGenerator { fun tabs(): List interface Invalidator { + fun invalidateEmpty() {} + fun invalidateMusic(type: MusicType, instructions: UpdateInstructions) fun invalidateTabs() @@ -119,6 +123,8 @@ private class HomeGeneratorImpl( } override fun onMusicChanges(changes: MusicRepository.Changes) { + invalidator.invalidateEmpty() + val library = musicRepository.library if (changes.deviceLibrary && library != null) { L.d("Refreshing library") @@ -142,6 +148,9 @@ private class HomeGeneratorImpl( homeSettings.unregisterListener(this) } + override fun empty() = + musicRepository.library == null + override fun songs() = musicRepository.library?.let { listSettings.songSort.songs(it.songs) } ?: emptyList() diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt index 17ee96617..4175fd6a0 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt @@ -120,6 +120,10 @@ constructor( val playlistList: StateFlow> get() = _playlistList + private val _empty = MutableStateFlow(false) + val empty: StateFlow + get() = _empty + private val _playlistInstructions = MutableEvent() /** Instructions for how to update [genreList] in the UI. */ val playlistInstructions: Event @@ -129,6 +133,7 @@ constructor( val playlistSort: Sort get() = listSettings.playlistSort + private val homeGenerator = homeGeneratorFactory.create(this) /** @@ -172,6 +177,10 @@ constructor( homeGenerator.release() } + override fun invalidateEmpty() { + _empty.value = homeGenerator.empty() + } + override fun invalidateMusic(type: MusicType, instructions: UpdateInstructions) { when (type) { MusicType.SONGS -> { diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt index aa2ee541b..094986288 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt @@ -87,9 +87,10 @@ class AlbumListFragment : } binding.homeNoMusicMsg.text = getString(R.string.lng_empty_albums) - binding.homeChooseMusicSources.setOnClickListener { homeModel.startChooseMusicLocations() } + binding.homeNoMusicAction.setOnClickListener { homeModel.startChooseMusicLocations() } collectImmediately(homeModel.albumList, ::updateAlbums) + collectImmediately(homeModel.empty, ::updateNoMusicIndicator) collectImmediately(listModel.selected, ::updateSelection) collectImmediately( playbackModel.song, playbackModel.parent, playbackModel.isPlaying, ::updatePlayback) @@ -154,13 +155,15 @@ class AlbumListFragment : } private fun updateAlbums(albums: List) { - requireBinding().apply { - homeRecycler.isInvisible = albums.isEmpty() - homeNoMusic.isInvisible = albums.isNotEmpty() - } albumAdapter.update(albums, homeModel.albumInstructions.consume()) } + private fun updateNoMusicIndicator(empty: Boolean) { + val binding = requireBinding() + binding.homeRecycler.isInvisible = empty + binding.homeNoMusic.isInvisible = !empty + } + private fun updateSelection(selection: List) { albumAdapter.setSelected(selection.filterIsInstanceTo(mutableSetOf())) } diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt index 7be5a9d14..29a61d652 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt @@ -81,9 +81,10 @@ class ArtistListFragment : } binding.homeNoMusicMsg.text = getString(R.string.lng_empty_artists) - binding.homeChooseMusicSources.setOnClickListener { homeModel.startChooseMusicLocations() } + binding.homeNoMusicAction.setOnClickListener { homeModel.startChooseMusicLocations() } collectImmediately(homeModel.artistList, ::updateArtists) + collectImmediately(homeModel.empty, ::updateNoMusicIndicator) collectImmediately(listModel.selected, ::updateSelection) collectImmediately( playbackModel.song, playbackModel.parent, playbackModel.isPlaying, ::updatePlayback) @@ -129,13 +130,15 @@ class ArtistListFragment : } private fun updateArtists(artists: List) { - requireBinding().apply { - homeRecycler.isInvisible = artists.isEmpty() - homeNoMusic.isInvisible = artists.isNotEmpty() - } artistAdapter.update(artists, homeModel.artistInstructions.consume()) } + private fun updateNoMusicIndicator(empty: Boolean) { + val binding = requireBinding() + binding.homeRecycler.isInvisible = empty + binding.homeNoMusic.isInvisible = !empty + } + private fun updateSelection(selection: List) { artistAdapter.setSelected(selection.filterIsInstanceTo(mutableSetOf())) } diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt index c61e43997..cbb1a5c46 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt @@ -80,9 +80,10 @@ class GenreListFragment : } binding.homeNoMusicMsg.text = getString(R.string.lng_empty_genres) - binding.homeChooseMusicSources.setOnClickListener { homeModel.startChooseMusicLocations() } + binding.homeNoMusicAction.setOnClickListener { homeModel.startChooseMusicLocations() } collectImmediately(homeModel.genreList, ::updateGenres) + collectImmediately(homeModel.empty, ::updateNoMusicIndicator) collectImmediately(listModel.selected, ::updateSelection) collectImmediately( playbackModel.song, playbackModel.parent, playbackModel.isPlaying, ::updatePlayback) @@ -128,13 +129,15 @@ class GenreListFragment : } private fun updateGenres(genres: List) { - requireBinding().apply { - homeRecycler.isInvisible = genres.isEmpty() - homeNoMusic.isInvisible = genres.isNotEmpty() - } genreAdapter.update(genres, homeModel.genreInstructions.consume()) } + private fun updateNoMusicIndicator(empty: Boolean) { + val binding = requireBinding() + binding.homeRecycler.isInvisible = empty + binding.homeNoMusic.isInvisible = !empty + } + private fun updateSelection(selection: List) { genreAdapter.setSelected(selection.filterIsInstanceTo(mutableSetOf())) } diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/PlaylistListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/PlaylistListFragment.kt index db98903a3..80809aad9 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/PlaylistListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/PlaylistListFragment.kt @@ -78,9 +78,8 @@ class PlaylistListFragment : } binding.homeNoMusicMsg.text = getString(R.string.lng_empty_playlists) - binding.homeChooseMusicSources.setOnClickListener { homeModel.startChooseMusicLocations() } - collectImmediately(homeModel.playlistList, ::updatePlaylists) + collectImmediately(homeModel.empty, homeModel.playlistList, ::updateNoMusicIndicator) collectImmediately(listModel.selected, ::updateSelection) collectImmediately( playbackModel.song, playbackModel.parent, playbackModel.isPlaying, ::updatePlayback) @@ -126,13 +125,22 @@ class PlaylistListFragment : } private fun updatePlaylists(playlists: List) { - requireBinding().apply { - homeRecycler.isInvisible = playlists.isEmpty() - homeNoMusic.isInvisible = playlists.isNotEmpty() - } playlistAdapter.update(playlists, homeModel.playlistInstructions.consume()) } + private fun updateNoMusicIndicator(empty: Boolean, playlists: List) { + val binding = requireBinding() + binding.homeRecycler.isInvisible = empty + binding.homeNoMusic.isInvisible = !empty && playlists.isNotEmpty() + if (!empty && playlists.isEmpty()) { + binding.homeNoMusicAction.text = getString(R.string.lbl_new_playlist) + binding.homeNoMusicAction.setOnClickListener { musicModel.createPlaylist() } + } else { + binding.homeNoMusicAction.text = getString(R.string.lbl_music_sources) + binding.homeNoMusicAction.setOnClickListener { homeModel.startChooseMusicLocations() } + } + } + private fun updateSelection(selection: List) { playlistAdapter.setSelected(selection.filterIsInstanceTo(mutableSetOf())) } diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/SongListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/SongListFragment.kt index 2b031bb76..1c717b476 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/SongListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/SongListFragment.kt @@ -85,9 +85,10 @@ class SongListFragment : } binding.homeNoMusicMsg.text = getString(R.string.lng_empty_songs) - binding.homeChooseMusicSources.setOnClickListener { homeModel.startChooseMusicLocations() } + binding.homeNoMusicAction.setOnClickListener { homeModel.startChooseMusicLocations() } collectImmediately(homeModel.songList, ::updateSongs) + collectImmediately(homeModel.empty, ::updateNoMusicIndicator) collectImmediately(listModel.selected, ::updateSelection) collectImmediately( playbackModel.song, playbackModel.parent, playbackModel.isPlaying, ::updatePlayback) @@ -154,13 +155,15 @@ class SongListFragment : } private fun updateSongs(songs: List) { - requireBinding().apply { - homeRecycler.isInvisible = songs.isEmpty() - homeNoMusic.isInvisible = songs.isNotEmpty() - } songAdapter.update(songs, homeModel.songInstructions.consume()) } + private fun updateNoMusicIndicator(empty: Boolean) { + val binding = requireBinding() + binding.homeRecycler.isInvisible = empty + binding.homeNoMusic.isInvisible = !empty + } + private fun updateSelection(selection: List) { songAdapter.setSelected(selection.filterIsInstanceTo(mutableSetOf())) } diff --git a/app/src/main/res/layout/fragment_home_list.xml b/app/src/main/res/layout/fragment_home_list.xml index 249ea0cd1..f4263a65e 100644 --- a/app/src/main/res/layout/fragment_home_list.xml +++ b/app/src/main/res/layout/fragment_home_list.xml @@ -46,7 +46,7 @@ android:textAppearance="?attr/textAppearanceBodyLarge" />