Skip to content

Commit f0f815a

Browse files
committed
fixes #400
1 parent 9eeb65e commit f0f815a

3 files changed

Lines changed: 36 additions & 11 deletions

File tree

app/src/main/java/org/akanework/gramophone/ui/adapters/BaseDecorAdapter.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,7 @@ open class BaseDecorAdapter<T : BaseAdapter<*>>(
178178
controller?.repeatMode = REPEAT_MODE_OFF
179179
controller?.shuffleModeEnabled = false
180180
list.takeIf { it.isNotEmpty() }?.also { albums ->
181-
controller?.setMediaItems(albums.flatMap { it.songList.sortedBy { song ->
182-
(song.mediaMetadata.discNumber ?: 0) * 1000 +
183-
(song.mediaMetadata.trackNumber ?: 0) } })
181+
controller?.setMediaItems(albums.flatMap { it.songList })
184182
controller?.prepare()
185183
controller?.play()
186184
} ?: controller?.setMediaItems(listOf())
@@ -202,10 +200,7 @@ open class BaseDecorAdapter<T : BaseAdapter<*>>(
202200
controller?.repeatMode = REPEAT_MODE_OFF
203201
controller?.shuffleModeEnabled = false
204202
list.takeIf { it.isNotEmpty() }?.also { albums ->
205-
controller?.setMediaItems(albums.shuffled()
206-
.flatMap { it.songList.sortedBy { song ->
207-
(song.mediaMetadata.discNumber ?: 0) * 1000 +
208-
(song.mediaMetadata.trackNumber ?: 0) } })
203+
controller?.setMediaItems(albums.shuffled().flatMap { it.songList })
209204
controller?.prepare()
210205
controller?.play()
211206
} ?: controller?.setMediaItems(listOf())

app/src/main/java/uk/akane/libphonograph/reader/Reader.kt

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ import androidx.media3.common.HeartRating
1111
import androidx.media3.common.MediaItem
1212
import androidx.media3.common.MediaMetadata
1313
import androidx.media3.common.util.UnstableApi
14+
import kotlinx.coroutines.Dispatchers
15+
import kotlinx.coroutines.joinAll
16+
import kotlinx.coroutines.launch
17+
import kotlinx.coroutines.runBlocking
18+
import kotlinx.coroutines.supervisorScope
19+
import kotlinx.coroutines.withContext
1420
import org.akanework.gramophone.logic.hasAudioPermission
1521
import org.akanework.gramophone.logic.hasImagePermission
1622
import org.akanework.gramophone.logic.hasImprovedMediaStore
@@ -42,6 +48,7 @@ import uk.akane.libphonograph.utils.MiscUtils.handleShallowMediaItem
4248
import java.io.File
4349
import java.time.Instant
4450
import java.time.ZoneId
51+
import kotlin.math.min
4552

4653
internal object Reader {
4754
// not actually defined in API, but CTS tested
@@ -106,7 +113,7 @@ internal object Reader {
106113
* without much hassle.
107114
*/
108115
@OptIn(UnstableApi::class)
109-
fun readFromMediaStore(
116+
suspend fun readFromMediaStore(
110117
context: Context,
111118
minSongLengthSeconds: Long = 0,
112119
blackListSet: Set<String> = setOf(),
@@ -412,6 +419,20 @@ internal object Reader {
412419
}
413420
}
414421
}?.toList<Album>()
422+
if (!albumList.isNullOrEmpty()) {
423+
supervisorScope {
424+
for (i in 0..(albumList.size / 100)) {
425+
launch {
426+
for (j in (i * 100)..<min(i * 100 + 100, albumList.size)) {
427+
(albumList[j].songList as MutableList).sortBy {
428+
(it.mediaMetadata.discNumber ?: 0) * 1000 +
429+
(it.mediaMetadata.trackNumber ?: 0)
430+
}
431+
}
432+
}
433+
}
434+
}
435+
}
415436
val artistList = artistMap?.values?.toList()
416437
val albumArtistList = albumArtistMap?.values?.toList()
417438
val genreList = genreMap?.values?.toList()

app/src/main/java/uk/akane/libphonograph/reader/SimpleReader.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package uk.akane.libphonograph.reader
22

33
import android.content.Context
4+
import kotlinx.coroutines.Dispatchers
5+
import kotlinx.coroutines.runBlocking
6+
import kotlinx.coroutines.withContext
47
import uk.akane.libphonograph.dynamicitem.RecentlyAdded
58

69
object SimpleReader {
@@ -14,9 +17,15 @@ object SimpleReader {
1417
coverStubUri: String? = null
1518
): SimpleReaderResult {
1619
val (playlists, foundPlaylistContent) = Reader.fetchPlaylists(context)
17-
val result = Reader.readFromMediaStore(context, minSongLengthSeconds, blackListSet,
18-
shouldUseEnhancedCoverReading, shouldIncludeExtraFormat,
19-
shouldLoadIdMap = foundPlaylistContent, coverStubUri = coverStubUri)
20+
val result = runBlocking {
21+
withContext(Dispatchers.Default) {
22+
Reader.readFromMediaStore(
23+
context, minSongLengthSeconds, blackListSet,
24+
shouldUseEnhancedCoverReading, shouldIncludeExtraFormat,
25+
shouldLoadIdMap = foundPlaylistContent, coverStubUri = coverStubUri
26+
)
27+
}
28+
}
2029
// We can null assert because we never pass shouldLoad*=false into Reader
2130
return SimpleReaderResult(
2231
result.songList,

0 commit comments

Comments
 (0)