Skip to content

Commit a742ac4

Browse files
committed
Only set mediaId on MediaItems in media controller
This makes the media controller more responsive, see androidx/media#81
1 parent 7a9c5a1 commit a742ac4

File tree

4 files changed

+44
-36
lines changed

4 files changed

+44
-36
lines changed

app/src/main/kotlin/com/simplemobiletools/musicplayer/extensions/Player.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import androidx.media3.common.Player
77
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
88
import com.simplemobiletools.musicplayer.helpers.PlaybackSetting
99
import com.simplemobiletools.musicplayer.models.Track
10-
import com.simplemobiletools.musicplayer.models.toMediaItems
10+
import com.simplemobiletools.musicplayer.models.toMediaItemsFast
1111

1212
val Player.isReallyPlaying: Boolean
1313
get() = when (playbackState) {
@@ -149,7 +149,7 @@ fun Player.prepareUsingTracks(
149149
return
150150
}
151151

152-
val mediaItems = tracks.toMediaItems()
152+
val mediaItems = tracks.toMediaItemsFast()
153153
runOnPlayerThread {
154154
setMediaItems(mediaItems, startIndex, startPositionMs)
155155
playWhenReady = play
@@ -179,7 +179,7 @@ inline fun Player.maybePreparePlayer(context: Context, crossinline callback: (su
179179
return@getQueuedTracksLazily
180180
}
181181

182-
addRemainingMediaItems(tracks.toMediaItems(), startIndex)
182+
addRemainingMediaItems(tracks.toMediaItemsFast(), startIndex)
183183
}
184184
}
185185
}

app/src/main/kotlin/com/simplemobiletools/musicplayer/models/Track.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.simplemobiletools.musicplayer.models
33
import android.content.ContentUris
44
import android.net.Uri
55
import android.provider.MediaStore
6+
import androidx.media3.common.MediaItem
67
import androidx.room.ColumnInfo
78
import androidx.room.Entity
89
import androidx.room.Index
@@ -101,3 +102,9 @@ data class Track(
101102
fun ArrayList<Track>.sortSafely(sorting: Int) = sortSafely(Track.getComparator(sorting))
102103

103104
fun Collection<Track>.toMediaItems() = map { it.toMediaItem() }
105+
106+
fun Collection<Track>.toMediaItemsFast() = map {
107+
MediaItem.Builder()
108+
.setMediaId(it.mediaStoreId.toString())
109+
.build()
110+
}

app/src/main/kotlin/com/simplemobiletools/musicplayer/playback/MediaSessionCallback.kt

Lines changed: 24 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -166,52 +166,44 @@ internal fun PlaybackService.getMediaSessionCallback() = object : MediaLibrarySe
166166
mediaItems: MutableList<MediaItem>,
167167
startIndex: Int,
168168
startPositionMs: Long
169-
) = if (controller.packageName == packageName) {
170-
Futures.immediateFuture(MediaSession.MediaItemsWithStartPosition(mediaItems, startIndex, startPositionMs))
171-
} else {
172-
callWhenSourceReady {
173-
// this is to avoid single items in the queue: https://github.com/androidx/media/issues/156
174-
var queueItems = mediaItems
175-
val startItemId = mediaItems[0].mediaId
176-
val currentItems = mediaItemProvider.getChildren(currentRoot).orEmpty()
169+
): ListenableFuture<MediaSession.MediaItemsWithStartPosition> {
170+
if (controller.packageName == packageName) {
171+
return super.onSetMediaItems(mediaSession, controller, mediaItems, startIndex, startPositionMs)
172+
}
177173

178-
queueItems = if (currentItems.any { it.mediaId == startItemId }) {
179-
currentItems.toMutableList()
180-
} else {
181-
mediaItemProvider.getDefaultQueue()?.toMutableList() ?: queueItems
182-
}
174+
// this is to avoid single items in the queue: https://github.com/androidx/media/issues/156
175+
var queueItems = mediaItems
176+
val startItemId = mediaItems[0].mediaId
177+
val currentItems = mediaItemProvider.getChildren(currentRoot).orEmpty()
183178

184-
val startItemIndex = queueItems.indexOfFirst { it.mediaId == startItemId }
185-
super.onSetMediaItems(mediaSession, controller, queueItems, startItemIndex, startPositionMs).get()
179+
queueItems = if (currentItems.any { it.mediaId == startItemId }) {
180+
currentItems.toMutableList()
181+
} else {
182+
mediaItemProvider.getDefaultQueue()?.toMutableList() ?: queueItems
186183
}
184+
185+
val startItemIndex = queueItems.indexOfFirst { it.mediaId == startItemId }
186+
return super.onSetMediaItems(mediaSession, controller, queueItems, startItemIndex, startPositionMs)
187187
}
188188

189189
override fun onAddMediaItems(
190190
mediaSession: MediaSession,
191191
controller: MediaSession.ControllerInfo,
192192
mediaItems: List<MediaItem>
193-
) = if (controller.packageName == packageName) {
194-
Futures.immediateFuture(mediaItems)
195-
} else {
196-
callWhenSourceReady {
197-
mediaItems.map { mediaItem ->
198-
if (mediaItem.requestMetadata.searchQuery != null) {
199-
getMediaItemFromSearchQuery(mediaItem.requestMetadata.searchQuery!!)
200-
} else {
201-
mediaItemProvider[mediaItem.mediaId] ?: mediaItem
202-
}
193+
): ListenableFuture<List<MediaItem>> {
194+
val items = mediaItems.map { mediaItem ->
195+
if (mediaItem.requestMetadata.searchQuery != null) {
196+
getMediaItemFromSearchQuery(mediaItem.requestMetadata.searchQuery!!)
197+
} else {
198+
mediaItemProvider[mediaItem.mediaId] ?: mediaItem
203199
}
204200
}
201+
202+
return Futures.immediateFuture(items)
205203
}
206204

207205
private fun getMediaItemFromSearchQuery(query: String): MediaItem {
208-
val searchQuery = if (query.startsWith("play ", ignoreCase = true)) {
209-
query.drop(5).lowercase()
210-
} else {
211-
query.lowercase()
212-
}
213-
214-
return mediaItemProvider.getItemFromSearch(searchQuery) ?: mediaItemProvider.getRandomItem()
206+
return mediaItemProvider.getItemFromSearch(query.lowercase()) ?: mediaItemProvider.getRandomItem()
215207
}
216208

217209
private fun reloadContent() {

app/src/main/kotlin/com/simplemobiletools/musicplayer/playback/library/MediaItemProvider.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,16 @@ internal class MediaItemProvider(private val context: Context) {
8989
}
9090
}
9191

92-
operator fun get(mediaId: String) = getNode(mediaId)?.item
92+
operator fun get(mediaId: String): MediaItem? {
93+
val mediaItem = getNode(mediaId)?.item
94+
if (mediaItem == null) {
95+
// assume it's a track
96+
val mediaStoreId = mediaId.toLongOrNull() ?: return null
97+
return audioHelper.getTrack(mediaStoreId)?.toMediaItem()
98+
}
99+
100+
return mediaItem
101+
}
93102

94103
fun getRootItem() = get(SMP_ROOT_ID)!!
95104

0 commit comments

Comments
 (0)