1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.example.android.mediabrowserservice.utils; 18 19 import android.media.MediaMetadata; 20 import android.media.session.MediaSession; 21 22 import com.example.android.mediabrowserservice.model.MusicProvider; 23 24 import java.util.ArrayList; 25 import java.util.Iterator; 26 import java.util.List; 27 28 import static com.example.android.mediabrowserservice.utils.MediaIDHelper.MEDIA_ID_MUSICS_BY_GENRE; 29 30 /** 31 * Utility class to help on queue related tasks. 32 */ 33 public class QueueHelper { 34 35 private static final String TAG = "QueueHelper"; 36 getPlayingQueue(String mediaId, MusicProvider musicProvider)37 public static final List<MediaSession.QueueItem> getPlayingQueue(String mediaId, 38 MusicProvider musicProvider) { 39 40 // extract the category and unique music ID from the media ID: 41 String[] category = MediaIDHelper.extractBrowseCategoryFromMediaID(mediaId); 42 43 // This sample only supports genre category. 44 if (!category[0].equals(MEDIA_ID_MUSICS_BY_GENRE) || category.length != 2) { 45 LogHelper.e(TAG, "Could not build a playing queue for this mediaId: ", mediaId); 46 return null; 47 } 48 49 String categoryValue = category[1]; 50 LogHelper.e(TAG, "Creating playing queue for musics of genre ", categoryValue); 51 52 List<MediaSession.QueueItem> queue = convertToQueue( 53 musicProvider.getMusicsByGenre(categoryValue)); 54 55 return queue; 56 } 57 getPlayingQueueFromSearch(String query, MusicProvider musicProvider)58 public static final List<MediaSession.QueueItem> getPlayingQueueFromSearch(String query, 59 MusicProvider musicProvider) { 60 61 LogHelper.e(TAG, "Creating playing queue for musics from search ", query); 62 63 return convertToQueue(musicProvider.searchMusics(query)); 64 } 65 66 getMusicIndexOnQueue(Iterable<MediaSession.QueueItem> queue, String mediaId)67 public static final int getMusicIndexOnQueue(Iterable<MediaSession.QueueItem> queue, 68 String mediaId) { 69 int index = 0; 70 for (MediaSession.QueueItem item: queue) { 71 if (mediaId.equals(item.getDescription().getMediaId())) { 72 return index; 73 } 74 index++; 75 } 76 return -1; 77 } 78 getMusicIndexOnQueue(Iterable<MediaSession.QueueItem> queue, long queueId)79 public static final int getMusicIndexOnQueue(Iterable<MediaSession.QueueItem> queue, 80 long queueId) { 81 int index = 0; 82 for (MediaSession.QueueItem item: queue) { 83 if (queueId == item.getQueueId()) { 84 return index; 85 } 86 index++; 87 } 88 return -1; 89 } 90 convertToQueue( Iterable<MediaMetadata> tracks)91 private static final List<MediaSession.QueueItem> convertToQueue( 92 Iterable<MediaMetadata> tracks) { 93 List<MediaSession.QueueItem> queue = new ArrayList<>(); 94 int count = 0; 95 for (MediaMetadata track : tracks) { 96 // We don't expect queues to change after created, so we use the item index as the 97 // queueId. Any other number unique in the queue would work. 98 MediaSession.QueueItem item = new MediaSession.QueueItem( 99 track.getDescription(), count++); 100 queue.add(item); 101 } 102 return queue; 103 104 } 105 106 /** 107 * Create a random queue. For simplicity sake, instead of a random queue, we create a 108 * queue using the first genre, 109 * 110 * @param musicProvider 111 * @return 112 */ getRandomQueue(MusicProvider musicProvider)113 public static final List<MediaSession.QueueItem> getRandomQueue(MusicProvider musicProvider) { 114 Iterator<String> genres = musicProvider.getGenres().iterator(); 115 if (!genres.hasNext()) { 116 return new ArrayList<>(); 117 } 118 String genre = genres.next(); 119 Iterable<MediaMetadata> tracks = musicProvider.getMusicsByGenre(genre); 120 121 return convertToQueue(tracks); 122 } 123 124 125 isIndexPlayable(int index, List<MediaSession.QueueItem> queue)126 public static final boolean isIndexPlayable(int index, List<MediaSession.QueueItem> queue) { 127 return (queue != null && index >= 0 && index < queue.size()); 128 } 129 } 130