Skip to content

Commit 944314a

Browse files
committed
Check for Player.COMMAND_GET_CURRENT_MEDIA_ITEM before getting the current media URI
1 parent 9bf985f commit 944314a

File tree

3 files changed

+36
-6
lines changed

3 files changed

+36
-6
lines changed

libraries/ui_compose/src/main/java/androidx/media3/ui/compose/state/MetadataState.kt

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,27 @@ fun rememberMetadataState(player: Player): MetadataState {
4848
*/
4949
@UnstableApi
5050
class MetadataState(private val player: Player) {
51-
var uri by mutableStateOf(player.getMediaItemUri())
51+
var uri by mutableStateOf(player.getMediaItemUriWithCommandCheck())
5252
private set
5353

5454
suspend fun observe(): Nothing {
5555
player.listen { events ->
56-
if (events.contains(Player.EVENT_MEDIA_ITEM_TRANSITION)) {
57-
uri = getMediaItemUri()
56+
if (
57+
events.containsAny(
58+
Player.EVENT_AVAILABLE_COMMANDS_CHANGED,
59+
Player.EVENT_MEDIA_ITEM_TRANSITION,
60+
)
61+
) {
62+
uri = getMediaItemUriWithCommandCheck()
5863
}
5964
}
6065
}
6166

62-
private fun Player.getMediaItemUri(): Uri? {
63-
return currentMediaItem?.localConfiguration?.uri
67+
private fun Player.getMediaItemUriWithCommandCheck(): Uri? {
68+
return if (isCommandAvailable(Player.COMMAND_GET_CURRENT_MEDIA_ITEM)) {
69+
currentMediaItem?.localConfiguration?.uri
70+
} else {
71+
null
72+
}
6473
}
6574
}

libraries/ui_compose/src/test/java/androidx/media3/ui/compose/state/MetadataStateTest.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,25 @@ class MetadataStateTest {
105105

106106
assertThat(state.uri).isEqualTo(uri2)
107107
}
108+
109+
@Test
110+
fun uri_getCurrentMediaItemCommandBecomesAvailable_returnsUpdatedUri() {
111+
val uri = "https://storage.googleapis.com/wvmedia/clear/h264/tears/tears.mpd".toUri()
112+
val player = TestPlayer(
113+
playlist = listOf(
114+
MediaItemData.Builder("uid_1").setMediaItem(MediaItem.fromUri(uri)).build(),
115+
),
116+
)
117+
player.removeCommands(Player.COMMAND_GET_CURRENT_MEDIA_ITEM)
118+
119+
lateinit var state: MetadataState
120+
composeTestRule.setContent { state = rememberMetadataState(player) }
121+
122+
assertThat(state.uri).isNull()
123+
124+
player.addCommands(Player.COMMAND_GET_CURRENT_MEDIA_ITEM)
125+
composeTestRule.waitForIdle()
126+
127+
assertThat(state.uri).isEqualTo(uri)
128+
}
108129
}

libraries/ui_compose/src/test/java/androidx/media3/ui/compose/utils/TestPlayer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ internal class TestPlayer(
172172

173173
fun setDuration(uid: String, durationMs: Long) {
174174
val index = state.playlist.indexOfFirst { it.uid == uid }
175-
require(index > -1) { "Playlist does not contain item with uid: $uid" }
175+
require(index >= 0) { "Playlist does not contain item with uid: $uid" }
176176
val modifiedPlaylist = buildList {
177177
addAll(state.playlist)
178178
set(index, state.playlist[index].buildUpon().setDurationUs(msToUs(durationMs)).build())

0 commit comments

Comments
 (0)