1692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim/*
2692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * Copyright 2018 The Android Open Source Project
3692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim *
4692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * Licensed under the Apache License, Version 2.0 (the "License");
5692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * you may not use this file except in compliance with the License.
6692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * You may obtain a copy of the License at
7692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim *
8692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim *      http://www.apache.org/licenses/LICENSE-2.0
9692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim *
10692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * Unless required by applicable law or agreed to in writing, software
11692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * distributed under the License is distributed on an "AS IS" BASIS,
12692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * See the License for the specific language governing permissions and
14692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim * limitations under the License.
15692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim */
16692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
17692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limpackage com.android.support.mediarouter.media;
18692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
19692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport android.content.Context;
20692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport android.graphics.drawable.Drawable;
21692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport android.media.AudioManager;
22692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport android.os.Build;
23692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport android.util.Log;
24692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
25692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport java.lang.reflect.InvocationTargetException;
26692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport java.lang.reflect.Method;
27692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport java.util.ArrayList;
28692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limimport java.util.List;
29692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
30692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim// @@RequiresApi(16)
31692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Limfinal class MediaRouterJellybean {
32692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    private static final String TAG = "MediaRouterJellybean";
33692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
34692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    // android.media.AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP = 0x80;
35692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    // android.media.AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100;
36692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    // android.media.AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200;
37692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static final int DEVICE_OUT_BLUETOOTH = 0x80 | 0x100 | 0x200;
38692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
39692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static final int ROUTE_TYPE_LIVE_AUDIO = 0x1;
40692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static final int ROUTE_TYPE_LIVE_VIDEO = 0x2;
41692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static final int ROUTE_TYPE_USER = 0x00800000;
42692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
43692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static final int ALL_ROUTE_TYPES =
44692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            MediaRouterJellybean.ROUTE_TYPE_LIVE_AUDIO
45692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            | MediaRouterJellybean.ROUTE_TYPE_LIVE_VIDEO
46692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            | MediaRouterJellybean.ROUTE_TYPE_USER;
47692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
48692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static Object getMediaRouter(Context context) {
49692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return context.getSystemService(Context.MEDIA_ROUTER_SERVICE);
50692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
51692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
52692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    @SuppressWarnings({ "rawtypes", "unchecked" })
53692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static List getRoutes(Object routerObj) {
54692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        final android.media.MediaRouter router = (android.media.MediaRouter)routerObj;
55692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        final int count = router.getRouteCount();
56692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        List out = new ArrayList(count);
57692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        for (int i = 0; i < count; i++) {
58692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            out.add(router.getRouteAt(i));
59692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
60692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return out;
61692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
62692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
63692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    @SuppressWarnings({ "rawtypes", "unchecked" })
64692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static List getCategories(Object routerObj) {
65692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        final android.media.MediaRouter router = (android.media.MediaRouter)routerObj;
66692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        final int count = router.getCategoryCount();
67692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        List out = new ArrayList(count);
68692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        for (int i = 0; i < count; i++) {
69692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            out.add(router.getCategoryAt(i));
70692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
71692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return out;
72692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
73692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
74692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static Object getSelectedRoute(Object routerObj, int type) {
75692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return ((android.media.MediaRouter)routerObj).getSelectedRoute(type);
76692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
77692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
78692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static void selectRoute(Object routerObj, int types, Object routeObj) {
79692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        ((android.media.MediaRouter)routerObj).selectRoute(types,
80692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                (android.media.MediaRouter.RouteInfo)routeObj);
81692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
82692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
83692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static void addCallback(Object routerObj, int types, Object callbackObj) {
84692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        ((android.media.MediaRouter)routerObj).addCallback(types,
85692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                (android.media.MediaRouter.Callback)callbackObj);
86692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
87692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
88692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static void removeCallback(Object routerObj, Object callbackObj) {
89692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        ((android.media.MediaRouter)routerObj).removeCallback(
90692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                (android.media.MediaRouter.Callback)callbackObj);
91692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
92692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
93692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static Object createRouteCategory(Object routerObj,
94692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            String name, boolean isGroupable) {
95692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return ((android.media.MediaRouter)routerObj).createRouteCategory(name, isGroupable);
96692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
97692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
98692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static Object createUserRoute(Object routerObj, Object categoryObj) {
99692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return ((android.media.MediaRouter)routerObj).createUserRoute(
100692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                (android.media.MediaRouter.RouteCategory)categoryObj);
101692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
102692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
103692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static void addUserRoute(Object routerObj, Object routeObj) {
104692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        ((android.media.MediaRouter)routerObj).addUserRoute(
105692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                (android.media.MediaRouter.UserRouteInfo)routeObj);
106692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
107692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
108692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static void removeUserRoute(Object routerObj, Object routeObj) {
109692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        ((android.media.MediaRouter)routerObj).removeUserRoute(
110692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                (android.media.MediaRouter.UserRouteInfo)routeObj);
111692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
112692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
113692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static Object createCallback(Callback callback) {
114692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return new CallbackProxy<Callback>(callback);
115692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
116692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
117692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static Object createVolumeCallback(VolumeCallback callback) {
118692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        return new VolumeCallbackProxy<VolumeCallback>(callback);
119692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
120692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
121692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static boolean checkRoutedToBluetooth(Context context) {
122692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        try {
123692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            AudioManager audioManager = (AudioManager) context.getSystemService(
124692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                    Context.AUDIO_SERVICE);
125692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            Method method = audioManager.getClass().getDeclaredMethod(
126692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                    "getDevicesForStream", int.class);
127692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            int device = (Integer) method.invoke(audioManager, AudioManager.STREAM_MUSIC);
128692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return (device & DEVICE_OUT_BLUETOOTH) != 0;
129692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        } catch (Exception e) {
130692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return false;
131692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
132692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
133692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
134692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static final class RouteInfo {
135692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static CharSequence getName(Object routeObj, Context context) {
136692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return ((android.media.MediaRouter.RouteInfo)routeObj).getName(context);
137692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
138692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
139692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static CharSequence getStatus(Object routeObj) {
140692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return ((android.media.MediaRouter.RouteInfo)routeObj).getStatus();
141692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
142692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
143692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static int getSupportedTypes(Object routeObj) {
144692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return ((android.media.MediaRouter.RouteInfo)routeObj).getSupportedTypes();
145692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
146692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
147692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static Object getCategory(Object routeObj) {
148692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return ((android.media.MediaRouter.RouteInfo)routeObj).getCategory();
149692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
150692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
151692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static Drawable getIconDrawable(Object routeObj) {
152692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return ((android.media.MediaRouter.RouteInfo)routeObj).getIconDrawable();
153692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
154692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
155692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static int getPlaybackType(Object routeObj) {
156692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return ((android.media.MediaRouter.RouteInfo)routeObj).getPlaybackType();
157692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
158692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
159692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static int getPlaybackStream(Object routeObj) {
160692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return ((android.media.MediaRouter.RouteInfo)routeObj).getPlaybackStream();
161692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
162692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
163692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static int getVolume(Object routeObj) {
164692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return ((android.media.MediaRouter.RouteInfo)routeObj).getVolume();
165692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
166692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
167692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static int getVolumeMax(Object routeObj) {
168692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return ((android.media.MediaRouter.RouteInfo)routeObj).getVolumeMax();
169692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
170692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
171692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static int getVolumeHandling(Object routeObj) {
172692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return ((android.media.MediaRouter.RouteInfo)routeObj).getVolumeHandling();
173692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
174692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
175692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static Object getTag(Object routeObj) {
176692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return ((android.media.MediaRouter.RouteInfo)routeObj).getTag();
177692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
178692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
179692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static void setTag(Object routeObj, Object tag) {
180692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            ((android.media.MediaRouter.RouteInfo)routeObj).setTag(tag);
181692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
182692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
183692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static void requestSetVolume(Object routeObj, int volume) {
184692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            ((android.media.MediaRouter.RouteInfo)routeObj).requestSetVolume(volume);
185692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
186692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
187692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static void requestUpdateVolume(Object routeObj, int direction) {
188692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            ((android.media.MediaRouter.RouteInfo)routeObj).requestUpdateVolume(direction);
189692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
190692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
191692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static Object getGroup(Object routeObj) {
192692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return ((android.media.MediaRouter.RouteInfo)routeObj).getGroup();
193692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
194692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
195692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static boolean isGroup(Object routeObj) {
196692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return routeObj instanceof android.media.MediaRouter.RouteGroup;
197692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
198692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
199692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
200692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static final class RouteGroup {
201692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        @SuppressWarnings({ "rawtypes", "unchecked" })
202692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static List getGroupedRoutes(Object groupObj) {
203692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            final android.media.MediaRouter.RouteGroup group =
204692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                    (android.media.MediaRouter.RouteGroup)groupObj;
205692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            final int count = group.getRouteCount();
206692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            List out = new ArrayList(count);
207692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            for (int i = 0; i < count; i++) {
208692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                out.add(group.getRouteAt(i));
209692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
210692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return out;
211692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
212692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
213692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
214692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static final class UserRouteInfo {
215692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static void setName(Object routeObj, CharSequence name) {
216692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            ((android.media.MediaRouter.UserRouteInfo)routeObj).setName(name);
217692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
218692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
219692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static void setStatus(Object routeObj, CharSequence status) {
220692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            ((android.media.MediaRouter.UserRouteInfo)routeObj).setStatus(status);
221692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
222692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
223692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static void setIconDrawable(Object routeObj, Drawable icon) {
224692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            ((android.media.MediaRouter.UserRouteInfo)routeObj).setIconDrawable(icon);
225692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
226692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
227692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static void setPlaybackType(Object routeObj, int type) {
228692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            ((android.media.MediaRouter.UserRouteInfo)routeObj).setPlaybackType(type);
229692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
230692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
231692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static void setPlaybackStream(Object routeObj, int stream) {
232692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            ((android.media.MediaRouter.UserRouteInfo)routeObj).setPlaybackStream(stream);
233692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
234692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
235692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static void setVolume(Object routeObj, int volume) {
236692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolume(volume);
237692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
238692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
239692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static void setVolumeMax(Object routeObj, int volumeMax) {
240692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeMax(volumeMax);
241692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
242692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
243692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static void setVolumeHandling(Object routeObj, int volumeHandling) {
244692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeHandling(volumeHandling);
245692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
246692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
247692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static void setVolumeCallback(Object routeObj, Object volumeCallbackObj) {
248692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeCallback(
249692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                    (android.media.MediaRouter.VolumeCallback)volumeCallbackObj);
250692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
251692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
252692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static void setRemoteControlClient(Object routeObj, Object rccObj) {
253692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            ((android.media.MediaRouter.UserRouteInfo)routeObj).setRemoteControlClient(
254692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                    (android.media.RemoteControlClient)rccObj);
255692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
256692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
257692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
258692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static final class RouteCategory {
259692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static CharSequence getName(Object categoryObj, Context context) {
260692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return ((android.media.MediaRouter.RouteCategory)categoryObj).getName(context);
261692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
262692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
263692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        @SuppressWarnings({ "rawtypes", "unchecked" })
264692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static List getRoutes(Object categoryObj) {
265692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            ArrayList out = new ArrayList();
266692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            ((android.media.MediaRouter.RouteCategory)categoryObj).getRoutes(out);
267692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return out;
268692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
269692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
270692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static int getSupportedTypes(Object categoryObj) {
271692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return ((android.media.MediaRouter.RouteCategory)categoryObj).getSupportedTypes();
272692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
273692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
274692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public static boolean isGroupable(Object categoryObj) {
275692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return ((android.media.MediaRouter.RouteCategory)categoryObj).isGroupable();
276692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
277692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
278692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
279692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static interface Callback {
280692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onRouteSelected(int type, Object routeObj);
281692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onRouteUnselected(int type, Object routeObj);
282692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onRouteAdded(Object routeObj);
283692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onRouteRemoved(Object routeObj);
284692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onRouteChanged(Object routeObj);
285692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onRouteGrouped(Object routeObj, Object groupObj, int index);
286692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onRouteUngrouped(Object routeObj, Object groupObj);
287692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onRouteVolumeChanged(Object routeObj);
288692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
289692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
290692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static interface VolumeCallback {
291692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onVolumeSetRequest(Object routeObj, int volume);
292692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onVolumeUpdateRequest(Object routeObj, int direction);
293692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
294692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
295692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
296692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Workaround for limitations of selectRoute() on JB and JB MR1.
297692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Do not use on JB MR2 and above.
298692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
299692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static final class SelectRouteWorkaround {
300692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        private Method mSelectRouteIntMethod;
301692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
302692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public SelectRouteWorkaround() {
303692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (Build.VERSION.SDK_INT < 16 || Build.VERSION.SDK_INT > 17) {
304692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                throw new UnsupportedOperationException();
305692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
306692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            try {
307692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                mSelectRouteIntMethod = android.media.MediaRouter.class.getMethod(
308692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                        "selectRouteInt", int.class, android.media.MediaRouter.RouteInfo.class);
309692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            } catch (NoSuchMethodException ex) {
310692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
311692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
312692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
313692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void selectRoute(Object routerObj, int types, Object routeObj) {
314692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            android.media.MediaRouter router = (android.media.MediaRouter)routerObj;
315692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            android.media.MediaRouter.RouteInfo route =
316692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                    (android.media.MediaRouter.RouteInfo)routeObj;
317692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
318692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            int routeTypes = route.getSupportedTypes();
319692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if ((routeTypes & ROUTE_TYPE_USER) == 0) {
320692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                // Handle non-user routes.
321692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                // On JB and JB MR1, the selectRoute() API only supports programmatically
322692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                // selecting user routes.  So instead we rely on the hidden selectRouteInt()
323692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                // method on these versions of the platform.
324692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                // This limitation was removed in JB MR2.
325692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                if (mSelectRouteIntMethod != null) {
326692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                    try {
327692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                        mSelectRouteIntMethod.invoke(router, types, route);
328692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                        return; // success!
329692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                    } catch (IllegalAccessException ex) {
330692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                        Log.w(TAG, "Cannot programmatically select non-user route.  "
331692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                                + "Media routing may not work.", ex);
332692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                    } catch (InvocationTargetException ex) {
333692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                        Log.w(TAG, "Cannot programmatically select non-user route.  "
334692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                                + "Media routing may not work.", ex);
335692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                    }
336692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                } else {
337692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                    Log.w(TAG, "Cannot programmatically select non-user route "
338692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                            + "because the platform is missing the selectRouteInt() "
339692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                            + "method.  Media routing may not work.");
340692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                }
341692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
342692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
343692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            // Default handling.
344692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            router.selectRoute(types, route);
345692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
346692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
347692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
348692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    /**
349692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Workaround the fact that the getDefaultRoute() method does not exist in JB and JB MR1.
350692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     * Do not use on JB MR2 and above.
351692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim     */
352692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    public static final class GetDefaultRouteWorkaround {
353692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        private Method mGetSystemAudioRouteMethod;
354692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
355692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public GetDefaultRouteWorkaround() {
356692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (Build.VERSION.SDK_INT < 16 || Build.VERSION.SDK_INT > 17) {
357692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                throw new UnsupportedOperationException();
358692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
359692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            try {
360692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                mGetSystemAudioRouteMethod =
361692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                        android.media.MediaRouter.class.getMethod("getSystemAudioRoute");
362692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            } catch (NoSuchMethodException ex) {
363692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
364692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
365692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
366692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public Object getDefaultRoute(Object routerObj) {
367692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            android.media.MediaRouter router = (android.media.MediaRouter)routerObj;
368692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
369692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            if (mGetSystemAudioRouteMethod != null) {
370692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                try {
371692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                    return mGetSystemAudioRouteMethod.invoke(router);
372692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                } catch (IllegalAccessException ex) {
373692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                } catch (InvocationTargetException ex) {
374692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                }
375692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            }
376692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
377692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            // Could not find the method or it does not work.
378692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            // Return the first route and hope for the best.
379692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            return router.getRouteAt(0);
380692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
381692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
382692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
383692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static class CallbackProxy<T extends Callback>
384692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            extends android.media.MediaRouter.Callback {
385692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        protected final T mCallback;
386692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
387692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public CallbackProxy(T callback) {
388692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mCallback = callback;
389692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
390692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
391692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        @Override
392692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onRouteSelected(android.media.MediaRouter router,
393692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                int type, android.media.MediaRouter.RouteInfo route) {
394692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mCallback.onRouteSelected(type, route);
395692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
396692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
397692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        @Override
398692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onRouteUnselected(android.media.MediaRouter router,
399692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                int type, android.media.MediaRouter.RouteInfo route) {
400692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mCallback.onRouteUnselected(type, route);
401692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
402692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
403692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        @Override
404692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onRouteAdded(android.media.MediaRouter router,
405692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                android.media.MediaRouter.RouteInfo route) {
406692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mCallback.onRouteAdded(route);
407692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
408692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
409692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        @Override
410692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onRouteRemoved(android.media.MediaRouter router,
411692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                android.media.MediaRouter.RouteInfo route) {
412692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mCallback.onRouteRemoved(route);
413692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
414692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
415692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        @Override
416692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onRouteChanged(android.media.MediaRouter router,
417692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                android.media.MediaRouter.RouteInfo route) {
418692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mCallback.onRouteChanged(route);
419692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
420692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
421692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        @Override
422692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onRouteGrouped(android.media.MediaRouter router,
423692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                android.media.MediaRouter.RouteInfo route,
424692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                android.media.MediaRouter.RouteGroup group, int index) {
425692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mCallback.onRouteGrouped(route, group, index);
426692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
427692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
428692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        @Override
429692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onRouteUngrouped(android.media.MediaRouter router,
430692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                android.media.MediaRouter.RouteInfo route,
431692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                android.media.MediaRouter.RouteGroup group) {
432692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mCallback.onRouteUngrouped(route, group);
433692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
434692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
435692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        @Override
436692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onRouteVolumeChanged(android.media.MediaRouter router,
437692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                android.media.MediaRouter.RouteInfo route) {
438692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mCallback.onRouteVolumeChanged(route);
439692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
440692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
441692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
442692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    static class VolumeCallbackProxy<T extends VolumeCallback>
443692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            extends android.media.MediaRouter.VolumeCallback {
444692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        protected final T mCallback;
445692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
446692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public VolumeCallbackProxy(T callback) {
447692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mCallback = callback;
448692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
449692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
450692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        @Override
451692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onVolumeSetRequest(android.media.MediaRouter.RouteInfo route,
452692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                int volume) {
453692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mCallback.onVolumeSetRequest(route, volume);
454692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
455692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim
456692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        @Override
457692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        public void onVolumeUpdateRequest(android.media.MediaRouter.RouteInfo route,
458692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim                int direction) {
459692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim            mCallback.onVolumeUpdateRequest(route, direction);
460692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim        }
461692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim    }
462692a547730bbc95ad277d5214ef3d786ce1e499fSungsoo Lim}
463