|
26 | 26 | import static androidx.media3.common.Player.COMMAND_GET_VOLUME;
|
27 | 27 | import static androidx.media3.common.Player.COMMAND_PLAY_PAUSE;
|
28 | 28 | import static androidx.media3.common.Player.COMMAND_PREPARE;
|
| 29 | +import static androidx.media3.common.Player.COMMAND_RELEASE; |
29 | 30 | import static androidx.media3.common.Player.COMMAND_SEEK_BACK;
|
30 | 31 | import static androidx.media3.common.Player.COMMAND_SEEK_FORWARD;
|
31 | 32 | import static androidx.media3.common.Player.COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM;
|
|
48 | 49 | import static androidx.media3.common.Player.MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED;
|
49 | 50 | import static com.google.common.truth.Truth.assertThat;
|
50 | 51 | import static org.mockito.ArgumentMatchers.any;
|
| 52 | +import static org.mockito.ArgumentMatchers.anyDouble; |
51 | 53 | import static org.mockito.ArgumentMatchers.anyInt;
|
52 | 54 | import static org.mockito.ArgumentMatchers.anyLong;
|
53 | 55 | import static org.mockito.ArgumentMatchers.eq;
|
@@ -139,6 +141,7 @@ public void setUp() {
|
139 | 141 | // Make the remote media client present the same default values as ExoPlayer:
|
140 | 142 | when(mockRemoteMediaClient.isPaused()).thenReturn(true);
|
141 | 143 | when(mockMediaStatus.getQueueRepeatMode()).thenReturn(MediaStatus.REPEAT_MODE_REPEAT_OFF);
|
| 144 | + when(mockMediaStatus.getStreamVolume()).thenReturn(1.0); |
142 | 145 | when(mockMediaStatus.getPlaybackRate()).thenReturn(1.0d);
|
143 | 146 | mediaItemConverter = new DefaultMediaItemConverter();
|
144 | 147 | castPlayer = new CastPlayer(mockCastContext, mediaItemConverter);
|
@@ -390,6 +393,60 @@ public void repeatMode_changesOnStatusUpdates() {
|
390 | 393 | assertThat(castPlayer.getRepeatMode()).isEqualTo(Player.REPEAT_MODE_ONE);
|
391 | 394 | }
|
392 | 395 |
|
| 396 | + @Test |
| 397 | + public void setVolume_masksRemoteState() { |
| 398 | + when(mockRemoteMediaClient.setStreamVolume(anyDouble())).thenReturn(mockPendingResult); |
| 399 | + assertThat(castPlayer.getVolume()).isEqualTo(1f); |
| 400 | + |
| 401 | + castPlayer.setVolume(0.5f); |
| 402 | + verify(mockPendingResult).setResultCallback(setResultCallbackArgumentCaptor.capture()); |
| 403 | + assertThat(castPlayer.getVolume()).isEqualTo(0.5f); |
| 404 | + verify(mockListener).onVolumeChanged(0.5f); |
| 405 | + |
| 406 | + // There is a status update in the middle, which should be hidden by masking. |
| 407 | + when(mockMediaStatus.getStreamVolume()).thenReturn(0.75); |
| 408 | + remoteMediaClientCallback.onStatusUpdated(); |
| 409 | + verifyNoMoreInteractions(mockListener); |
| 410 | + |
| 411 | + // Upon result, the mediaStatus now exposes the new volume. |
| 412 | + when(mockMediaStatus.getStreamVolume()).thenReturn(0.5); |
| 413 | + setResultCallbackArgumentCaptor |
| 414 | + .getValue() |
| 415 | + .onResult(mock(RemoteMediaClient.MediaChannelResult.class)); |
| 416 | + verifyNoMoreInteractions(mockListener); |
| 417 | + } |
| 418 | + |
| 419 | + @Test |
| 420 | + public void setVolume_updatesUponResultChange() { |
| 421 | + when(mockRemoteMediaClient.setStreamVolume(anyDouble())).thenReturn(mockPendingResult); |
| 422 | + |
| 423 | + castPlayer.setVolume(0.5f); |
| 424 | + verify(mockPendingResult).setResultCallback(setResultCallbackArgumentCaptor.capture()); |
| 425 | + assertThat(castPlayer.getVolume()).isEqualTo(0.5f); |
| 426 | + verify(mockListener).onVolumeChanged(0.5f); |
| 427 | + |
| 428 | + // There is a status update in the middle, which should be hidden by masking. |
| 429 | + when(mockMediaStatus.getStreamVolume()).thenReturn(0.75); |
| 430 | + remoteMediaClientCallback.onStatusUpdated(); |
| 431 | + verifyNoMoreInteractions(mockListener); |
| 432 | + |
| 433 | + // Upon result, the volume is 0.75. The state should reflect that. |
| 434 | + setResultCallbackArgumentCaptor |
| 435 | + .getValue() |
| 436 | + .onResult(mock(RemoteMediaClient.MediaChannelResult.class)); |
| 437 | + verify(mockListener).onVolumeChanged(0.75f); |
| 438 | + assertThat(castPlayer.getVolume()).isEqualTo(0.75f); |
| 439 | + } |
| 440 | + |
| 441 | + @Test |
| 442 | + public void volume_changesOnStatusUpdates() { |
| 443 | + assertThat(castPlayer.getVolume()).isEqualTo(1f); |
| 444 | + when(mockMediaStatus.getStreamVolume()).thenReturn(0.75); |
| 445 | + remoteMediaClientCallback.onStatusUpdated(); |
| 446 | + verify(mockListener).onVolumeChanged(0.75f); |
| 447 | + assertThat(castPlayer.getVolume()).isEqualTo(0.75f); |
| 448 | + } |
| 449 | + |
393 | 450 | @Test
|
394 | 451 | public void setMediaItems_callsRemoteMediaClient() {
|
395 | 452 | List<MediaItem> mediaItems = new ArrayList<>();
|
@@ -1410,7 +1467,49 @@ public void isCommandAvailable_isTrueForAvailableCommands() {
|
1410 | 1467 | assertThat(castPlayer.isCommandAvailable(COMMAND_ADJUST_DEVICE_VOLUME)).isTrue();
|
1411 | 1468 | assertThat(castPlayer.isCommandAvailable(COMMAND_SET_VIDEO_SURFACE)).isFalse();
|
1412 | 1469 | assertThat(castPlayer.isCommandAvailable(COMMAND_GET_TEXT)).isFalse();
|
1413 |
| - assertThat(castPlayer.isCommandAvailable(Player.COMMAND_RELEASE)).isTrue(); |
| 1470 | + assertThat(castPlayer.isCommandAvailable(COMMAND_RELEASE)).isTrue(); |
| 1471 | + } |
| 1472 | + |
| 1473 | + @Test |
| 1474 | + public void isCommandAvailable_setVolumeIsSupported() { |
| 1475 | + when(mockMediaStatus.isMediaCommandSupported(MediaStatus.COMMAND_SET_VOLUME)).thenReturn(true); |
| 1476 | + |
| 1477 | + int[] mediaQueueItemIds = new int[] {1, 2}; |
| 1478 | + List<MediaItem> mediaItems = createMediaItems(mediaQueueItemIds); |
| 1479 | + |
| 1480 | + castPlayer.addMediaItems(mediaItems); |
| 1481 | + updateTimeLine(mediaItems, mediaQueueItemIds, /* currentItemId= */ 1); |
| 1482 | + |
| 1483 | + assertThat(castPlayer.isCommandAvailable(COMMAND_PLAY_PAUSE)).isTrue(); |
| 1484 | + assertThat(castPlayer.isCommandAvailable(COMMAND_PREPARE)).isTrue(); |
| 1485 | + assertThat(castPlayer.isCommandAvailable(COMMAND_STOP)).isTrue(); |
| 1486 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_DEFAULT_POSITION)).isTrue(); |
| 1487 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM)).isTrue(); |
| 1488 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM)).isFalse(); |
| 1489 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_PREVIOUS)).isTrue(); |
| 1490 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_NEXT_MEDIA_ITEM)).isTrue(); |
| 1491 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_NEXT)).isTrue(); |
| 1492 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_TO_MEDIA_ITEM)).isTrue(); |
| 1493 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_BACK)).isTrue(); |
| 1494 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SEEK_FORWARD)).isTrue(); |
| 1495 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SET_SPEED_AND_PITCH)).isTrue(); |
| 1496 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SET_SHUFFLE_MODE)).isFalse(); |
| 1497 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SET_REPEAT_MODE)).isTrue(); |
| 1498 | + assertThat(castPlayer.isCommandAvailable(COMMAND_GET_CURRENT_MEDIA_ITEM)).isTrue(); |
| 1499 | + assertThat(castPlayer.isCommandAvailable(COMMAND_GET_TIMELINE)).isTrue(); |
| 1500 | + assertThat(castPlayer.isCommandAvailable(COMMAND_GET_METADATA)).isTrue(); |
| 1501 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SET_PLAYLIST_METADATA)).isTrue(); |
| 1502 | + assertThat(castPlayer.isCommandAvailable(COMMAND_CHANGE_MEDIA_ITEMS)).isTrue(); |
| 1503 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SET_MEDIA_ITEM)).isTrue(); |
| 1504 | + assertThat(castPlayer.isCommandAvailable(COMMAND_GET_AUDIO_ATTRIBUTES)).isFalse(); |
| 1505 | + assertThat(castPlayer.isCommandAvailable(COMMAND_GET_VOLUME)).isTrue(); |
| 1506 | + assertThat(castPlayer.isCommandAvailable(COMMAND_GET_DEVICE_VOLUME)).isTrue(); |
| 1507 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SET_VOLUME)).isTrue(); |
| 1508 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SET_DEVICE_VOLUME)).isTrue(); |
| 1509 | + assertThat(castPlayer.isCommandAvailable(COMMAND_ADJUST_DEVICE_VOLUME)).isTrue(); |
| 1510 | + assertThat(castPlayer.isCommandAvailable(COMMAND_SET_VIDEO_SURFACE)).isFalse(); |
| 1511 | + assertThat(castPlayer.isCommandAvailable(COMMAND_GET_TEXT)).isFalse(); |
| 1512 | + assertThat(castPlayer.isCommandAvailable(COMMAND_RELEASE)).isTrue(); |
1414 | 1513 | }
|
1415 | 1514 |
|
1416 | 1515 | @Test
|
|
0 commit comments