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. */