home: add indicator to date added sorting

Add a fast-scroll indicator for date added sorting.

Forgot to add this initially.
This commit is contained in:
OxygenCobalt 2022-08-09 08:47:11 -06:00
parent 3c3b9ac7cc
commit 75e80a7253
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
7 changed files with 44 additions and 11 deletions

View file

@ -2,11 +2,13 @@
## dev ## dev
#### What's Changed
- Use X-axis transitions instead of Z-axis (Avoids visual clipping)
#### What's Fixed #### What's Fixed
- Fixed incorrect font being used in the queue title - 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 ## 2.6.0

View file

@ -115,7 +115,7 @@ private class AlbumDetailViewHolder private constructor(private val binding: Ite
override fun bind(item: Album, listener: AlbumDetailAdapter.Listener) { override fun bind(item: Album, listener: AlbumDetailAdapter.Listener) {
binding.detailCover.bind(item) binding.detailCover.bind(item)
binding.detailType?.text = binding.detailType.text =
binding.context.getString(item.releaseType?.stringRes ?: R.string.lbl_album) binding.context.getString(item.releaseType?.stringRes ?: R.string.lbl_album)
binding.detailName.text = item.resolveName(binding.context) binding.detailName.text = item.resolveName(binding.context)

View file

@ -123,7 +123,7 @@ private class ArtistDetailViewHolder private constructor(private val binding: It
override fun bind(item: Artist, listener: DetailAdapter.Listener) { override fun bind(item: Artist, listener: DetailAdapter.Listener) {
binding.detailCover.bind(item) 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) binding.detailName.text = item.resolveName(binding.context)
// Get the genre that corresponds to the most songs in this artist, which would be // Get the genre that corresponds to the most songs in this artist, which would be

View file

@ -104,7 +104,7 @@ private class GenreDetailViewHolder private constructor(private val binding: Ite
BindingViewHolder<Genre, DetailAdapter.Listener>(binding.root) { BindingViewHolder<Genre, DetailAdapter.Listener>(binding.root) {
override fun bind(item: Genre, listener: DetailAdapter.Listener) { override fun bind(item: Genre, listener: DetailAdapter.Listener) {
binding.detailCover.bind(item) 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.detailName.text = item.resolveName(binding.context)
binding.detailSubhead.text = binding.detailSubhead.text =
binding.context.getPlural(R.plurals.fmt_song_count, item.songs.size) binding.context.getPlural(R.plurals.fmt_song_count, item.songs.size)

View file

@ -18,7 +18,9 @@
package org.oxycblt.auxio.home.list package org.oxycblt.auxio.home.list
import android.os.Bundle import android.os.Bundle
import android.text.format.DateUtils
import android.view.View import android.view.View
import java.util.*
import org.oxycblt.auxio.R import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.FragmentHomeListBinding import org.oxycblt.auxio.databinding.FragmentHomeListBinding
import org.oxycblt.auxio.music.Album import org.oxycblt.auxio.music.Album
@ -40,6 +42,8 @@ import org.oxycblt.auxio.util.logEOrThrow
*/ */
class AlbumListFragment : HomeListFragment<Album>() { class AlbumListFragment : HomeListFragment<Album>() {
private val homeAdapter = AlbumAdapter(this) private val homeAdapter = AlbumAdapter(this)
private val formatterSb = StringBuilder(50)
private val formatter = Formatter(formatterSb)
override fun onBindingCreated(binding: FragmentHomeListBinding, savedInstanceState: Bundle?) { override fun onBindingCreated(binding: FragmentHomeListBinding, savedInstanceState: Bundle?) {
super.onBindingCreated(binding, savedInstanceState) super.onBindingCreated(binding, savedInstanceState)
@ -72,6 +76,16 @@ class AlbumListFragment : HomeListFragment<Album>() {
// Count -> Use song count // Count -> Use song count
is Sort.Mode.ByCount -> album.songs.size.toString() 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 // Unsupported sort, error gracefully
else -> null else -> null
} }

View file

@ -18,7 +18,9 @@
package org.oxycblt.auxio.home.list package org.oxycblt.auxio.home.list
import android.os.Bundle import android.os.Bundle
import android.text.format.DateUtils
import android.view.View import android.view.View
import java.util.Formatter
import org.oxycblt.auxio.R import org.oxycblt.auxio.R
import org.oxycblt.auxio.databinding.FragmentHomeListBinding import org.oxycblt.auxio.databinding.FragmentHomeListBinding
import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.Song
@ -42,6 +44,8 @@ import org.oxycblt.auxio.util.logEOrThrow
class SongListFragment : HomeListFragment<Song>() { class SongListFragment : HomeListFragment<Song>() {
private val homeAdapter = SongsAdapter(this) private val homeAdapter = SongsAdapter(this)
private val settings: Settings by lifecycleObject { binding -> Settings(binding.context) } 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?) { override fun onBindingCreated(binding: FragmentHomeListBinding, savedInstanceState: Bundle?) {
super.onBindingCreated(binding, savedInstanceState) super.onBindingCreated(binding, savedInstanceState)
@ -76,6 +80,19 @@ class SongListFragment : HomeListFragment<Song>() {
// Duration -> Use formatted duration // Duration -> Use formatted duration
is Sort.Mode.ByDuration -> song.durationSecs.formatDuration(false) 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 // Unsupported sort, error gracefully
else -> null else -> null
} }

View file

@ -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, * 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 * 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 * 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 * similarly distorted by the insets, and thus I must go further and modify the edge effect to be at
* at least somewhat clamped to the insets themselves. * least somewhat clamped to the insets themselves.
* 3. Touch events. Bottom sheets must always intercept touches in their bounds, or they will * 3. Touch events. Bottom sheets must always intercept touches in their bounds, or they will click
* click the now overlapping content view that is only inset by it and not unhidden by it. * the now overlapping content view that is only inset by it and not unhidden by it.
* *
* @author OxygenCobalt * @author OxygenCobalt
*/ */
@ -115,7 +115,7 @@ class BottomSheetContentBehavior<V : View>(context: Context, attributeSet: Attri
layoutContent(child) layoutContent(child)
if (!setup) { if (!setup) {
child.setOnApplyWindowInsetsListener { v, insets -> child.setOnApplyWindowInsetsListener { _, insets ->
lastInsets = insets lastInsets = insets
val dep = dep ?: return@setOnApplyWindowInsetsListener insets val dep = dep ?: return@setOnApplyWindowInsetsListener insets
val behavior = dep.coordinatorLayoutBehavior as NeoBottomSheetBehavior val behavior = dep.coordinatorLayoutBehavior as NeoBottomSheetBehavior