From d3d6d18d5da8bebc664f342c8d0bbb5ac0ff4955 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Mon, 7 Mar 2022 07:18:15 -0700 Subject: [PATCH] music: fix crash below android 8 [#95] Fix a crash that stemmed from the use of the API 30+ database field CD_TRACK_NUMBER. I switched to CD_TRACK_NUMBER in 1e39ceb to fix [#88], however I did not realize that CD_TRACK_NUMBER was actually only supported on API 30 onwards. This led to a load failure on versions before API 30. --- .../java/org/oxycblt/auxio/music/MusicLoader.kt | 17 ++++++++--------- .../playback/state/PlaybackStateManager.kt | 5 ++--- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicLoader.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicLoader.kt index 41cf58e27..4dea223cc 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicLoader.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicLoader.kt @@ -112,7 +112,6 @@ class MusicLoader { ) } - @Suppress("InlinedApi") private fun loadSongs(context: Context): List { var songs = mutableListOf() val blacklistDatabase = ExcludedDatabase.getInstance(context) @@ -137,7 +136,7 @@ class MusicLoader { MediaStore.Audio.AudioColumns._ID, MediaStore.Audio.AudioColumns.TITLE, MediaStore.Audio.AudioColumns.DISPLAY_NAME, - MediaStore.Audio.AudioColumns.CD_TRACK_NUMBER, + MediaStore.Audio.AudioColumns.TRACK, MediaStore.Audio.AudioColumns.DURATION, MediaStore.Audio.AudioColumns.YEAR, MediaStore.Audio.AudioColumns.ALBUM, @@ -150,7 +149,7 @@ class MusicLoader { val idIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns._ID) val titleIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.TITLE) val fileIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.DISPLAY_NAME) - val trackIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.CD_TRACK_NUMBER) + val trackIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.TRACK) val durationIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.DURATION) val yearIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.YEAR) val albumIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.ALBUM) @@ -163,12 +162,12 @@ class MusicLoader { val title = cursor.getString(titleIndex) val fileName = cursor.getString(fileIndex) - // CD_TRACK_NUMBER formats tracks as NN/TT or NN where N is the track number and - // T Is the total. Parse out the NN and ignore the rest. This has to be a highly - // redundant process, as there seems to be a weird amount of edge-cases. - val track = cursor.getStringOrNull(trackIndex)?.run { - split("/").getOrNull(0)?.toIntOrNull() - } + // The TRACK field is for some reason formatted as DTTT, where D is the disk + // and T is the track. This is dumb and insane and forces me to mangle track + // numbers above 1000 but there is nothing we can do that won't break the app + // below API 30. + // TODO: Disk number support? + val track = cursor.getIntOrNull(trackIndex)?.mod(1000) val duration = cursor.getLong(durationIndex) val year = cursor.getIntOrNull(yearIndex) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt index 5f2d81a29..0a8e1d7c9 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt @@ -596,11 +596,10 @@ class PlaybackStateManager private constructor() { * Do a sanity check to make sure that the index lines up with the current song. */ private fun doIndexSanityCheck() { - // Note: Be careful with how we handle the queue since a possible index desync - // could easily result in an OOB issue. + // Be careful with how we handle the queue since a possible index de-sync + // could easily result in an OOB crash. if (mSong != null && mSong != mQueue.getOrNull(mIndex)) { val correctedIndex = mQueue.wobblyIndexOfFirst(mIndex, mSong) - if (correctedIndex > -1) { logD("Correcting malformed index to $correctedIndex") mIndex = correctedIndex