From daf1cf8590f3d2409272bdabc2a8249885a9f929 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Thu, 20 Oct 2022 18:03:59 -0600 Subject: [PATCH] music: show months in UI If a song/album date has a month value, show it in the UI. This hopefully improves the date experience for more well-tagged libraries. Due to date limitations however, it is limited to Android O onwards for now. --- CHANGELOG.md | 1 + .../detail/recycler/AlbumDetailAdapter.kt | 2 +- .../detail/recycler/ArtistDetailAdapter.kt | 2 +- .../auxio/home/list/AlbumListFragment.kt | 2 +- .../auxio/home/list/SongListFragment.kt | 2 +- .../main/java/org/oxycblt/auxio/music/Tags.kt | 61 +++++++++++++++---- app/src/main/res/menu/menu_artist_sort.xml | 2 +- app/src/main/res/menu/menu_genre_sort.xml | 2 +- app/src/main/res/menu/menu_home.xml | 2 +- app/src/main/res/values-ar-rIQ/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-el/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-fil/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-hr/strings.xml | 2 +- app/src/main/res/values-in/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- app/src/main/res/values-ko/strings.xml | 2 +- app/src/main/res/values-lt/strings.xml | 2 +- app/src/main/res/values-nl/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 28 files changed, 77 insertions(+), 37 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa0354880..e24501159 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ - Reshuffling the queue will no longer drop any songs you have added/removed - Allowed light/dark theme to be customized on Android 12+ - All information now scrolls in the playback view +- A month is now shown for song/album dates when available (Android O+ only) #### What's Fixed - Fixed issue where the scroll popup would not display correctly in landscape mode [#230] 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 827560a3d..0b5b4180c 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 @@ -120,7 +120,7 @@ private class AlbumDetailViewHolder private constructor(private val binding: Ite binding.detailInfo.apply { val date = - item.date?.resolveYear(context) + item.date?.resolveDate(context) ?: context.getString(R.string.def_date) val songCount = context.getPlural(R.plurals.fmt_song_count, item.songs.size) 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 5ebac30cf..a0857fe76 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 @@ -159,7 +159,7 @@ private class ArtistAlbumViewHolder private constructor(private val binding: Ite binding.parentImage.bind(item) binding.parentName.text = item.resolveName(binding.context) binding.parentInfo.text = - item.date?.resolveYear(binding.context) + item.date?.resolveDate(binding.context) ?: binding.context.getString(R.string.def_date) // binding.parentMenu.setOnClickListener { listener.onOpenMenu(item, it) } 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 409f96b44..5f3c59c48 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 @@ -70,7 +70,7 @@ class AlbumListFragment : HomeListFragment() { is Sort.Mode.ByArtist -> album.artists[0].collationKey?.run { sourceString.first().uppercase() } // Year -> Use Full Year - is Sort.Mode.ByDate -> album.date?.resolveYear(requireContext()) + is Sort.Mode.ByDate -> album.date?.resolveDate(requireContext()) // Duration -> Use formatted duration is Sort.Mode.ByDuration -> album.durationMs.formatDurationMs(false) 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 cd761366c..be98371a5 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 @@ -86,7 +86,7 @@ class SongListFragment : HomeListFragment() { is Sort.Mode.ByAlbum -> song.album.collationKey?.run { sourceString.first().uppercase() } // Year -> Use Full Year - is Sort.Mode.ByDate -> song.album.date?.resolveYear(requireContext()) + is Sort.Mode.ByDate -> song.album.date?.resolveDate(requireContext()) // Duration -> Use formatted duration is Sort.Mode.ByDuration -> song.durationMs.formatDurationMs(false) diff --git a/app/src/main/java/org/oxycblt/auxio/music/Tags.kt b/app/src/main/java/org/oxycblt/auxio/music/Tags.kt index cdb89d392..96bc9cb2f 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Tags.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Tags.kt @@ -18,10 +18,21 @@ package org.oxycblt.auxio.music import android.content.Context +import android.os.Build +import android.text.format.DateUtils +import androidx.annotation.RequiresApi import org.oxycblt.auxio.BuildConfig import org.oxycblt.auxio.R +import org.oxycblt.auxio.playback.secsToMs import org.oxycblt.auxio.util.inRangeOrNull +import org.oxycblt.auxio.util.logD +import org.oxycblt.auxio.util.logE import org.oxycblt.auxio.util.nonZeroOrNull +import java.time.ZoneId +import java.time.format.DateTimeFormatter +import java.time.temporal.TemporalQueries +import java.util.Formatter +import java.util.Locale import kotlin.math.max import kotlin.math.min @@ -60,10 +71,7 @@ class Date private constructor(private val tokens: List) : Comparable } } - val year = tokens[0] - - /** Resolve the year field in a way suitable for the UI. */ - fun resolveYear(context: Context) = context.getString(R.string.fmt_number, year) + private val year = tokens[0] private val month = tokens.getOrNull(1) @@ -75,6 +83,37 @@ class Date private constructor(private val tokens: List) : Comparable private val second = tokens.getOrNull(5) + fun resolveDate(context: Context): String { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + return try { + resolveFullDate(context).also { logD(it) } + } catch (e: Exception) { + logE("Failed to format a full date") + logE(e.stackTraceToString()) + return resolveYear(context) + } + } else { + return resolveYear(context) + } + } + + @RequiresApi(Build.VERSION_CODES.O) + private fun resolveFullDate(context: Context) = + if( month != null ) { + val temporal = DateTimeFormatter.ISO_DATE.parse( + "$year-$month-${day ?: 1}", + TemporalQueries.localDate() + ) + + temporal.atStartOfDay(ZoneId.systemDefault()) + .format(DateTimeFormatter.ofPattern("MMM yyyy", Locale.getDefault())) + } else { + resolveYear(context) + } + + /** Resolve the year field in a way suitable for the UI. */ + private fun resolveYear(context: Context) = context.getString(R.string.fmt_number, year) + override fun hashCode() = tokens.hashCode() override fun equals(other: Any?) = other is Date && tokens == other.tokens @@ -103,20 +142,20 @@ class Date private constructor(private val tokens: List) : Comparable private fun StringBuilder.appendDate(): StringBuilder { append(year.toFixedString(4)) - append("-${(month ?: return this).toFixedString(2)}") - append("-${(day ?: return this).toFixedString(2)}") - append("T${(hour ?: return this).toFixedString(2)}") - append(":${(minute ?: return this.append('Z')).toFixedString(2)}") - append(":${(second ?: return this.append('Z')).toFixedString(2)}") + append("-${(month ?: 1).toFixedString(2)}") + append("-${(day ?: 1).toFixedString(2)}") + append("T${(hour ?: 0).toFixedString(2)}") + append(":${(minute ?: 0).toFixedString(2)}") + append(":${(second ?: 0).toFixedString(2)}") return this.append('Z') } - private fun Int.toFixedString(len: Int) = toString().padStart(len, '0') + private fun Int.toFixedString(len: Int) = toString().padStart(len, '0').substring(0 until len) companion object { private val ISO8601_REGEX = Regex( - """^(\d{4,})([-.](\d{2})([-.](\d{2})([T ](\d{2})([:.](\d{2})([:.](\d{2}))?)?)?)?)?$""" + """^(\d{4,})([-.](\d{2})([-.](\d{2})([T ](\d{2})([:.](\d{2})([:.](\d{2})(Z)?)?)?)?)?)?$""" ) fun from(year: Int) = fromTokens(listOf(year)) diff --git a/app/src/main/res/menu/menu_artist_sort.xml b/app/src/main/res/menu/menu_artist_sort.xml index 73b951bf5..ae3fd9d97 100644 --- a/app/src/main/res/menu/menu_artist_sort.xml +++ b/app/src/main/res/menu/menu_artist_sort.xml @@ -9,7 +9,7 @@ android:title="@string/lbl_album" /> + android:title="@string/lbl_sort_date" /> diff --git a/app/src/main/res/menu/menu_genre_sort.xml b/app/src/main/res/menu/menu_genre_sort.xml index 90b71638a..fe0080134 100644 --- a/app/src/main/res/menu/menu_genre_sort.xml +++ b/app/src/main/res/menu/menu_genre_sort.xml @@ -12,7 +12,7 @@ android:title="@string/lbl_album" /> + android:title="@string/lbl_sort_date" /> diff --git a/app/src/main/res/menu/menu_home.xml b/app/src/main/res/menu/menu_home.xml index ec67076cc..e23c746b7 100644 --- a/app/src/main/res/menu/menu_home.xml +++ b/app/src/main/res/menu/menu_home.xml @@ -26,7 +26,7 @@ android:title="@string/lbl_album" /> + android:title="@string/lbl_sort_date" /> diff --git a/app/src/main/res/values-ar-rIQ/strings.xml b/app/src/main/res/values-ar-rIQ/strings.xml index 7a4414727..b1699cb21 100644 --- a/app/src/main/res/values-ar-rIQ/strings.xml +++ b/app/src/main/res/values-ar-rIQ/strings.xml @@ -18,7 +18,7 @@ اسم فنان البوم - سنة + سنة تصاعدي يعمل الآن تشغيل diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index d508265d5..edc3cad50 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -20,7 +20,7 @@ Název Umělec Album - Rok + Rok Trvání Počet skladeb Disk diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index b133def3a..936b561da 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -120,7 +120,7 @@ Musikwiedergabe anzeigen und kontrollieren Künstler Album - Jahr + Jahr Schwarzes Farbschema Ein rein schwarzes dunkles Farbschema verwenden Pause bei Wiederholung diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index a8fea80b2..5ec5945f2 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -74,7 +74,7 @@ Δίσκος %d Album που φορτώθηκαν: %d Καλλιτέχνες που φορτώθηκαν: %d - Έτος + Έτος Δίσκος Δεν βρέθηκε καθόλου μουσική Η φόρτωση μουσικής απέτυχε diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 308cc30e3..0ea1b8f91 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -18,7 +18,7 @@ Nombre Artista Álbum - Año + Año Ascendente En reproducción Reproducir diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index b5ba7c577..4e42f3e16 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -20,7 +20,7 @@ Mga Compilation Ayusin Pangalan - Taon + Taon Tagal Bilang ng kanta Compilation diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 856357180..174c98f05 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -99,7 +99,7 @@ Nom Artiste Album - Année + Année Durée Nombre de chansons Disque diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 5c80b56dd..417c2ba9f 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -27,7 +27,7 @@ Žanrovi Sortiraj Naziv - Godina + Godina Trajanje Broj pjesama Disk diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index a17cce871..3f5262b0c 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -77,7 +77,7 @@ Pemutar musik yang simpel dan rasional untuk android. Pemuatan Musik Lihat dan kontrol pemutaran musik - Tahun + Tahun Durasi Disk Lihat properti diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index f6b4797ce..db1925442 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -18,7 +18,7 @@ Nome Artista Disco - Anno + Anno Ascendente Ora in riproduzione Riproduci diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index cdb113c29..6021f11cd 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -18,7 +18,7 @@ 제목 아티스트 앨범 - 연도 + 연도 길이 곡 수 디스크 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 53bb18c8e..f828be440 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -7,7 +7,7 @@ Visos Rūšiuoti Pavadinimas - Metai + Metai Trukmė Dainų skaičius Diskas diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 423f8cb73..b9f6d4b5e 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -121,7 +121,7 @@ Artiest @android:string/cancel Bibliotheek tabbladen - Jaar + Jaar Ouderpad Lied eigenschappen Bestandsnaam diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 79a981bde..decce6ed2 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -119,7 +119,7 @@ Ciemny fiolet -%.1f dB Nazwa - Rok + Rok Singiel Single Czas trwania diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 3620205ec..2d1e72fc3 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -97,7 +97,7 @@ O Auxio precisa de permissão para ler sua biblioteca de músicas Um leitor de música simples e racional para android. Carregando sua biblioteca de músicas… - Ano + Ano Duração Contagem de músicas Disco diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 9c7db9a94..8026c66a9 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -18,7 +18,7 @@ Название Исполнитель Альбом - Год + Год По возрастанию Сейчас играет Играть diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 791f867be..c2a19b0e3 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -78,7 +78,7 @@ İsim Sanatçı Albüm - Yıl + Yıl Süre Durum kaydedildi OxygenCobalt tarafından geliştirildi diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 21d30074d..3fd6bc01a 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -18,7 +18,7 @@ 名称 艺术家 专辑 - 年份 + 年份 首字符(正序) 正在播放 播放 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2eba3ae18..46c755bbf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -85,7 +85,7 @@ Sort Name - Year + Date Duration Song count Disc