musikr: decouple date from auxio
This commit is contained in:
parent
c5cd404393
commit
e3146647d3
3 changed files with 40 additions and 37 deletions
|
@ -39,6 +39,7 @@ import org.oxycblt.auxio.list.recycler.FastScrollRecyclerView
|
||||||
import org.oxycblt.auxio.list.sort.Sort
|
import org.oxycblt.auxio.list.sort.Sort
|
||||||
import org.oxycblt.auxio.music.IndexingState
|
import org.oxycblt.auxio.music.IndexingState
|
||||||
import org.oxycblt.auxio.music.MusicViewModel
|
import org.oxycblt.auxio.music.MusicViewModel
|
||||||
|
import org.oxycblt.auxio.music.resolve
|
||||||
import org.oxycblt.auxio.playback.PlaybackViewModel
|
import org.oxycblt.auxio.playback.PlaybackViewModel
|
||||||
import org.oxycblt.auxio.playback.formatDurationMs
|
import org.oxycblt.auxio.playback.formatDurationMs
|
||||||
import org.oxycblt.auxio.playback.secsToMs
|
import org.oxycblt.auxio.playback.secsToMs
|
||||||
|
|
|
@ -19,12 +19,16 @@
|
||||||
package org.oxycblt.auxio.music
|
package org.oxycblt.auxio.music
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import java.text.ParseException
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
import kotlin.math.max
|
import kotlin.math.max
|
||||||
import org.oxycblt.auxio.R
|
import org.oxycblt.auxio.R
|
||||||
import org.oxycblt.auxio.util.concatLocalized
|
import org.oxycblt.auxio.util.concatLocalized
|
||||||
import org.oxycblt.musikr.Music
|
import org.oxycblt.musikr.Music
|
||||||
|
import org.oxycblt.musikr.tag.Date
|
||||||
import org.oxycblt.musikr.tag.Name
|
import org.oxycblt.musikr.tag.Name
|
||||||
import org.oxycblt.musikr.tag.Placeholder
|
import org.oxycblt.musikr.tag.Placeholder
|
||||||
|
import timber.log.Timber
|
||||||
|
|
||||||
fun Name.resolve(context: Context) =
|
fun Name.resolve(context: Context) =
|
||||||
when (this) {
|
when (this) {
|
||||||
|
@ -65,3 +69,32 @@ fun <T : Music> List<T>.areNamesTheSame(other: List<T>): Boolean {
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolve this instance into a human-readable date.
|
||||||
|
*
|
||||||
|
* @param context [Context] required to get human-readable names.
|
||||||
|
* @return If the [Date] has a valid month and year value, a more fine-grained date (ex. "Jan 2020")
|
||||||
|
* will be returned. Otherwise, a plain year value (ex. "2020") is returned. Dates will be
|
||||||
|
* properly localized.
|
||||||
|
*/
|
||||||
|
fun Date.resolve(context: Context) =
|
||||||
|
// Unable to create fine-grained date, just format as a year.
|
||||||
|
month?.let { resolveFineGrained() } ?: context.getString(R.string.fmt_number, year)
|
||||||
|
|
||||||
|
private fun Date.resolveFineGrained(): String? {
|
||||||
|
// We can't directly load a date with our own
|
||||||
|
val format = (SimpleDateFormat.getDateInstance() as SimpleDateFormat)
|
||||||
|
format.applyPattern("yyyy-MM")
|
||||||
|
val date =
|
||||||
|
try {
|
||||||
|
format.parse("$year-$month")
|
||||||
|
} catch (e: ParseException) {
|
||||||
|
Timber.e("Unable to parse fine-grained date: $e")
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reformat as a readable month and year
|
||||||
|
format.applyPattern("MMM yyyy")
|
||||||
|
return format.format(date)
|
||||||
|
}
|
||||||
|
|
|
@ -19,13 +19,11 @@
|
||||||
package org.oxycblt.musikr.tag
|
package org.oxycblt.musikr.tag
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import java.text.ParseException
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import kotlin.math.max
|
import kotlin.math.max
|
||||||
import org.oxycblt.auxio.R
|
import org.oxycblt.auxio.R
|
||||||
|
import org.oxycblt.auxio.music.resolve
|
||||||
import org.oxycblt.musikr.util.inRangeOrNull
|
import org.oxycblt.musikr.util.inRangeOrNull
|
||||||
import org.oxycblt.musikr.util.positiveOrNull
|
import org.oxycblt.musikr.util.positiveOrNull
|
||||||
import timber.log.Timber as L
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An ISO-8601/RFC 3339 Date.
|
* An ISO-8601/RFC 3339 Date.
|
||||||
|
@ -38,40 +36,11 @@ import timber.log.Timber as L
|
||||||
*/
|
*/
|
||||||
class Date private constructor(private val tokens: List<Int>) : Comparable<Date> {
|
class Date private constructor(private val tokens: List<Int>) : Comparable<Date> {
|
||||||
val year = tokens[0]
|
val year = tokens[0]
|
||||||
private val month = tokens.getOrNull(1)
|
val month = tokens.getOrNull(1)
|
||||||
private val day = tokens.getOrNull(2)
|
val day = tokens.getOrNull(2)
|
||||||
private val hour = tokens.getOrNull(3)
|
val hour = tokens.getOrNull(3)
|
||||||
private val minute = tokens.getOrNull(4)
|
val minute = tokens.getOrNull(4)
|
||||||
private val second = tokens.getOrNull(5)
|
val second = tokens.getOrNull(5)
|
||||||
|
|
||||||
/**
|
|
||||||
* Resolve this instance into a human-readable date.
|
|
||||||
*
|
|
||||||
* @param context [Context] required to get human-readable names.
|
|
||||||
* @return If the [Date] has a valid month and year value, a more fine-grained date (ex. "Jan
|
|
||||||
* 2020") will be returned. Otherwise, a plain year value (ex. "2020") is returned. Dates will
|
|
||||||
* be properly localized.
|
|
||||||
*/
|
|
||||||
fun resolve(context: Context) =
|
|
||||||
// Unable to create fine-grained date, just format as a year.
|
|
||||||
month?.let { resolveFineGrained() } ?: context.getString(R.string.fmt_number, year)
|
|
||||||
|
|
||||||
private fun resolveFineGrained(): String? {
|
|
||||||
// We can't directly load a date with our own
|
|
||||||
val format = (SimpleDateFormat.getDateInstance() as SimpleDateFormat)
|
|
||||||
format.applyPattern("yyyy-MM")
|
|
||||||
val date =
|
|
||||||
try {
|
|
||||||
format.parse("$year-$month")
|
|
||||||
} catch (e: ParseException) {
|
|
||||||
L.e("Unable to parse fine-grained date: $e")
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reformat as a readable month and year
|
|
||||||
format.applyPattern("MMM yyyy")
|
|
||||||
return format.format(date)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun equals(other: Any?) = other is Date && compareTo(other) == 0
|
override fun equals(other: Any?) = other is Date && compareTo(other) == 0
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue