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