From 7d8cdba6a9ce0e68c6a13e96d2c009022ff49fda Mon Sep 17 00:00:00 2001 From: Chris Palmeri Date: Wed, 12 Apr 2023 00:26:24 -0500 Subject: [PATCH 1/4] Regex numbers and common thumb --- .../java/org/oxycblt/auxio/music/Music.kt | 53 +++++++------------ 1 file changed, 20 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/music/Music.kt b/app/src/main/java/org/oxycblt/auxio/music/Music.kt index 93fc7e581..2b77da6b5 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Music.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Music.kt @@ -349,7 +349,6 @@ interface Playlist : MusicParent { * @author Alexander Capehart (OxygenCobalt) */ class SortName(name: String, musicSettings: MusicSettings) : Comparable { - private val number: Int? private val collationKey: CollationKey val thumbString: String? @@ -366,50 +365,38 @@ class SortName(name: String, musicSettings: MusicSettings) : Comparable number = null - // Whole title is numeric. - -1 -> { - number = sortName.toIntOrNull() - sortName = "" + // TODO: replace starting ' " ... ( + + // Zero pad the first number to (an arbitrary) five digits for better sorting + // Will also accept commas in between digits and strip them + sortName = + sortName.replace("""(\d+[\d,]+\d+|\d+)(.*)""".toRegex()) { + val (firstNumber, remainingText) = it.destructured + val onlyDigits = firstNumber.filter { c -> c.isDigit() } + onlyDigits.padStart(5, '0') + remainingText } - // Part of the title is numeric. - else -> { - number = sortName.slice(0 until numericEnd).toIntOrNull() - sortName = sortName.slice(numericEnd until sortName.length) - } - } - } else { - number = null } collationKey = COLLATOR.getCollationKey(sortName) // Keep track of a string to use in the thumb view. + // Simply show '#' for everything before 'A' // TODO: This needs to be moved elsewhere. - thumbString = (number?.toString() ?: collationKey?.run { sourceString.first().uppercase() }) + thumbString = + collationKey?.run { + var thumbChar = sourceString.firstOrNull() + if (thumbChar?.isLetter() != true) thumbChar = '#' + thumbChar.uppercase() + } } - override fun toString(): String = number?.toString() ?: collationKey.sourceString + override fun toString(): String = collationKey.sourceString - override fun compareTo(other: SortName) = - when { - number != null && other.number != null -> number.compareTo(other.number) - number != null && other.number == null -> -1 // a < b - number == null && other.number != null -> 1 // a > b - else -> collationKey.compareTo(other.collationKey) - } + override fun compareTo(other: SortName) = collationKey.compareTo(other.collationKey) - override fun equals(other: Any?) = - other is SortName && number == other.number && collationKey == other.collationKey + override fun equals(other: Any?) = other is SortName && collationKey == other.collationKey - override fun hashCode(): Int { - var hashCode = collationKey.hashCode() - if (number != null) hashCode = 31 * hashCode + number - return hashCode - } + override fun hashCode(): Int = collationKey.hashCode() private companion object { val COLLATOR: Collator = Collator.getInstance().apply { strength = Collator.PRIMARY } From b34462340a76746e943c150403d9ae20fd55a8f1 Mon Sep 17 00:00:00 2001 From: Chris Palmeri Date: Wed, 12 Apr 2023 23:33:16 -0500 Subject: [PATCH 2/4] Strip symbols and forget thousands separator --- .../main/java/org/oxycblt/auxio/music/Music.kt | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/music/Music.kt b/app/src/main/java/org/oxycblt/auxio/music/Music.kt index 2b77da6b5..9b5abb36f 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Music.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Music.kt @@ -355,6 +355,9 @@ class SortName(name: String, musicSettings: MusicSettings) : Comparable c.isDigit() } - onlyDigits.padStart(5, '0') + remainingText - } + // Zero pad all numbers to (an arbitrary) five digits for better sorting + sortName = sortName.replace(Regex("""\d+""")) { it.value.padStart(5, '0') } } collationKey = COLLATOR.getCollationKey(sortName) From d04cd4ce4f7ef5775f1e4966094804b0fbeec085 Mon Sep 17 00:00:00 2001 From: Chris Palmeri Date: Sat, 15 Apr 2023 10:05:15 -0500 Subject: [PATCH 3/4] Refactor sort name changes --- app/src/main/java/org/oxycblt/auxio/music/Music.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/music/Music.kt b/app/src/main/java/org/oxycblt/auxio/music/Music.kt index 9b5abb36f..49cae357f 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Music.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Music.kt @@ -355,8 +355,7 @@ class SortName(name: String, musicSettings: MusicSettings) : Comparable Date: Sat, 15 Apr 2023 10:11:39 -0500 Subject: [PATCH 4/4] Use six digit sort name padding --- app/src/main/java/org/oxycblt/auxio/music/Music.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/music/Music.kt b/app/src/main/java/org/oxycblt/auxio/music/Music.kt index 49cae357f..12b69191e 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Music.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Music.kt @@ -367,8 +367,8 @@ class SortName(name: String, musicSettings: MusicSettings) : Comparable