From fd61f5bb9fcdb7c5fc240e4db7ef0dc5d8a20256 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Sat, 19 Nov 2022 16:43:51 -0700 Subject: [PATCH] settings: remove about screen reliance on home Remove the about screen's reliance on the home data. The home view's data can no longer be trusted now due to the "hide collaborators" setting, so now the about screen uses statistics derived from MusicStore itself. This also avoids constantly resumming the duration when the UI is initially created. --- .../org/oxycblt/auxio/home/HomeFragment.kt | 6 +-- .../org/oxycblt/auxio/music/MusicViewModel.kt | 33 +++++++++++--- .../oxycblt/auxio/settings/AboutFragment.kt | 43 +++++++------------ 3 files changed, 46 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt index 688adb4b1..7328efd64 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt @@ -156,7 +156,7 @@ class HomeFragment : ViewBindingFragment(), Toolbar.OnMenuI collect(homeModel.recreateTabs, ::handleRecreateTabs) collectImmediately(homeModel.currentTab, ::updateCurrentTab) - collectImmediately(musicModel.libraryExists, homeModel.isFastScrolling, ::updateFab) + collectImmediately(homeModel.songs, homeModel.isFastScrolling, ::updateFab) collectImmediately(musicModel.indexerState, ::handleIndexerState) collect(navModel.exploreNavigationItem, ::handleNavigation) } @@ -373,9 +373,9 @@ class HomeFragment : ViewBindingFragment(), Toolbar.OnMenuI } } - private fun updateFab(hasLoaded: Boolean, isFastScrolling: Boolean) { + private fun updateFab(songs: List, isFastScrolling: Boolean) { val binding = requireBinding() - if (!hasLoaded || isFastScrolling) { + if (songs.isEmpty() || isFastScrolling) { binding.homeFab.hide() } else { binding.homeFab.show() 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 7265970b0..85b893f0a 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicViewModel.kt @@ -31,14 +31,12 @@ class MusicViewModel : ViewModel(), Indexer.Callback { private val indexer = Indexer.getInstance() private val _indexerState = MutableStateFlow(null) - /** The current music indexing state. */ val indexerState: StateFlow = _indexerState - private val _libraryExists = MutableStateFlow(false) - - /** Whether a music library has successfully been loaded. */ - val libraryExists: StateFlow = _libraryExists + private val _statistics = MutableStateFlow(null) + /** The current statistics of the music library. */ + val statistics: StateFlow get() = _statistics init { indexer.registerCallback(this) @@ -56,12 +54,35 @@ class MusicViewModel : ViewModel(), Indexer.Callback { override fun onIndexerStateChanged(state: Indexer.State?) { logD("New state: $state") _indexerState.value = state + if (state is Indexer.State.Complete && state.response is Indexer.Response.Ok) { - _libraryExists.value = true + val library = state.response.library + _statistics.value = Statistics( + library.songs.size, + library.albums.size, + library.artists.size, + library.genres.size, + library.songs.sumOf { it.durationMs } + ) } } override fun onCleared() { indexer.unregisterCallback(this) } + + /** + * Non-manipulated statistics about the music library. + */ + data class Statistics( + /** The amount of songs. */ + val songs: Int, + /** The amount of albums. */ + val albums: Int, + /** The amount of artists. */ + val artists: Int, + /** The amount of genres. */ + val genres: Int, + val durationMs: Long + ) } diff --git a/app/src/main/java/org/oxycblt/auxio/settings/AboutFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/AboutFragment.kt index 104cf3cbe..e9a7eb0e7 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/AboutFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/AboutFragment.kt @@ -25,20 +25,16 @@ import android.os.Bundle import android.view.LayoutInflater import androidx.core.net.toUri import androidx.core.view.updatePadding +import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.transition.MaterialFadeThrough import org.oxycblt.auxio.BuildConfig import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.FragmentAboutBinding -import org.oxycblt.auxio.home.HomeViewModel -import org.oxycblt.auxio.music.Album -import org.oxycblt.auxio.music.Artist -import org.oxycblt.auxio.music.Genre -import org.oxycblt.auxio.music.Song +import org.oxycblt.auxio.music.MusicViewModel import org.oxycblt.auxio.playback.formatDurationMs import org.oxycblt.auxio.ui.fragment.ViewBindingFragment -import org.oxycblt.auxio.util.androidActivityViewModels import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.showToast @@ -49,7 +45,7 @@ import org.oxycblt.auxio.util.systemBarInsetsCompat * @author OxygenCobalt */ class AboutFragment : ViewBindingFragment() { - private val homeModel: HomeViewModel by androidActivityViewModels() + private val musicModel: MusicViewModel by activityViewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -72,32 +68,25 @@ class AboutFragment : ViewBindingFragment() { binding.aboutFaq.setOnClickListener { openLinkInBrowser(LINK_FAQ) } binding.aboutLicenses.setOnClickListener { openLinkInBrowser(LINK_LICENSES) } - collectImmediately(homeModel.songs, ::updateSongCount) - collectImmediately(homeModel.albums, ::updateAlbumCount) - collectImmediately(homeModel.artists, ::updateArtistCount) - collectImmediately(homeModel.genres, ::updateGenreCount) + collectImmediately(musicModel.statistics, ::updateStatistics) } - private fun updateSongCount(songs: List) { + private fun updateStatistics(statistics: MusicViewModel.Statistics?) { + val binding = requireBinding() - binding.aboutSongCount.text = getString(R.string.fmt_lib_song_count, songs.size) + binding.aboutSongCount.text = getString(R.string.fmt_lib_song_count, statistics?.songs ?: 0) + + requireBinding().aboutAlbumCount.text = getString(R.string.fmt_lib_album_count, statistics?.albums ?: 0) + + requireBinding().aboutArtistCount.text = + getString(R.string.fmt_lib_artist_count, statistics?.artists ?: 0) + + requireBinding().aboutGenreCount.text = getString(R.string.fmt_lib_genre_count, statistics?.genres ?: 0) + binding.aboutTotalDuration.text = getString( R.string.fmt_lib_total_duration, - songs.sumOf { it.durationMs }.formatDurationMs(false)) - } - - private fun updateAlbumCount(albums: List) { - requireBinding().aboutAlbumCount.text = getString(R.string.fmt_lib_album_count, albums.size) - } - - private fun updateArtistCount(artists: List) { - requireBinding().aboutArtistCount.text = - getString(R.string.fmt_lib_artist_count, artists.size) - } - - private fun updateGenreCount(genres: List) { - requireBinding().aboutGenreCount.text = getString(R.string.fmt_lib_genre_count, genres.size) + (statistics?.durationMs ?: 0).formatDurationMs(false)) } /** Go through the process of opening a [link] in a browser. */