From 75e80a7253098690b74eb2a8fd723a9c76844836 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Tue, 9 Aug 2022 08:47:11 -0600 Subject: [PATCH] home: add indicator to date added sorting Add a fast-scroll indicator for date added sorting. Forgot to add this initially. --- CHANGELOG.md | 8 +++++--- .../auxio/detail/recycler/AlbumDetailAdapter.kt | 2 +- .../detail/recycler/ArtistDetailAdapter.kt | 2 +- .../auxio/detail/recycler/GenreDetailAdapter.kt | 2 +- .../auxio/home/list/AlbumListFragment.kt | 14 ++++++++++++++ .../oxycblt/auxio/home/list/SongListFragment.kt | 17 +++++++++++++++++ .../auxio/ui/BottomSheetContentBehavior.kt | 10 +++++----- 7 files changed, 44 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc96f903b..107d01e47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,13 @@ ## dev -#### What's Changed -- Use X-axis transitions instead of Z-axis (Avoids visual clipping) - #### What's Fixed - Fixed incorrect font being used in the queue title +- Fixed missing fast scroll indicator with date added scrolling + +#### What's Changed +- Use X-axis transitions instead of Z-axis (Avoids visual clipping) +- Queue no longer has rounded corners for consistency ## 2.6.0 diff --git a/app/src/main/java/org/oxycblt/auxio/detail/recycler/AlbumDetailAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/recycler/AlbumDetailAdapter.kt index b3fd0bf68..6e49b8892 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/recycler/AlbumDetailAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/recycler/AlbumDetailAdapter.kt @@ -115,7 +115,7 @@ private class AlbumDetailViewHolder private constructor(private val binding: Ite override fun bind(item: Album, listener: AlbumDetailAdapter.Listener) { binding.detailCover.bind(item) - binding.detailType?.text = + binding.detailType.text = binding.context.getString(item.releaseType?.stringRes ?: R.string.lbl_album) binding.detailName.text = item.resolveName(binding.context) diff --git a/app/src/main/java/org/oxycblt/auxio/detail/recycler/ArtistDetailAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/recycler/ArtistDetailAdapter.kt index b31b645ff..5a761c00f 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/recycler/ArtistDetailAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/recycler/ArtistDetailAdapter.kt @@ -123,7 +123,7 @@ private class ArtistDetailViewHolder private constructor(private val binding: It override fun bind(item: Artist, listener: DetailAdapter.Listener) { binding.detailCover.bind(item) - binding.detailType?.text = binding.context.getString(R.string.lbl_artist) + binding.detailType.text = binding.context.getString(R.string.lbl_artist) binding.detailName.text = item.resolveName(binding.context) // Get the genre that corresponds to the most songs in this artist, which would be diff --git a/app/src/main/java/org/oxycblt/auxio/detail/recycler/GenreDetailAdapter.kt b/app/src/main/java/org/oxycblt/auxio/detail/recycler/GenreDetailAdapter.kt index 9db6b8f14..2d6df6ac4 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/recycler/GenreDetailAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/recycler/GenreDetailAdapter.kt @@ -104,7 +104,7 @@ private class GenreDetailViewHolder private constructor(private val binding: Ite BindingViewHolder(binding.root) { override fun bind(item: Genre, listener: DetailAdapter.Listener) { binding.detailCover.bind(item) - binding.detailType?.text = binding.context.getString(R.string.lbl_genre) + binding.detailType.text = binding.context.getString(R.string.lbl_genre) binding.detailName.text = item.resolveName(binding.context) binding.detailSubhead.text = binding.context.getPlural(R.plurals.fmt_song_count, item.songs.size) 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 a0c02bb5d..bc0ad89b4 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 @@ -18,7 +18,9 @@ package org.oxycblt.auxio.home.list import android.os.Bundle +import android.text.format.DateUtils import android.view.View +import java.util.* import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.FragmentHomeListBinding import org.oxycblt.auxio.music.Album @@ -40,6 +42,8 @@ import org.oxycblt.auxio.util.logEOrThrow */ class AlbumListFragment : HomeListFragment() { private val homeAdapter = AlbumAdapter(this) + private val formatterSb = StringBuilder(50) + private val formatter = Formatter(formatterSb) override fun onBindingCreated(binding: FragmentHomeListBinding, savedInstanceState: Bundle?) { super.onBindingCreated(binding, savedInstanceState) @@ -72,6 +76,16 @@ class AlbumListFragment : HomeListFragment() { // Count -> Use song count is Sort.Mode.ByCount -> album.songs.size.toString() + // Last added -> Format as date + is Sort.Mode.ByDateAdded -> + (album.songs.minOf { it.dateAdded } * 1000).let { + // Emulate formatDateTime with our own formatter instance to save memory. + formatterSb.setLength(0) + DateUtils.formatDateRange( + context, formatter, it, it, DateUtils.FORMAT_ABBREV_ALL) + .toString() + } + // Unsupported sort, error gracefully else -> null } 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 e91233f4a..30293180e 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 @@ -18,7 +18,9 @@ package org.oxycblt.auxio.home.list import android.os.Bundle +import android.text.format.DateUtils import android.view.View +import java.util.Formatter import org.oxycblt.auxio.R import org.oxycblt.auxio.databinding.FragmentHomeListBinding import org.oxycblt.auxio.music.Song @@ -42,6 +44,8 @@ import org.oxycblt.auxio.util.logEOrThrow class SongListFragment : HomeListFragment() { private val homeAdapter = SongsAdapter(this) private val settings: Settings by lifecycleObject { binding -> Settings(binding.context) } + private val formatterSb = StringBuilder(50) + private val formatter = Formatter(formatterSb) override fun onBindingCreated(binding: FragmentHomeListBinding, savedInstanceState: Bundle?) { super.onBindingCreated(binding, savedInstanceState) @@ -76,6 +80,19 @@ class SongListFragment : HomeListFragment() { // Duration -> Use formatted duration is Sort.Mode.ByDuration -> song.durationSecs.formatDuration(false) + // Last added -> Format as date + is Sort.Mode.ByDateAdded -> { + val dateAddedMillis = song.dateAdded * 1000 + formatterSb.setLength(0) + DateUtils.formatDateRange( + context, + formatter, + dateAddedMillis, + dateAddedMillis, + DateUtils.FORMAT_ABBREV_ALL) + .toString() + } + // Unsupported sort, error gracefully else -> null } diff --git a/app/src/main/java/org/oxycblt/auxio/ui/BottomSheetContentBehavior.kt b/app/src/main/java/org/oxycblt/auxio/ui/BottomSheetContentBehavior.kt index a531fa22c..6e8d0a3fb 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/BottomSheetContentBehavior.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/BottomSheetContentBehavior.kt @@ -39,10 +39,10 @@ import org.oxycblt.auxio.util.systemBarInsetsCompat * 2. Over scrolling. Glow scrolls will not cut it, as the bottom glow will be caught under the bar, * and moving it above the insets will result in an incorrect glow position when the bar is not * shown. I have to emulate stretch scrolling below Android 12 instead. However, this is also - * similarly distorted by the insets, and thus I must go further and modify the edge effect to be - * at least somewhat clamped to the insets themselves. - * 3. Touch events. Bottom sheets must always intercept touches in their bounds, or they will - * click the now overlapping content view that is only inset by it and not unhidden by it. + * similarly distorted by the insets, and thus I must go further and modify the edge effect to be at + * least somewhat clamped to the insets themselves. + * 3. Touch events. Bottom sheets must always intercept touches in their bounds, or they will click + * the now overlapping content view that is only inset by it and not unhidden by it. * * @author OxygenCobalt */ @@ -115,7 +115,7 @@ class BottomSheetContentBehavior(context: Context, attributeSet: Attri layoutContent(child) if (!setup) { - child.setOnApplyWindowInsetsListener { v, insets -> + child.setOnApplyWindowInsetsListener { _, insets -> lastInsets = insets val dep = dep ?: return@setOnApplyWindowInsetsListener insets val behavior = dep.coordinatorLayoutBehavior as NeoBottomSheetBehavior