1/* 2 * Copyright 2017 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 17package android.support.mediacompat.client; 18 19import static android.support.mediacompat.testlib.MediaControllerConstants.ADD_QUEUE_ITEM; 20import static android.support.mediacompat.testlib.MediaControllerConstants 21 .ADD_QUEUE_ITEM_WITH_INDEX; 22import static android.support.mediacompat.testlib.MediaControllerConstants.ADJUST_VOLUME; 23import static android.support.mediacompat.testlib.MediaControllerConstants.FAST_FORWARD; 24import static android.support.mediacompat.testlib.MediaControllerConstants.PAUSE; 25import static android.support.mediacompat.testlib.MediaControllerConstants.PLAY; 26import static android.support.mediacompat.testlib.MediaControllerConstants.PLAY_FROM_MEDIA_ID; 27import static android.support.mediacompat.testlib.MediaControllerConstants.PLAY_FROM_SEARCH; 28import static android.support.mediacompat.testlib.MediaControllerConstants.PLAY_FROM_URI; 29import static android.support.mediacompat.testlib.MediaControllerConstants.PREPARE; 30import static android.support.mediacompat.testlib.MediaControllerConstants.PREPARE_FROM_MEDIA_ID; 31import static android.support.mediacompat.testlib.MediaControllerConstants.PREPARE_FROM_SEARCH; 32import static android.support.mediacompat.testlib.MediaControllerConstants.PREPARE_FROM_URI; 33import static android.support.mediacompat.testlib.MediaControllerConstants.REMOVE_QUEUE_ITEM; 34import static android.support.mediacompat.testlib.MediaControllerConstants.REWIND; 35import static android.support.mediacompat.testlib.MediaControllerConstants.SEEK_TO; 36import static android.support.mediacompat.testlib.MediaControllerConstants.SEND_COMMAND; 37import static android.support.mediacompat.testlib.MediaControllerConstants.SEND_CUSTOM_ACTION; 38import static android.support.mediacompat.testlib.MediaControllerConstants 39 .SEND_CUSTOM_ACTION_PARCELABLE; 40import static android.support.mediacompat.testlib.MediaControllerConstants.SET_CAPTIONING_ENABLED; 41import static android.support.mediacompat.testlib.MediaControllerConstants.SET_RATING; 42import static android.support.mediacompat.testlib.MediaControllerConstants.SET_REPEAT_MODE; 43import static android.support.mediacompat.testlib.MediaControllerConstants.SET_SHUFFLE_MODE; 44import static android.support.mediacompat.testlib.MediaControllerConstants.SET_VOLUME_TO; 45import static android.support.mediacompat.testlib.MediaControllerConstants.SKIP_TO_NEXT; 46import static android.support.mediacompat.testlib.MediaControllerConstants.SKIP_TO_PREVIOUS; 47import static android.support.mediacompat.testlib.MediaControllerConstants.SKIP_TO_QUEUE_ITEM; 48import static android.support.mediacompat.testlib.MediaControllerConstants.STOP; 49import static android.support.mediacompat.testlib.util.IntentUtil 50 .ACTION_CALL_MEDIA_CONTROLLER_METHOD; 51import static android.support.mediacompat.testlib.util.IntentUtil 52 .ACTION_CALL_TRANSPORT_CONTROLS_METHOD; 53import static android.support.mediacompat.testlib.util.IntentUtil.KEY_ARGUMENT; 54import static android.support.mediacompat.testlib.util.IntentUtil.KEY_METHOD_ID; 55import static android.support.mediacompat.testlib.util.IntentUtil.KEY_SESSION_TOKEN; 56 57import android.content.BroadcastReceiver; 58import android.content.Context; 59import android.content.Intent; 60import android.net.Uri; 61import android.os.Bundle; 62import android.os.RemoteException; 63import android.os.ResultReceiver; 64import android.support.v4.media.MediaDescriptionCompat; 65import android.support.v4.media.RatingCompat; 66import android.support.v4.media.session.MediaControllerCompat; 67import android.support.v4.media.session.MediaControllerCompat.TransportControls; 68import android.support.v4.media.session.MediaSessionCompat; 69import android.support.v4.media.session.PlaybackStateCompat; 70 71public class ClientBroadcastReceiver extends BroadcastReceiver { 72 73 @Override 74 public void onReceive(Context context, Intent intent) { 75 Bundle extras = intent.getExtras(); 76 MediaControllerCompat controller; 77 try { 78 controller = new MediaControllerCompat(context, 79 (MediaSessionCompat.Token) extras.getParcelable(KEY_SESSION_TOKEN)); 80 } catch (RemoteException ex) { 81 // Do nothing. 82 return; 83 } 84 int method = extras.getInt(KEY_METHOD_ID, 0); 85 86 if (ACTION_CALL_MEDIA_CONTROLLER_METHOD.equals(intent.getAction()) && extras != null) { 87 Bundle arguments; 88 switch (method) { 89 case SEND_COMMAND: 90 arguments = extras.getBundle(KEY_ARGUMENT); 91 controller.sendCommand( 92 arguments.getString("command"), 93 arguments.getBundle("extras"), 94 new ResultReceiver(null)); 95 break; 96 case ADD_QUEUE_ITEM: 97 controller.addQueueItem( 98 (MediaDescriptionCompat) extras.getParcelable(KEY_ARGUMENT)); 99 break; 100 case ADD_QUEUE_ITEM_WITH_INDEX: 101 arguments = extras.getBundle(KEY_ARGUMENT); 102 controller.addQueueItem( 103 (MediaDescriptionCompat) arguments.getParcelable("description"), 104 arguments.getInt("index")); 105 break; 106 case REMOVE_QUEUE_ITEM: 107 controller.removeQueueItem( 108 (MediaDescriptionCompat) extras.getParcelable(KEY_ARGUMENT)); 109 break; 110 case SET_VOLUME_TO: 111 controller.setVolumeTo(extras.getInt(KEY_ARGUMENT), 0); 112 break; 113 case ADJUST_VOLUME: 114 controller.adjustVolume(extras.getInt(KEY_ARGUMENT), 0); 115 break; 116 } 117 } else if (ACTION_CALL_TRANSPORT_CONTROLS_METHOD.equals(intent.getAction()) 118 && extras != null) { 119 TransportControls controls = controller.getTransportControls(); 120 Bundle arguments; 121 switch (method) { 122 case PLAY: 123 controls.play(); 124 break; 125 case PAUSE: 126 controls.pause(); 127 break; 128 case STOP: 129 controls.stop(); 130 break; 131 case FAST_FORWARD: 132 controls.fastForward(); 133 break; 134 case REWIND: 135 controls.rewind(); 136 break; 137 case SKIP_TO_PREVIOUS: 138 controls.skipToPrevious(); 139 break; 140 case SKIP_TO_NEXT: 141 controls.skipToNext(); 142 break; 143 case SEEK_TO: 144 controls.seekTo(extras.getLong(KEY_ARGUMENT)); 145 break; 146 case SET_RATING: 147 controls.setRating((RatingCompat) extras.getParcelable(KEY_ARGUMENT)); 148 break; 149 case PLAY_FROM_MEDIA_ID: 150 arguments = extras.getBundle(KEY_ARGUMENT); 151 controls.playFromMediaId( 152 arguments.getString("mediaId"), 153 arguments.getBundle("extras")); 154 break; 155 case PLAY_FROM_SEARCH: 156 arguments = extras.getBundle(KEY_ARGUMENT); 157 controls.playFromSearch( 158 arguments.getString("query"), 159 arguments.getBundle("extras")); 160 break; 161 case PLAY_FROM_URI: 162 arguments = extras.getBundle(KEY_ARGUMENT); 163 controls.playFromUri( 164 (Uri) arguments.getParcelable("uri"), 165 arguments.getBundle("extras")); 166 break; 167 case SEND_CUSTOM_ACTION: 168 arguments = extras.getBundle(KEY_ARGUMENT); 169 controls.sendCustomAction( 170 arguments.getString("action"), 171 arguments.getBundle("extras")); 172 break; 173 case SEND_CUSTOM_ACTION_PARCELABLE: 174 arguments = extras.getBundle(KEY_ARGUMENT); 175 controls.sendCustomAction( 176 (PlaybackStateCompat.CustomAction) 177 arguments.getParcelable("action"), 178 arguments.getBundle("extras")); 179 break; 180 case SKIP_TO_QUEUE_ITEM: 181 controls.skipToQueueItem(extras.getLong(KEY_ARGUMENT)); 182 break; 183 case PREPARE: 184 controls.prepare(); 185 break; 186 case PREPARE_FROM_MEDIA_ID: 187 arguments = extras.getBundle(KEY_ARGUMENT); 188 controls.prepareFromMediaId( 189 arguments.getString("mediaId"), 190 arguments.getBundle("extras")); 191 break; 192 case PREPARE_FROM_SEARCH: 193 arguments = extras.getBundle(KEY_ARGUMENT); 194 controls.prepareFromSearch( 195 arguments.getString("query"), 196 arguments.getBundle("extras")); 197 break; 198 case PREPARE_FROM_URI: 199 arguments = extras.getBundle(KEY_ARGUMENT); 200 controls.prepareFromUri( 201 (Uri) arguments.getParcelable("uri"), 202 arguments.getBundle("extras")); 203 break; 204 case SET_CAPTIONING_ENABLED: 205 controls.setCaptioningEnabled(extras.getBoolean(KEY_ARGUMENT)); 206 break; 207 case SET_REPEAT_MODE: 208 controls.setRepeatMode(extras.getInt(KEY_ARGUMENT)); 209 break; 210 case SET_SHUFFLE_MODE: 211 controls.setShuffleMode(extras.getInt(KEY_ARGUMENT)); 212 break; 213 } 214 } 215 } 216} 217