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 17 package android.support.mediacompat.service; 18 19 20 import static android.support.mediacompat.testlib.MediaBrowserConstants.CUSTOM_ACTION_SEND_ERROR; 21 import static android.support.mediacompat.testlib.MediaBrowserConstants 22 .CUSTOM_ACTION_SEND_PROGRESS_UPDATE; 23 import static android.support.mediacompat.testlib.MediaBrowserConstants.CUSTOM_ACTION_SEND_RESULT; 24 import static android.support.mediacompat.testlib.MediaBrowserConstants.NOTIFY_CHILDREN_CHANGED; 25 import static android.support.mediacompat.testlib.MediaBrowserConstants.SEND_DELAYED_ITEM_LOADED; 26 import static android.support.mediacompat.testlib.MediaBrowserConstants 27 .SEND_DELAYED_NOTIFY_CHILDREN_CHANGED; 28 import static android.support.mediacompat.testlib.MediaBrowserConstants.SET_SESSION_TOKEN; 29 import static android.support.mediacompat.testlib.MediaSessionConstants.RELEASE; 30 import static android.support.mediacompat.testlib.MediaSessionConstants.SEND_SESSION_EVENT; 31 import static android.support.mediacompat.testlib.MediaSessionConstants.SET_ACTIVE; 32 import static android.support.mediacompat.testlib.MediaSessionConstants.SET_CAPTIONING_ENABLED; 33 import static android.support.mediacompat.testlib.MediaSessionConstants.SET_EXTRAS; 34 import static android.support.mediacompat.testlib.MediaSessionConstants.SET_FLAGS; 35 import static android.support.mediacompat.testlib.MediaSessionConstants.SET_METADATA; 36 import static android.support.mediacompat.testlib.MediaSessionConstants.SET_PLAYBACK_STATE; 37 import static android.support.mediacompat.testlib.MediaSessionConstants.SET_PLAYBACK_TO_LOCAL; 38 import static android.support.mediacompat.testlib.MediaSessionConstants.SET_PLAYBACK_TO_REMOTE; 39 import static android.support.mediacompat.testlib.MediaSessionConstants.SET_QUEUE; 40 import static android.support.mediacompat.testlib.MediaSessionConstants.SET_QUEUE_TITLE; 41 import static android.support.mediacompat.testlib.MediaSessionConstants.SET_RATING_TYPE; 42 import static android.support.mediacompat.testlib.MediaSessionConstants.SET_REPEAT_MODE; 43 import static android.support.mediacompat.testlib.MediaSessionConstants.SET_SESSION_ACTIVITY; 44 import static android.support.mediacompat.testlib.MediaSessionConstants.SET_SHUFFLE_MODE; 45 import static android.support.mediacompat.testlib.util.IntentUtil 46 .ACTION_CALL_MEDIA_BROWSER_SERVICE_METHOD; 47 import static android.support.mediacompat.testlib.util.IntentUtil.ACTION_CALL_MEDIA_SESSION_METHOD; 48 import static android.support.mediacompat.testlib.util.IntentUtil.KEY_ARGUMENT; 49 import static android.support.mediacompat.testlib.util.IntentUtil.KEY_METHOD_ID; 50 51 import android.app.PendingIntent; 52 import android.content.BroadcastReceiver; 53 import android.content.Context; 54 import android.content.Intent; 55 import android.os.Bundle; 56 import android.support.v4.media.MediaMetadataCompat; 57 import android.support.v4.media.RatingCompat; 58 import android.support.v4.media.session.MediaSessionCompat; 59 import android.support.v4.media.session.MediaSessionCompat.QueueItem; 60 import android.support.v4.media.session.ParcelableVolumeInfo; 61 import android.support.v4.media.session.PlaybackStateCompat; 62 63 import androidx.media.VolumeProviderCompat; 64 65 import java.util.List; 66 67 public class ServiceBroadcastReceiver extends BroadcastReceiver { 68 69 @Override 70 public void onReceive(Context context, Intent intent) { 71 Bundle extras = intent.getExtras(); 72 if (ACTION_CALL_MEDIA_BROWSER_SERVICE_METHOD.equals(intent.getAction()) && extras != null) { 73 StubMediaBrowserServiceCompat service = StubMediaBrowserServiceCompat.sInstance; 74 int method = extras.getInt(KEY_METHOD_ID, 0); 75 76 switch (method) { 77 case NOTIFY_CHILDREN_CHANGED: 78 service.notifyChildrenChanged(extras.getString(KEY_ARGUMENT)); 79 break; 80 case SEND_DELAYED_NOTIFY_CHILDREN_CHANGED: 81 service.sendDelayedNotifyChildrenChanged(); 82 break; 83 case SEND_DELAYED_ITEM_LOADED: 84 service.sendDelayedItemLoaded(); 85 break; 86 case CUSTOM_ACTION_SEND_PROGRESS_UPDATE: 87 service.mCustomActionResult.sendProgressUpdate(extras.getBundle(KEY_ARGUMENT)); 88 break; 89 case CUSTOM_ACTION_SEND_ERROR: 90 service.mCustomActionResult.sendError(extras.getBundle(KEY_ARGUMENT)); 91 break; 92 case CUSTOM_ACTION_SEND_RESULT: 93 service.mCustomActionResult.sendResult(extras.getBundle(KEY_ARGUMENT)); 94 break; 95 case SET_SESSION_TOKEN: 96 StubMediaBrowserServiceCompatWithDelayedMediaSession.sInstance 97 .callSetSessionToken(); 98 break; 99 } 100 } else if (ACTION_CALL_MEDIA_SESSION_METHOD.equals(intent.getAction()) && extras != null) { 101 MediaSessionCompat session = StubMediaBrowserServiceCompat.sSession; 102 int method = extras.getInt(KEY_METHOD_ID, 0); 103 104 switch (method) { 105 case SET_EXTRAS: 106 session.setExtras(extras.getBundle(KEY_ARGUMENT)); 107 break; 108 case SET_FLAGS: 109 session.setFlags(extras.getInt(KEY_ARGUMENT)); 110 break; 111 case SET_METADATA: 112 session.setMetadata((MediaMetadataCompat) extras.getParcelable(KEY_ARGUMENT)); 113 break; 114 case SET_PLAYBACK_STATE: 115 session.setPlaybackState( 116 (PlaybackStateCompat) extras.getParcelable(KEY_ARGUMENT)); 117 break; 118 case SET_QUEUE: 119 List<QueueItem> items = extras.getParcelableArrayList(KEY_ARGUMENT); 120 session.setQueue(items); 121 break; 122 case SET_QUEUE_TITLE: 123 session.setQueueTitle(extras.getCharSequence(KEY_ARGUMENT)); 124 break; 125 case SET_SESSION_ACTIVITY: 126 session.setSessionActivity((PendingIntent) extras.getParcelable(KEY_ARGUMENT)); 127 break; 128 case SET_CAPTIONING_ENABLED: 129 session.setCaptioningEnabled(extras.getBoolean(KEY_ARGUMENT)); 130 break; 131 case SET_REPEAT_MODE: 132 session.setRepeatMode(extras.getInt(KEY_ARGUMENT)); 133 break; 134 case SET_SHUFFLE_MODE: 135 session.setShuffleMode(extras.getInt(KEY_ARGUMENT)); 136 break; 137 case SEND_SESSION_EVENT: 138 Bundle arguments = extras.getBundle(KEY_ARGUMENT); 139 session.sendSessionEvent( 140 arguments.getString("event"), arguments.getBundle("extras")); 141 break; 142 case SET_ACTIVE: 143 session.setActive(extras.getBoolean(KEY_ARGUMENT)); 144 break; 145 case RELEASE: 146 session.release(); 147 break; 148 case SET_PLAYBACK_TO_LOCAL: 149 session.setPlaybackToLocal(extras.getInt(KEY_ARGUMENT)); 150 break; 151 case SET_PLAYBACK_TO_REMOTE: 152 ParcelableVolumeInfo volumeInfo = extras.getParcelable(KEY_ARGUMENT); 153 session.setPlaybackToRemote(new VolumeProviderCompat( 154 volumeInfo.controlType, 155 volumeInfo.maxVolume, 156 volumeInfo.currentVolume) {}); 157 break; 158 case SET_RATING_TYPE: 159 session.setRatingType(RatingCompat.RATING_5_STARS); 160 break; 161 } 162 } 163 } 164 } 165