File tree Expand file tree Collapse file tree 3 files changed +36
-6
lines changed
main/java/androidx/media3/ui/compose/state
test/java/androidx/media3/ui/compose Expand file tree Collapse file tree 3 files changed +36
-6
lines changed Original file line number Diff line number Diff line change @@ -48,18 +48,27 @@ fun rememberMetadataState(player: Player): MetadataState {
48
48
*/
49
49
@UnstableApi
50
50
class MetadataState (private val player : Player ) {
51
- var uri by mutableStateOf(player.getMediaItemUri ())
51
+ var uri by mutableStateOf(player.getMediaItemUriWithCommandCheck ())
52
52
private set
53
53
54
54
suspend fun observe (): Nothing {
55
55
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()
58
63
}
59
64
}
60
65
}
61
66
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
+ }
64
73
}
65
74
}
Original file line number Diff line number Diff line change @@ -105,4 +105,25 @@ class MetadataStateTest {
105
105
106
106
assertThat(state.uri).isEqualTo(uri2)
107
107
}
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
+ }
108
129
}
Original file line number Diff line number Diff line change @@ -172,7 +172,7 @@ internal class TestPlayer(
172
172
173
173
fun setDuration (uid : String , durationMs : Long ) {
174
174
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 " }
176
176
val modifiedPlaylist = buildList {
177
177
addAll(state.playlist)
178
178
set(index, state.playlist[index].buildUpon().setDurationUs(msToUs(durationMs)).build())
You can’t perform that action at this time.
0 commit comments