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