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