From 1a9e55e73b4b567c0ac15416e256c3e59c0c8851 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Wed, 4 May 2022 20:20:47 -0600 Subject: [PATCH] about: add full library statistics Split off the "songs loaded" about item into it's own card called "library statistics" This card includes the song, album, artist, and genre counts, alongside a total duration of the music library. This is just more informative and useful to the user. Resolves #121. --- CHANGELOG.md | 2 + .../java/org/oxycblt/auxio/coil/Components.kt | 2 +- .../java/org/oxycblt/auxio/music/Indexer.kt | 3 - .../auxio/playback/system/PlaybackService.kt | 8 +- .../oxycblt/auxio/settings/AboutFragment.kt | 15 + app/src/main/res/drawable/ic_time.xml | 14 + app/src/main/res/layout/fragment_about.xml | 316 +++++++++++------- app/src/main/res/values/strings.xml | 5 + 8 files changed, 238 insertions(+), 127 deletions(-) create mode 100644 app/src/main/res/drawable/ic_time.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index 327468ae0..4fef16fe7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,11 @@ #### What's New - Added ReplayGain support for below-reference volume tracks [i.e positive ReplayGain values] +- About screen now shows counts for multiple types of library items, alongside a total duration #### What's Fixed - Fixed incorrect ellipsizing on song items +- Fixed a variety of esoteric crashes with queue state #### What's Changed - Audio focus is no longer configurable diff --git a/app/src/main/java/org/oxycblt/auxio/coil/Components.kt b/app/src/main/java/org/oxycblt/auxio/coil/Components.kt index 1e6fb5776..6992d4997 100644 --- a/app/src/main/java/org/oxycblt/auxio/coil/Components.kt +++ b/app/src/main/java/org/oxycblt/auxio/coil/Components.kt @@ -112,7 +112,7 @@ private constructor( private val genre: Genre, ) : BaseFetcher() { override suspend fun fetch(): FetchResult? { - // We don't need to sort here, as the way we + // Don't sort here to preserve compatibility with previous variations of this image. val albums = genre.songs.groupBy { it.album }.keys val results = albums.mapAtMost(4) { album -> fetchArt(context, album) } diff --git a/app/src/main/java/org/oxycblt/auxio/music/Indexer.kt b/app/src/main/java/org/oxycblt/auxio/music/Indexer.kt index 418af00ab..bf12b5485 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Indexer.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Indexer.kt @@ -88,9 +88,6 @@ import org.oxycblt.auxio.util.logD * I wish I was born in the neolithic. * * @author OxygenCobalt - * - * TODO: Experiment with making the exoplayer metadata system more effificent so that we could - * leverage it here (maybe) */ object Indexer { /** diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt index 1f1160987..f6caf4084 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt @@ -65,8 +65,8 @@ import org.oxycblt.auxio.widgets.WidgetProvider * therefore there's no need to bind to it to deliver commands. * @author OxygenCobalt * - * TODO: Synchronize components in a less awful way (Fix issue where rapid-fire updates results - * in a desynced notification) + * TODO: Synchronize components in a less awful way (Fix issue where rapid-fire updates results in a + * desynced notification) */ class PlaybackService : Service(), Player.Listener, PlaybackStateManager.Callback, SettingsManager.Callback { @@ -219,7 +219,9 @@ class PlaybackService : newPosition: Player.PositionInfo, reason: Int ) { - playbackManager.synchronizePosition(player.currentPosition) + if (reason == Player.DISCONTINUITY_REASON_SEEK) { + playbackManager.synchronizePosition(player.currentPosition) + } } override fun onTracksInfoChanged(tracksInfo: TracksInfo) { 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 b6a961823..7e52c3bf6 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/AboutFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/AboutFragment.kt @@ -32,6 +32,7 @@ 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.toDuration import org.oxycblt.auxio.ui.ViewBindingFragment import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.showToast @@ -62,6 +63,20 @@ class AboutFragment : ViewBindingFragment() { homeModel.songs.observe(viewLifecycleOwner) { songs -> binding.aboutSongCount.textSafe = getString(R.string.fmt_songs_loaded, songs.size) + binding.aboutTotalDuration.textSafe = + getString(R.string.fmt_total_duration, songs.sumOf { it.seconds }.toDuration(false)) + } + + homeModel.albums.observe(viewLifecycleOwner) { albums -> + binding.aboutAlbumCount.textSafe = getString(R.string.fmt_albums_loaded, albums.size) + } + + homeModel.artists.observe(viewLifecycleOwner) { artists -> + binding.aboutArtistCount.textSafe = getString(R.string.fmt_artists_loaded, artists.size) + } + + homeModel.genres.observe(viewLifecycleOwner) { genres -> + binding.aboutGenreCount.textSafe = getString(R.string.fmt_genres_loaded, genres.size) } } diff --git a/app/src/main/res/drawable/ic_time.xml b/app/src/main/res/drawable/ic_time.xml new file mode 100644 index 000000000..92309f099 --- /dev/null +++ b/app/src/main/res/drawable/ic_time.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml index 6892927eb..f7a5de5e0 100644 --- a/app/src/main/res/layout/fragment_about.xml +++ b/app/src/main/res/layout/fragment_about.xml @@ -26,153 +26,229 @@ android:clipToPadding="false" app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"> - - - - - - - - + android:layout_height="wrap_content"> + android:layout_height="match_parent"> + android:text="@string/info_app_name" + android:textAppearance="@style/TextAppearance.Auxio.TitleLarge" + app:layout_constraintBottom_toBottomOf="@+id/about_auxio_icon" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/about_auxio_icon" + app:layout_constraintTop_toTopOf="@+id/about_auxio_icon" /> + android:layout_marginTop="@dimen/spacing_small" + android:gravity="center" + android:paddingStart="@dimen/spacing_medium" + android:paddingEnd="@dimen/spacing_medium" + android:text="@string/info_app_desc" + android:textAppearance="@style/TextAppearance.Auxio.BodyLarge" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/about_auxio_icon" /> + + + + + + + + + + + + + + + + + + + - + + + android:layout_height="match_parent" + android:orientation="vertical"> - + - + - + - + - - + + + + + + + \ 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 59467fbbd..0f4dffa88 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -54,6 +54,7 @@ FAQ Licenses Developed by OxygenCobalt + Library statistics Settings @@ -168,6 +169,10 @@ Songs loaded: %d + Albums loaded: %d + Artists loaded: %d + Genres loaded: %d + Total duration: %s %d Song