@Override public boolean equals(MediaDescriptionCompat d1, MediaDescriptionCompat d2) { return Util.areEqual(d1.getMediaId(), d2.getMediaId()); }
@Override public void onItemLoaded(MediaItem mediaItem) { super.onItemLoaded(mediaItem); this.mediaItem = mediaItem; }
new MediaMetadataCompat.Builder() .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, mediaId) .putString(MediaMetadataCompat.METADATA_KEY_TITLE, title) .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_URI, Uri.parse(mediaId).toString()) .build(); final MediaItem mediaItem = new MediaItem(metadataCompat.getDescription(), flag); mediaItems.put(mediaId, mediaItem);
mSession.setPlaybackState(new PlaybackStateCompat.Builder() .setState(playState, position(), 1.0f) .setActions(PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_PAUSE | PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_SKIP_TO_NEXT | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS) .build()); mSession.setMetadata(new MediaMetadataCompat.Builder() .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, getArtistName()) .putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ARTIST, getAlbumArtistName()) .putString(MediaMetadataCompat.METADATA_KEY_ALBUM, getAlbumName()) .putString(MediaMetadataCompat.METADATA_KEY_TITLE, getTrackName()) .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, duration()) .putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, getQueuePosition() + 1) .putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, getQueue().length) .putString(MediaMetadataCompat.METADATA_KEY_GENRE, getGenreName()) .putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, albumArt) .build()); mSession.setPlaybackState(new PlaybackStateCompat.Builder() .setState(playState, position(), 1.0f) .setActions(PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_PAUSE | PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_SKIP_TO_NEXT | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS) .build());
MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder(); if (player.isPlayingAd()) { builder.putLong(MediaMetadataCompat.METADATA_KEY_ADVERTISEMENT, 1); builder.putLong( MediaMetadataCompat.METADATA_KEY_DURATION, player.getDuration() == C.TIME_UNSET ? -1 : player.getDuration()); long activeQueueItemId = mediaController.getPlaybackState().getActiveQueueItemId(); if (activeQueueItemId != MediaSessionCompat.QueueItem.UNKNOWN_ID) { List<MediaSessionCompat.QueueItem> queue = mediaController.getQueue(); for (int i = 0; queue != null && i < queue.size(); i++) { MediaSessionCompat.QueueItem queueItem = queue.get(i); if (queueItem.getQueueId() == activeQueueItemId) { MediaDescriptionCompat description = queueItem.getDescription(); Bundle extras = description.getExtras(); if (extras != null) { for (String key : extras.keySet()) { Object value = extras.get(key); if (value instanceof String) { builder.putString(metadataExtrasPrefix + key, (String) value); } else if (value instanceof CharSequence) { builder.putText(metadataExtrasPrefix + key, (CharSequence) value); } else if (value instanceof Long) { builder.putLong(metadataExtrasPrefix + key, (Long) value); } else if (value instanceof Integer) { builder.putLong(metadataExtrasPrefix + key, (Integer) value); } else if (value instanceof Bitmap) { builder.putBitmap(metadataExtrasPrefix + key, (Bitmap) value); } else if (value instanceof RatingCompat) {
@Override public MediaDescriptionCompat getQueueMetadata(int index) { if (player.getPlayQueue() == null || player.getPlayQueue().getItem(index) == null) { return null; } final PlayQueueItem item = player.getPlayQueue().getItem(index); MediaDescriptionCompat.Builder descriptionBuilder = new MediaDescriptionCompat.Builder() .setMediaId(String.valueOf(index)) .setTitle(item.getTitle()) .setSubtitle(item.getUploader()); final Uri thumbnailUri = Uri.parse(item.getThumbnailUrl()); if (thumbnailUri != null) descriptionBuilder.setIconUri(thumbnailUri); return descriptionBuilder.build(); }
/** * This differs from real Android search logic. Search results will contain all {@link * MediaItem}'s with a title that {@param query} is a substring of. */ @Implementation protected void search( @NonNull final String query, final Bundle extras, @NonNull SearchCallback callback) { if (isConnected) { final List<MediaItem> searchResults = new ArrayList<>(); for (MediaItem item : mediaItems.values()) { final String mediaTitle = item.getDescription().getTitle().toString().toLowerCase(); if (mediaTitle.contains(query.toLowerCase())) { searchResults.add(item); } } handler.post(() -> callback.onSearchResult(query, extras, searchResults)); } else { handler.post(() -> callback.onError(query, extras)); } }
public MediaControllerCompatAssert hasDuration(long duration) { isNotNull(); long actualDuration = actual.getMetadata().getLong(MediaMetadataCompat.METADATA_KEY_DURATION); assertThat(actualDuration) // .overridingErrorMessage("Expected duration <%s> but was <%s>.", duration, actualDuration) // .isEqualTo(duration); return this; }
@Before public void setUp() { final ComponentName componentName = new ComponentName("a", "b"); mediaBrowser = new MediaBrowserCompat( context, componentName, new MediaBrowserCompat.ConnectionCallback(), null); shadow = shadowOf(mediaBrowser); mediaBrowser.connect(); root = shadow.createMediaItem(null, ROOT_ID, "root_title", FLAG_BROWSABLE); shadow.setRootId(ROOT_ID); child = shadow.createMediaItem(ROOT_ID, CHILD_ID, "child_title", FLAG_PLAYABLE); }
@Test public void mediaBrowserConnection_isDisconnected() { mediaBrowser.disconnect(); assertThat(mediaBrowser.isConnected()).isFalse(); }
@Implementation protected void subscribe( @NonNull String parentId, @Nullable Bundle options, @NonNull SubscriptionCallback callback) { if (isConnected) { final MediaItem parentItem = mediaItems.get(parentId); List<MediaItem> children = mediaItemChildren.get(parentItem) == null ? Collections.emptyList() : mediaItemChildren.get(parentItem); handler.post( () -> callback.onChildrenLoaded(parentId, applyOptionsToResults(children, options))); } else { handler.post(() -> callback.onError(parentId)); } }
@Implementation protected void getItem(@NonNull final String mediaId, @NonNull final ItemCallback cb) { // mediaItem will be null when there is no MediaItem that matches the given mediaId. final MediaItem mediaItem = mediaItems.get(mediaId); if (isConnected && mediaItem != null) { handler.post(() -> cb.onItemLoaded(mediaItem)); } else { handler.post(() -> cb.onError(mediaId)); } }
@Override public void onChildrenLoaded(@NonNull String parentId, @NonNull List<MediaItem> list) { super.onChildrenLoaded(parentId, list); results = list; }
@Implementation protected void connect() { handler.post( () -> { isConnected = true; connectionCallback.onConnected(); }); }
@Override public void onSearchResult( @NonNull String query, Bundle bundle, @NonNull List<MediaItem> list) { super.onSearchResult(query, bundle, list); results = list; }
@Test public void mediaBrowser_getRootId() { String mediaBrowserRootId = mediaBrowser.getRoot(); assertThat(mediaBrowserRootId).isEqualTo(ROOT_ID); }
@Test public void mediaBrowser_subscribe() { mediaBrowser.subscribe(ROOT_ID, mediaSubscriptionCallback); assertThat(mediaSubscriptionCallback.getResults()).isEqualTo(Collections.singletonList(child)); mediaBrowser.subscribe(CHILD_ID, mediaSubscriptionCallback); assertThat(mediaSubscriptionCallback.getResults()).isEmpty(); mediaBrowser.subscribe("fake_id", mediaSubscriptionCallback); assertThat(mediaSubscriptionCallback.getResults()).isEmpty(); }
@Test public void mediaBrowserConnection_isConnected() { assertThat(mediaBrowser.isConnected()).isTrue(); }
@Test public void mediaBrowser_search() { mediaBrowser.search("root", null, mediaSearchCallback); assertThat(mediaSearchCallback.getResults()).isEqualTo(Collections.singletonList(root)); mediaBrowser.search("title", null, mediaSearchCallback); final List<MediaItem> expectedResults = Arrays.asList(root, child); assertThat(mediaSearchCallback.getResults()).isEqualTo(expectedResults); mediaBrowser.search("none", null, mediaSearchCallback); assertThat(mediaSearchCallback.getResults()).isEmpty(); }