Return empty timeline when media info is null

Issue: androidx/media#708
PiperOrigin-RevId: 584054624
This commit is contained in:
bachinger 2023-11-20 09:52:51 -08:00 committed by Copybara-Service
parent 4bcb60d31d
commit 167f50a9ca
3 changed files with 29 additions and 3 deletions

View File

@ -90,6 +90,9 @@
([#710](https://github.com/androidx/media/pull/710)). ([#710](https://github.com/androidx/media/pull/710)).
* Leanback extension: * Leanback extension:
* Cast Extension: * Cast Extension:
* Sanitize creation of a `Timeline` to not crash the app when loading
media fails on the cast device
([#708](https://github.com/androidx/media/issues/708)).
* Test Utilities: * Test Utilities:
* Remove deprecated symbols: * Remove deprecated symbols:
* Demo app: * Demo app:

View File

@ -17,7 +17,6 @@ package androidx.media3.cast;
import static androidx.media3.cast.CastTimeline.ItemData.UNKNOWN_CONTENT_ID; import static androidx.media3.cast.CastTimeline.ItemData.UNKNOWN_CONTENT_ID;
import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.common.util.Assertions.checkStateNotNull;
import android.util.SparseArray; import android.util.SparseArray;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -105,12 +104,12 @@ import java.util.List;
// TODO: Reset state when the app instance changes [Internal ref: b/129672468]. // TODO: Reset state when the app instance changes [Internal ref: b/129672468].
MediaStatus mediaStatus = remoteMediaClient.getMediaStatus(); MediaStatus mediaStatus = remoteMediaClient.getMediaStatus();
if (mediaStatus == null) { if (mediaStatus == null || mediaStatus.getMediaInfo() == null) {
return CastTimeline.EMPTY_CAST_TIMELINE; return CastTimeline.EMPTY_CAST_TIMELINE;
} }
int currentItemId = mediaStatus.getCurrentItemId(); int currentItemId = mediaStatus.getCurrentItemId();
String currentContentId = checkStateNotNull(mediaStatus.getMediaInfo()).getContentId(); String currentContentId = checkNotNull(mediaStatus.getMediaInfo()).getContentId();
MediaItem mediaItem = mediaItemsByContentId.get(currentContentId); MediaItem mediaItem = mediaItemsByContentId.get(currentContentId);
updateItemData( updateItemData(
currentItemId, currentItemId,

View File

@ -277,6 +277,30 @@ public class CastTimelineTrackerTest {
assertThat(castTimelineTracker.mediaItemsByContentId).hasSize(1); assertThat(castTimelineTracker.mediaItemsByContentId).hasSize(1);
} }
@Test
public void getCastTimeline_mediaStatusIsNull_returnsEmptyTimeline() {
RemoteMediaClient mockRemoteMediaClient = mock(RemoteMediaClient.class);
MediaQueue mediaQueue = mock(MediaQueue.class);
when(mockRemoteMediaClient.getMediaQueue()).thenReturn(mediaQueue);
when(mediaQueue.getItemIds()).thenReturn(new int[0]);
when(mockRemoteMediaClient.getMediaStatus()).thenReturn(null);
assertThat(castTimelineTracker.getCastTimeline(mockRemoteMediaClient).isEmpty()).isTrue();
}
@Test
public void getCastTimeline_mediaInfoIsNull_returnsEmptyTimeline() {
RemoteMediaClient mockRemoteMediaClient = mock(RemoteMediaClient.class);
MediaQueue mediaQueue = mock(MediaQueue.class);
when(mockRemoteMediaClient.getMediaQueue()).thenReturn(mediaQueue);
when(mediaQueue.getItemIds()).thenReturn(new int[0]);
MediaStatus mediaStatus = mock(MediaStatus.class);
when(mockRemoteMediaClient.getMediaStatus()).thenReturn(mediaStatus);
when(mediaStatus.getMediaInfo()).thenReturn(null);
assertThat(castTimelineTracker.getCastTimeline(mockRemoteMediaClient).isEmpty()).isTrue();
}
private MediaItem createMediaItem(int uid) { private MediaItem createMediaItem(int uid) {
return new MediaItem.Builder() return new MediaItem.Builder()
.setUri("http://www.google.com/" + uid) .setUri("http://www.google.com/" + uid)