124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown/* 2ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikas * Copyright 2018 The Android Open Source Project 324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * 424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * you may not use this file except in compliance with the License. 624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * You may obtain a copy of the License at 724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * 824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * 1024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * Unless required by applicable law or agreed to in writing, software 1124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 1224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * See the License for the specific language governing permissions and 1424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown * limitations under the License. 1524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown */ 1624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 1724919ee8c30d91ec056cae6c4f578d7007cbe968Aurimas Liutikaspackage android.support.v4.media.session; 1824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 19583beae8a1d75c7c821b65c8adc8812928424eecIan Lakeimport android.app.Activity; 20aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErikimport android.app.PendingIntent; 215c41750574ba65da432b69f89cd32dc356281005RoboErikimport android.content.Context; 221435afe32073dee10e721dfb6122ce6a194a6412RoboErikimport android.media.AudioAttributes; 231435afe32073dee10e721dfb6122ce6a194a6412RoboErikimport android.media.AudioManager; 2424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.media.MediaMetadata; 2524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.media.Rating; 2624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.media.session.MediaController; 278ea3b7e9bae080d5ab65a150e952c87db70cc3a3Jeff Brownimport android.media.session.MediaSession; 2824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.media.session.PlaybackState; 2924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.Bundle; 3024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.Handler; 3124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.os.ResultReceiver; 3224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownimport android.view.KeyEvent; 3324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 3489febf83e2bd3720923474006bcdf6c91a3b88f2Aurimas Liutikasimport androidx.annotation.RequiresApi; 3589febf83e2bd3720923474006bcdf6c91a3b88f2Aurimas Liutikas 36aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErikimport java.util.ArrayList; 37aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErikimport java.util.List; 38aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik 398f886fe8c7e23fe6ccb8734167c960c2ed3429c3Alan Viverette@RequiresApi(21) 4024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brownclass MediaControllerCompatApi21 { 415c41750574ba65da432b69f89cd32dc356281005RoboErik public static Object fromToken(Context context, Object sessionToken) { 425c41750574ba65da432b69f89cd32dc356281005RoboErik return new MediaController(context, (MediaSession.Token) sessionToken); 4324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 4424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 4524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static Object createCallback(Callback callback) { 4624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown return new CallbackProxy<Callback>(callback); 4724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 4824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 4916ac83bebda2a19930b9d692789f3b507c49951bRoboErik public static void registerCallback(Object controllerObj, Object callbackObj, Handler handler) { 5016ac83bebda2a19930b9d692789f3b507c49951bRoboErik ((MediaController) controllerObj).registerCallback( 5124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown (MediaController.Callback)callbackObj, handler); 5224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 5324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 5416ac83bebda2a19930b9d692789f3b507c49951bRoboErik public static void unregisterCallback(Object controllerObj, Object callbackObj) { 5516ac83bebda2a19930b9d692789f3b507c49951bRoboErik ((MediaController) controllerObj) 5616ac83bebda2a19930b9d692789f3b507c49951bRoboErik .unregisterCallback((MediaController.Callback) callbackObj); 5724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 5824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 59583beae8a1d75c7c821b65c8adc8812928424eecIan Lake public static void setMediaController(Activity activity, Object controllerObj) { 60583beae8a1d75c7c821b65c8adc8812928424eecIan Lake activity.setMediaController((MediaController) controllerObj); 61583beae8a1d75c7c821b65c8adc8812928424eecIan Lake } 62583beae8a1d75c7c821b65c8adc8812928424eecIan Lake 63583beae8a1d75c7c821b65c8adc8812928424eecIan Lake public static Object getMediaController(Activity activity) { 64583beae8a1d75c7c821b65c8adc8812928424eecIan Lake return activity.getMediaController(); 65583beae8a1d75c7c821b65c8adc8812928424eecIan Lake } 66583beae8a1d75c7c821b65c8adc8812928424eecIan Lake 67583beae8a1d75c7c821b65c8adc8812928424eecIan Lake public static Object getSessionToken(Object controllerObj) { 68583beae8a1d75c7c821b65c8adc8812928424eecIan Lake return ((MediaController) controllerObj).getSessionToken(); 69583beae8a1d75c7c821b65c8adc8812928424eecIan Lake } 70583beae8a1d75c7c821b65c8adc8812928424eecIan Lake 7124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static Object getTransportControls(Object controllerObj) { 7224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown return ((MediaController)controllerObj).getTransportControls(); 7324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 7424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 7524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static Object getPlaybackState(Object controllerObj) { 7624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown return ((MediaController)controllerObj).getPlaybackState(); 7724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 7824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 7924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static Object getMetadata(Object controllerObj) { 8024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown return ((MediaController)controllerObj).getMetadata(); 8124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 8224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 83aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik public static List<Object> getQueue(Object controllerObj) { 84aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik List<MediaSession.QueueItem> queue = ((MediaController) controllerObj).getQueue(); 85aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik if (queue == null) { 86aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik return null; 87aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik } 88aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik List<Object> queueObjs = new ArrayList<Object>(queue); 89aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik return queueObjs; 90aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik } 91aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik 92aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik public static CharSequence getQueueTitle(Object controllerObj) { 93aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik return ((MediaController) controllerObj).getQueueTitle(); 94aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik } 95aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik 96aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik public static Bundle getExtras(Object controllerObj) { 97aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik return ((MediaController) controllerObj).getExtras(); 98aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik } 99aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik 10024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static int getRatingType(Object controllerObj) { 101aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik return ((MediaController) controllerObj).getRatingType(); 102aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik } 103aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik 104aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik public static long getFlags(Object controllerObj) { 105aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik return ((MediaController) controllerObj).getFlags(); 10624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 10724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 108312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik public static Object getPlaybackInfo(Object controllerObj) { 109aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik return ((MediaController) controllerObj).getPlaybackInfo(); 110aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik } 111aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik 112aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik public static PendingIntent getSessionActivity(Object controllerObj) { 113aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik return ((MediaController) controllerObj).getSessionActivity(); 11424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 11524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 11624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static boolean dispatchMediaButtonEvent(Object controllerObj, KeyEvent event) { 117aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik return ((MediaController) controllerObj).dispatchMediaButtonEvent(event); 118aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik } 119aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik 120aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik public static void setVolumeTo(Object controllerObj, int value, int flags) { 121aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik ((MediaController) controllerObj).setVolumeTo(value, flags); 122aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik } 123aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik 124aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik public static void adjustVolume(Object controllerObj, int direction, int flags) { 125aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik ((MediaController) controllerObj).adjustVolume(direction, flags); 12624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 12724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 128b530c89bba371d2d575f10480b2e90914b0d3f3fGabriel Peal public static void sendCommand(Object controllerObj, 12924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown String command, Bundle params, ResultReceiver cb) { 130aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik ((MediaController) controllerObj).sendCommand(command, params, cb); 131aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik } 132aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik 133aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik public static String getPackageName(Object controllerObj) { 134aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik return ((MediaController) controllerObj).getPackageName(); 13524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 13624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 13724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static class TransportControls { 13824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static void play(Object controlsObj) { 13924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown ((MediaController.TransportControls)controlsObj).play(); 14024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 14124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 14224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static void pause(Object controlsObj) { 14324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown ((MediaController.TransportControls)controlsObj).pause(); 14424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 14524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 14624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static void stop(Object controlsObj) { 14724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown ((MediaController.TransportControls)controlsObj).stop(); 14824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 14924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 15024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static void seekTo(Object controlsObj, long pos) { 15124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown ((MediaController.TransportControls)controlsObj).seekTo(pos); 15224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 15324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 15424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static void fastForward(Object controlsObj) { 15524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown ((MediaController.TransportControls)controlsObj).fastForward(); 15624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 15724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 15824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static void rewind(Object controlsObj) { 15924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown ((MediaController.TransportControls)controlsObj).rewind(); 16024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 16124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 16224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static void skipToNext(Object controlsObj) { 16324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown ((MediaController.TransportControls)controlsObj).skipToNext(); 16424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 16524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 16624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static void skipToPrevious(Object controlsObj) { 16724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown ((MediaController.TransportControls)controlsObj).skipToPrevious(); 16824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 16924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 17024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static void setRating(Object controlsObj, Object ratingObj) { 17124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown ((MediaController.TransportControls)controlsObj).setRating((Rating)ratingObj); 17224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 173aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik 174aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik public static void playFromMediaId(Object controlsObj, String mediaId, Bundle extras) { 175aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik ((MediaController.TransportControls) controlsObj).playFromMediaId(mediaId, extras); 176aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik } 177aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik 178aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik public static void playFromSearch(Object controlsObj, String query, Bundle extras) { 179aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik ((MediaController.TransportControls) controlsObj).playFromSearch(query, extras); 180aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik } 181aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik 182aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik public static void skipToQueueItem(Object controlsObj, long id) { 183aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik ((MediaController.TransportControls) controlsObj).skipToQueueItem(id); 184aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik } 185aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik 186aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik public static void sendCustomAction(Object controlsObj, String action, Bundle args) { 187aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik ((MediaController.TransportControls) controlsObj).sendCustomAction(action, args); 188aeb95a772d4365008145407ed52dfbaa61d3c4acRoboErik } 1890f4ca634bbc43ddff900c35f7d2a43b55d8c830dJake Wharton 1900f4ca634bbc43ddff900c35f7d2a43b55d8c830dJake Wharton private TransportControls() { 1910f4ca634bbc43ddff900c35f7d2a43b55d8c830dJake Wharton } 19224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 19324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 194312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik public static class PlaybackInfo { 195312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik public static int getPlaybackType(Object volumeInfoObj) { 196312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik return ((MediaController.PlaybackInfo)volumeInfoObj).getPlaybackType(); 19724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 19824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 1991435afe32073dee10e721dfb6122ce6a194a6412RoboErik public static AudioAttributes getAudioAttributes(Object volumeInfoObj) { 200312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik return ((MediaController.PlaybackInfo) volumeInfoObj).getAudioAttributes(); 2011435afe32073dee10e721dfb6122ce6a194a6412RoboErik } 2021435afe32073dee10e721dfb6122ce6a194a6412RoboErik 2031435afe32073dee10e721dfb6122ce6a194a6412RoboErik public static int getLegacyAudioStream(Object volumeInfoObj) { 2041435afe32073dee10e721dfb6122ce6a194a6412RoboErik AudioAttributes attrs = getAudioAttributes(volumeInfoObj); 2051435afe32073dee10e721dfb6122ce6a194a6412RoboErik return toLegacyStreamType(attrs); 20624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 20724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 20824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static int getVolumeControl(Object volumeInfoObj) { 209312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik return ((MediaController.PlaybackInfo)volumeInfoObj).getVolumeControl(); 21024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 21124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 21224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static int getMaxVolume(Object volumeInfoObj) { 213312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik return ((MediaController.PlaybackInfo)volumeInfoObj).getMaxVolume(); 21424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 21524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 21624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static int getCurrentVolume(Object volumeInfoObj) { 217312f13dea7b4a9229dff784c6e94b0ec0c722b74RoboErik return ((MediaController.PlaybackInfo)volumeInfoObj).getCurrentVolume(); 21824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 2191435afe32073dee10e721dfb6122ce6a194a6412RoboErik 2201435afe32073dee10e721dfb6122ce6a194a6412RoboErik // This is copied from AudioAttributes.toLegacyStreamType. TODO This 2211435afe32073dee10e721dfb6122ce6a194a6412RoboErik // either needs to be kept in sync with that one or toLegacyStreamType 2221435afe32073dee10e721dfb6122ce6a194a6412RoboErik // needs to be made public so it can be used by the support lib. 2231435afe32073dee10e721dfb6122ce6a194a6412RoboErik private static final int FLAG_SCO = 0x1 << 2; 2241435afe32073dee10e721dfb6122ce6a194a6412RoboErik private static final int STREAM_BLUETOOTH_SCO = 6; 2251435afe32073dee10e721dfb6122ce6a194a6412RoboErik private static final int STREAM_SYSTEM_ENFORCED = 7; 2261435afe32073dee10e721dfb6122ce6a194a6412RoboErik private static int toLegacyStreamType(AudioAttributes aa) { 2271435afe32073dee10e721dfb6122ce6a194a6412RoboErik // flags to stream type mapping 2281435afe32073dee10e721dfb6122ce6a194a6412RoboErik if ((aa.getFlags() & AudioAttributes.FLAG_AUDIBILITY_ENFORCED) 2291435afe32073dee10e721dfb6122ce6a194a6412RoboErik == AudioAttributes.FLAG_AUDIBILITY_ENFORCED) { 2301435afe32073dee10e721dfb6122ce6a194a6412RoboErik return STREAM_SYSTEM_ENFORCED; 2311435afe32073dee10e721dfb6122ce6a194a6412RoboErik } 2321435afe32073dee10e721dfb6122ce6a194a6412RoboErik if ((aa.getFlags() & FLAG_SCO) == FLAG_SCO) { 2331435afe32073dee10e721dfb6122ce6a194a6412RoboErik return STREAM_BLUETOOTH_SCO; 2341435afe32073dee10e721dfb6122ce6a194a6412RoboErik } 2351435afe32073dee10e721dfb6122ce6a194a6412RoboErik 2361435afe32073dee10e721dfb6122ce6a194a6412RoboErik // usage to stream type mapping 2371435afe32073dee10e721dfb6122ce6a194a6412RoboErik switch (aa.getUsage()) { 2381435afe32073dee10e721dfb6122ce6a194a6412RoboErik case AudioAttributes.USAGE_MEDIA: 2391435afe32073dee10e721dfb6122ce6a194a6412RoboErik case AudioAttributes.USAGE_GAME: 2401435afe32073dee10e721dfb6122ce6a194a6412RoboErik case AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY: 2411435afe32073dee10e721dfb6122ce6a194a6412RoboErik case AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE: 2421435afe32073dee10e721dfb6122ce6a194a6412RoboErik return AudioManager.STREAM_MUSIC; 2431435afe32073dee10e721dfb6122ce6a194a6412RoboErik case AudioAttributes.USAGE_ASSISTANCE_SONIFICATION: 2441435afe32073dee10e721dfb6122ce6a194a6412RoboErik return AudioManager.STREAM_SYSTEM; 2451435afe32073dee10e721dfb6122ce6a194a6412RoboErik case AudioAttributes.USAGE_VOICE_COMMUNICATION: 2461435afe32073dee10e721dfb6122ce6a194a6412RoboErik return AudioManager.STREAM_VOICE_CALL; 2471435afe32073dee10e721dfb6122ce6a194a6412RoboErik case AudioAttributes.USAGE_VOICE_COMMUNICATION_SIGNALLING: 2481435afe32073dee10e721dfb6122ce6a194a6412RoboErik return AudioManager.STREAM_DTMF; 2491435afe32073dee10e721dfb6122ce6a194a6412RoboErik case AudioAttributes.USAGE_ALARM: 2501435afe32073dee10e721dfb6122ce6a194a6412RoboErik return AudioManager.STREAM_ALARM; 2511435afe32073dee10e721dfb6122ce6a194a6412RoboErik case AudioAttributes.USAGE_NOTIFICATION_RINGTONE: 2521435afe32073dee10e721dfb6122ce6a194a6412RoboErik return AudioManager.STREAM_RING; 2531435afe32073dee10e721dfb6122ce6a194a6412RoboErik case AudioAttributes.USAGE_NOTIFICATION: 2541435afe32073dee10e721dfb6122ce6a194a6412RoboErik case AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_REQUEST: 2551435afe32073dee10e721dfb6122ce6a194a6412RoboErik case AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_INSTANT: 2561435afe32073dee10e721dfb6122ce6a194a6412RoboErik case AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_DELAYED: 2571435afe32073dee10e721dfb6122ce6a194a6412RoboErik case AudioAttributes.USAGE_NOTIFICATION_EVENT: 2581435afe32073dee10e721dfb6122ce6a194a6412RoboErik return AudioManager.STREAM_NOTIFICATION; 2591435afe32073dee10e721dfb6122ce6a194a6412RoboErik case AudioAttributes.USAGE_UNKNOWN: 2601435afe32073dee10e721dfb6122ce6a194a6412RoboErik default: 2611435afe32073dee10e721dfb6122ce6a194a6412RoboErik return AudioManager.STREAM_MUSIC; 2621435afe32073dee10e721dfb6122ce6a194a6412RoboErik } 2631435afe32073dee10e721dfb6122ce6a194a6412RoboErik } 2640f4ca634bbc43ddff900c35f7d2a43b55d8c830dJake Wharton 2650f4ca634bbc43ddff900c35f7d2a43b55d8c830dJake Wharton private PlaybackInfo() { 2660f4ca634bbc43ddff900c35f7d2a43b55d8c830dJake Wharton } 26724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 26824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 26924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public static interface Callback { 27023138c4b9be07abdab0cfdde2c62186359c9e7faRoboErik public void onSessionDestroyed(); 27124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public void onSessionEvent(String event, Bundle extras); 27224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public void onPlaybackStateChanged(Object stateObj); 27324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public void onMetadataChanged(Object metadataObj); 274203a34227e8fa3bd16721fb7ff450fb6feba7c50Hyundo Moon public void onQueueChanged(List<?> queue); 2759d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim public void onQueueTitleChanged(CharSequence title); 2769d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim public void onExtrasChanged(Bundle extras); 2779d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim public void onAudioInfoChanged(int type, int stream, int control, int max, int current); 27824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 27924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 28024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown static class CallbackProxy<T extends Callback> extends MediaController.Callback { 28124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown protected final T mCallback; 28224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 28324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public CallbackProxy(T callback) { 28424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown mCallback = callback; 28524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 28624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 28724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown @Override 28823138c4b9be07abdab0cfdde2c62186359c9e7faRoboErik public void onSessionDestroyed() { 28923138c4b9be07abdab0cfdde2c62186359c9e7faRoboErik mCallback.onSessionDestroyed(); 29023138c4b9be07abdab0cfdde2c62186359c9e7faRoboErik } 29123138c4b9be07abdab0cfdde2c62186359c9e7faRoboErik 29223138c4b9be07abdab0cfdde2c62186359c9e7faRoboErik @Override 29324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public void onSessionEvent(String event, Bundle extras) { 29424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown mCallback.onSessionEvent(event, extras); 29524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 29624fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 29724fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown @Override 29824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public void onPlaybackStateChanged(PlaybackState state) { 29924fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown mCallback.onPlaybackStateChanged(state); 30024fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 30124fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown 30224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown @Override 30324fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown public void onMetadataChanged(MediaMetadata metadata) { 30424fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown mCallback.onMetadataChanged(metadata); 30524fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 3069d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim 3079d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim @Override 3089d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim public void onQueueChanged(List<MediaSession.QueueItem> queue) { 309203a34227e8fa3bd16721fb7ff450fb6feba7c50Hyundo Moon mCallback.onQueueChanged(queue); 3109d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim } 3119d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim 3129d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim @Override 3139d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim public void onQueueTitleChanged(CharSequence title) { 3149d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim mCallback.onQueueTitleChanged(title); 3159d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim } 3169d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim 3179d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim @Override 3189d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim public void onExtrasChanged(Bundle extras) { 3199d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim mCallback.onExtrasChanged(extras); 3209d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim } 3219d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim 3229d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim @Override 3239d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim public void onAudioInfoChanged(MediaController.PlaybackInfo info){ 3249d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim mCallback.onAudioInfoChanged(info.getPlaybackType(), 3259d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim PlaybackInfo.getLegacyAudioStream(info), info.getVolumeControl(), 3269d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim info.getMaxVolume(), info.getCurrentVolume()); 3279d18baac7c99ec5c8ca88cfca10ad21e4106e2f1Sungsoo Lim } 32824fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown } 3290f4ca634bbc43ddff900c35f7d2a43b55d8c830dJake Wharton 3300f4ca634bbc43ddff900c35f7d2a43b55d8c830dJake Wharton private MediaControllerCompatApi21() { 3310f4ca634bbc43ddff900c35f7d2a43b55d8c830dJake Wharton } 33224fa6c0dd42df057729e1a258388183f94da7f82Jeff Brown} 333