Home | History | Annotate | Download | only in session
      1 /*
      2  * Copyright 2018 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.v4.media.session;
     18 
     19 import android.app.Activity;
     20 import android.app.PendingIntent;
     21 import android.content.Context;
     22 import android.media.AudioAttributes;
     23 import android.media.AudioManager;
     24 import android.media.MediaMetadata;
     25 import android.media.Rating;
     26 import android.media.session.MediaController;
     27 import android.media.session.MediaSession;
     28 import android.media.session.PlaybackState;
     29 import android.os.Bundle;
     30 import android.os.Handler;
     31 import android.os.ResultReceiver;
     32 import android.view.KeyEvent;
     33 
     34 import androidx.annotation.RequiresApi;
     35 
     36 import java.util.ArrayList;
     37 import java.util.List;
     38 
     39 @RequiresApi(21)
     40 class MediaControllerCompatApi21 {
     41     public static Object fromToken(Context context, Object sessionToken) {
     42         return new MediaController(context, (MediaSession.Token) sessionToken);
     43     }
     44 
     45     public static Object createCallback(Callback callback) {
     46         return new CallbackProxy<Callback>(callback);
     47     }
     48 
     49     public static void registerCallback(Object controllerObj, Object callbackObj, Handler handler) {
     50         ((MediaController) controllerObj).registerCallback(
     51                 (MediaController.Callback)callbackObj, handler);
     52     }
     53 
     54     public static void unregisterCallback(Object controllerObj, Object callbackObj) {
     55         ((MediaController) controllerObj)
     56                 .unregisterCallback((MediaController.Callback) callbackObj);
     57     }
     58 
     59     public static void setMediaController(Activity activity, Object controllerObj) {
     60         activity.setMediaController((MediaController) controllerObj);
     61     }
     62 
     63     public static Object getMediaController(Activity activity) {
     64         return activity.getMediaController();
     65     }
     66 
     67     public static Object getSessionToken(Object controllerObj) {
     68         return ((MediaController) controllerObj).getSessionToken();
     69     }
     70 
     71     public static Object getTransportControls(Object controllerObj) {
     72         return ((MediaController)controllerObj).getTransportControls();
     73     }
     74 
     75     public static Object getPlaybackState(Object controllerObj) {
     76         return ((MediaController)controllerObj).getPlaybackState();
     77     }
     78 
     79     public static Object getMetadata(Object controllerObj) {
     80         return ((MediaController)controllerObj).getMetadata();
     81     }
     82 
     83     public static List<Object> getQueue(Object controllerObj) {
     84         List<MediaSession.QueueItem> queue = ((MediaController) controllerObj).getQueue();
     85         if (queue == null) {
     86             return null;
     87         }
     88         List<Object> queueObjs = new ArrayList<Object>(queue);
     89         return queueObjs;
     90     }
     91 
     92     public static CharSequence getQueueTitle(Object controllerObj) {
     93         return ((MediaController) controllerObj).getQueueTitle();
     94     }
     95 
     96     public static Bundle getExtras(Object controllerObj) {
     97         return ((MediaController) controllerObj).getExtras();
     98     }
     99 
    100     public static int getRatingType(Object controllerObj) {
    101         return ((MediaController) controllerObj).getRatingType();
    102     }
    103 
    104     public static long getFlags(Object controllerObj) {
    105         return ((MediaController) controllerObj).getFlags();
    106     }
    107 
    108     public static Object getPlaybackInfo(Object controllerObj) {
    109         return ((MediaController) controllerObj).getPlaybackInfo();
    110     }
    111 
    112     public static PendingIntent getSessionActivity(Object controllerObj) {
    113         return ((MediaController) controllerObj).getSessionActivity();
    114     }
    115 
    116     public static boolean dispatchMediaButtonEvent(Object controllerObj, KeyEvent event) {
    117         return ((MediaController) controllerObj).dispatchMediaButtonEvent(event);
    118     }
    119 
    120     public static void setVolumeTo(Object controllerObj, int value, int flags) {
    121         ((MediaController) controllerObj).setVolumeTo(value, flags);
    122     }
    123 
    124     public static void adjustVolume(Object controllerObj, int direction, int flags) {
    125         ((MediaController) controllerObj).adjustVolume(direction, flags);
    126     }
    127 
    128     public static void sendCommand(Object controllerObj,
    129             String command, Bundle params, ResultReceiver cb) {
    130         ((MediaController) controllerObj).sendCommand(command, params, cb);
    131     }
    132 
    133     public static String getPackageName(Object controllerObj) {
    134         return ((MediaController) controllerObj).getPackageName();
    135     }
    136 
    137     public static class TransportControls {
    138         public static void play(Object controlsObj) {
    139             ((MediaController.TransportControls)controlsObj).play();
    140         }
    141 
    142         public static void pause(Object controlsObj) {
    143             ((MediaController.TransportControls)controlsObj).pause();
    144         }
    145 
    146         public static void stop(Object controlsObj) {
    147             ((MediaController.TransportControls)controlsObj).stop();
    148         }
    149 
    150         public static void seekTo(Object controlsObj, long pos) {
    151             ((MediaController.TransportControls)controlsObj).seekTo(pos);
    152         }
    153 
    154         public static void fastForward(Object controlsObj) {
    155             ((MediaController.TransportControls)controlsObj).fastForward();
    156         }
    157 
    158         public static void rewind(Object controlsObj) {
    159             ((MediaController.TransportControls)controlsObj).rewind();
    160         }
    161 
    162         public static void skipToNext(Object controlsObj) {
    163             ((MediaController.TransportControls)controlsObj).skipToNext();
    164         }
    165 
    166         public static void skipToPrevious(Object controlsObj) {
    167             ((MediaController.TransportControls)controlsObj).skipToPrevious();
    168         }
    169 
    170         public static void setRating(Object controlsObj, Object ratingObj) {
    171             ((MediaController.TransportControls)controlsObj).setRating((Rating)ratingObj);
    172         }
    173 
    174         public static void playFromMediaId(Object controlsObj, String mediaId, Bundle extras) {
    175             ((MediaController.TransportControls) controlsObj).playFromMediaId(mediaId, extras);
    176         }
    177 
    178         public static void playFromSearch(Object controlsObj, String query, Bundle extras) {
    179             ((MediaController.TransportControls) controlsObj).playFromSearch(query, extras);
    180         }
    181 
    182         public static void skipToQueueItem(Object controlsObj, long id) {
    183             ((MediaController.TransportControls) controlsObj).skipToQueueItem(id);
    184         }
    185 
    186         public static void sendCustomAction(Object controlsObj, String action, Bundle args) {
    187             ((MediaController.TransportControls) controlsObj).sendCustomAction(action, args);
    188         }
    189 
    190         private TransportControls() {
    191         }
    192     }
    193 
    194     public static class PlaybackInfo {
    195         public static int getPlaybackType(Object volumeInfoObj) {
    196             return ((MediaController.PlaybackInfo)volumeInfoObj).getPlaybackType();
    197         }
    198 
    199         public static AudioAttributes getAudioAttributes(Object volumeInfoObj) {
    200             return ((MediaController.PlaybackInfo) volumeInfoObj).getAudioAttributes();
    201         }
    202 
    203         public static int getLegacyAudioStream(Object volumeInfoObj) {
    204             AudioAttributes attrs = getAudioAttributes(volumeInfoObj);
    205             return toLegacyStreamType(attrs);
    206         }
    207 
    208         public static int getVolumeControl(Object volumeInfoObj) {
    209             return ((MediaController.PlaybackInfo)volumeInfoObj).getVolumeControl();
    210         }
    211 
    212         public static int getMaxVolume(Object volumeInfoObj) {
    213             return ((MediaController.PlaybackInfo)volumeInfoObj).getMaxVolume();
    214         }
    215 
    216         public static int getCurrentVolume(Object volumeInfoObj) {
    217             return ((MediaController.PlaybackInfo)volumeInfoObj).getCurrentVolume();
    218         }
    219 
    220         // This is copied from AudioAttributes.toLegacyStreamType. TODO This
    221         // either needs to be kept in sync with that one or toLegacyStreamType
    222         // needs to be made public so it can be used by the support lib.
    223         private static final int FLAG_SCO = 0x1 << 2;
    224         private static final int STREAM_BLUETOOTH_SCO = 6;
    225         private static final int STREAM_SYSTEM_ENFORCED = 7;
    226         private static int toLegacyStreamType(AudioAttributes aa) {
    227             // flags to stream type mapping
    228             if ((aa.getFlags() & AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
    229                     == AudioAttributes.FLAG_AUDIBILITY_ENFORCED) {
    230                 return STREAM_SYSTEM_ENFORCED;
    231             }
    232             if ((aa.getFlags() & FLAG_SCO) == FLAG_SCO) {
    233                 return STREAM_BLUETOOTH_SCO;
    234             }
    235 
    236             // usage to stream type mapping
    237             switch (aa.getUsage()) {
    238                 case AudioAttributes.USAGE_MEDIA:
    239                 case AudioAttributes.USAGE_GAME:
    240                 case AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY:
    241                 case AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE:
    242                     return AudioManager.STREAM_MUSIC;
    243                 case AudioAttributes.USAGE_ASSISTANCE_SONIFICATION:
    244                     return AudioManager.STREAM_SYSTEM;
    245                 case AudioAttributes.USAGE_VOICE_COMMUNICATION:
    246                     return AudioManager.STREAM_VOICE_CALL;
    247                 case AudioAttributes.USAGE_VOICE_COMMUNICATION_SIGNALLING:
    248                     return AudioManager.STREAM_DTMF;
    249                 case AudioAttributes.USAGE_ALARM:
    250                     return AudioManager.STREAM_ALARM;
    251                 case AudioAttributes.USAGE_NOTIFICATION_RINGTONE:
    252                     return AudioManager.STREAM_RING;
    253                 case AudioAttributes.USAGE_NOTIFICATION:
    254                 case AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_REQUEST:
    255                 case AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_INSTANT:
    256                 case AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_DELAYED:
    257                 case AudioAttributes.USAGE_NOTIFICATION_EVENT:
    258                     return AudioManager.STREAM_NOTIFICATION;
    259                 case AudioAttributes.USAGE_UNKNOWN:
    260                 default:
    261                     return AudioManager.STREAM_MUSIC;
    262             }
    263         }
    264 
    265         private PlaybackInfo() {
    266         }
    267     }
    268 
    269     public static interface Callback {
    270         public void onSessionDestroyed();
    271         public void onSessionEvent(String event, Bundle extras);
    272         public void onPlaybackStateChanged(Object stateObj);
    273         public void onMetadataChanged(Object metadataObj);
    274         public void onQueueChanged(List<?> queue);
    275         public void onQueueTitleChanged(CharSequence title);
    276         public void onExtrasChanged(Bundle extras);
    277         public void onAudioInfoChanged(int type, int stream, int control, int max, int current);
    278     }
    279 
    280     static class CallbackProxy<T extends Callback> extends MediaController.Callback {
    281         protected final T mCallback;
    282 
    283         public CallbackProxy(T callback) {
    284             mCallback = callback;
    285         }
    286 
    287         @Override
    288         public void onSessionDestroyed() {
    289             mCallback.onSessionDestroyed();
    290         }
    291 
    292         @Override
    293         public void onSessionEvent(String event, Bundle extras) {
    294             mCallback.onSessionEvent(event, extras);
    295         }
    296 
    297         @Override
    298         public void onPlaybackStateChanged(PlaybackState state) {
    299             mCallback.onPlaybackStateChanged(state);
    300         }
    301 
    302         @Override
    303         public void onMetadataChanged(MediaMetadata metadata) {
    304             mCallback.onMetadataChanged(metadata);
    305         }
    306 
    307         @Override
    308         public void onQueueChanged(List<MediaSession.QueueItem> queue) {
    309             mCallback.onQueueChanged(queue);
    310         }
    311 
    312         @Override
    313         public void onQueueTitleChanged(CharSequence title) {
    314             mCallback.onQueueTitleChanged(title);
    315         }
    316 
    317         @Override
    318         public void onExtrasChanged(Bundle extras) {
    319             mCallback.onExtrasChanged(extras);
    320         }
    321 
    322         @Override
    323         public void onAudioInfoChanged(MediaController.PlaybackInfo info){
    324             mCallback.onAudioInfoChanged(info.getPlaybackType(),
    325                     PlaybackInfo.getLegacyAudioStream(info), info.getVolumeControl(),
    326                     info.getMaxVolume(), info.getCurrentVolume());
    327         }
    328     }
    329 
    330     private MediaControllerCompatApi21() {
    331     }
    332 }
    333