1c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown/* 2c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown * Copyright (C) 2013 The Android Open Source Project 3c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown * 4c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 5c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown * you may not use this file except in compliance with the License. 6c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown * You may obtain a copy of the License at 7c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown * 8c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 9c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown * 10c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown * Unless required by applicable law or agreed to in writing, software 11c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 12c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown * See the License for the specific language governing permissions and 14c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown * limitations under the License. 15c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown */ 16c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 17b507e525a61ed761eecfc2eaaf19af7e8db5dca5Jeff Brownpackage android.support.v7.media; 18c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 19c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brownimport android.content.Context; 20c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brownimport android.graphics.drawable.Drawable; 2111417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.os.Build; 2211417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.util.Log; 23c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 2411417b1cfde8f1749905f2d735623af9214148afJeff Brownimport java.lang.reflect.InvocationTargetException; 2511417b1cfde8f1749905f2d735623af9214148afJeff Brownimport java.lang.reflect.Method; 26c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brownimport java.util.ArrayList; 27c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brownimport java.util.List; 28c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 29c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brownfinal class MediaRouterJellybean { 3011417b1cfde8f1749905f2d735623af9214148afJeff Brown private static final String TAG = "MediaRouterJellybean"; 3111417b1cfde8f1749905f2d735623af9214148afJeff Brown 32c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static final int ROUTE_TYPE_LIVE_AUDIO = 0x1; 33c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static final int ROUTE_TYPE_LIVE_VIDEO = 0x2; 34c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static final int ROUTE_TYPE_USER = 0x00800000; 35c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 3611417b1cfde8f1749905f2d735623af9214148afJeff Brown public static final int ALL_ROUTE_TYPES = 3711417b1cfde8f1749905f2d735623af9214148afJeff Brown MediaRouterJellybean.ROUTE_TYPE_LIVE_AUDIO 3811417b1cfde8f1749905f2d735623af9214148afJeff Brown | MediaRouterJellybean.ROUTE_TYPE_LIVE_VIDEO 3911417b1cfde8f1749905f2d735623af9214148afJeff Brown | MediaRouterJellybean.ROUTE_TYPE_USER; 4011417b1cfde8f1749905f2d735623af9214148afJeff Brown 41c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static Object getMediaRouter(Context context) { 42c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return context.getSystemService(Context.MEDIA_ROUTER_SERVICE); 43c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 44c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 45c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown @SuppressWarnings({ "rawtypes", "unchecked" }) 46c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static List getRoutes(Object routerObj) { 47c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown final android.media.MediaRouter router = (android.media.MediaRouter)routerObj; 48c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown final int count = router.getRouteCount(); 49c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown List out = new ArrayList(count); 50c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown for (int i = 0; i < count; i++) { 51c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown out.add(router.getRouteAt(i)); 52c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 53c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return out; 54c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 55c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 56c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown @SuppressWarnings({ "rawtypes", "unchecked" }) 57c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static List getCategories(Object routerObj) { 58c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown final android.media.MediaRouter router = (android.media.MediaRouter)routerObj; 59c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown final int count = router.getCategoryCount(); 60c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown List out = new ArrayList(count); 61c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown for (int i = 0; i < count; i++) { 62c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown out.add(router.getCategoryAt(i)); 63c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 64c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return out; 65c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 66c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 67c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static Object getSelectedRoute(Object routerObj, int type) { 68c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter)routerObj).getSelectedRoute(type); 69c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 70c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 71c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void selectRoute(Object routerObj, int types, Object routeObj) { 72c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter)routerObj).selectRoute(types, 73c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown (android.media.MediaRouter.RouteInfo)routeObj); 74c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 75c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 76c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void addCallback(Object routerObj, int types, Object callbackObj) { 77c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter)routerObj).addCallback(types, 78c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown (android.media.MediaRouter.Callback)callbackObj); 79c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 80c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 81c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void removeCallback(Object routerObj, Object callbackObj) { 82c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter)routerObj).removeCallback( 83c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown (android.media.MediaRouter.Callback)callbackObj); 84c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 85c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 86c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static Object createRouteCategory(Object routerObj, 87c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown String name, boolean isGroupable) { 88c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter)routerObj).createRouteCategory(name, isGroupable); 89c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 90c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 91c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static Object createUserRoute(Object routerObj, Object categoryObj) { 92c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter)routerObj).createUserRoute( 93c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown (android.media.MediaRouter.RouteCategory)categoryObj); 94c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 95c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 96c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void addUserRoute(Object routerObj, Object routeObj) { 97c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter)routerObj).addUserRoute( 98c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown (android.media.MediaRouter.UserRouteInfo)routeObj); 99c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 100c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 101c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void removeUserRoute(Object routerObj, Object routeObj) { 102c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter)routerObj).removeUserRoute( 103c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown (android.media.MediaRouter.UserRouteInfo)routeObj); 104c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 105c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 106c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static Object createCallback(Callback callback) { 107c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return new CallbackProxy<Callback>(callback); 108c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 109c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 110c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static Object createVolumeCallback(VolumeCallback callback) { 111c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return new VolumeCallbackProxy<VolumeCallback>(callback); 112c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 113c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 114c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static final class RouteInfo { 115c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static CharSequence getName(Object routeObj, Context context) { 116c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getName(context); 117c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 118c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 119c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static CharSequence getStatus(Object routeObj) { 120c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getStatus(); 121c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 122c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 123c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static int getSupportedTypes(Object routeObj) { 124c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getSupportedTypes(); 125c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 126c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 127c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static Object getCategory(Object routeObj) { 128c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getCategory(); 129c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 130c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 131c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static Drawable getIconDrawable(Object routeObj) { 132c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getIconDrawable(); 133c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 134c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 135c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static int getPlaybackType(Object routeObj) { 136c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getPlaybackType(); 137c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 138c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 139c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static int getPlaybackStream(Object routeObj) { 140c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getPlaybackStream(); 141c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 142c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 143c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static int getVolume(Object routeObj) { 144c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getVolume(); 145c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 146c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 147c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static int getVolumeMax(Object routeObj) { 148c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getVolumeMax(); 149c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 150c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 151c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static int getVolumeHandling(Object routeObj) { 152c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getVolumeHandling(); 153c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 154c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 155c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static Object getTag(Object routeObj) { 156c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getTag(); 157c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 158c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 159c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void setTag(Object routeObj, Object tag) { 160c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter.RouteInfo)routeObj).setTag(tag); 161c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 162c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 163c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void requestSetVolume(Object routeObj, int volume) { 164c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter.RouteInfo)routeObj).requestSetVolume(volume); 165c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 166c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 167c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void requestUpdateVolume(Object routeObj, int direction) { 168c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter.RouteInfo)routeObj).requestUpdateVolume(direction); 169c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 170c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 171c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static Object getGroup(Object routeObj) { 172c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getGroup(); 173c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 174c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 175c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static boolean isGroup(Object routeObj) { 176c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return routeObj instanceof android.media.MediaRouter.RouteGroup; 177c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 178c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 179c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 180c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static final class RouteGroup { 181c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown @SuppressWarnings({ "rawtypes", "unchecked" }) 182c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static List getGroupedRoutes(Object groupObj) { 183c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown final android.media.MediaRouter.RouteGroup group = 184c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown (android.media.MediaRouter.RouteGroup)groupObj; 185c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown final int count = group.getRouteCount(); 186c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown List out = new ArrayList(count); 187c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown for (int i = 0; i < count; i++) { 188c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown out.add(group.getRouteAt(i)); 189c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 190c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return out; 191c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 192c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 193c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 194c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static final class UserRouteInfo { 195c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void setName(Object routeObj, CharSequence name) { 196c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setName(name); 197c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 198c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 199c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void setStatus(Object routeObj, CharSequence status) { 200c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setStatus(status); 201c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 202c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 203c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void setIconDrawable(Object routeObj, Drawable icon) { 204c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setIconDrawable(icon); 205c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 206c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 207c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void setPlaybackType(Object routeObj, int type) { 208c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setPlaybackType(type); 209c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 210c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 211c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void setPlaybackStream(Object routeObj, int stream) { 212c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setPlaybackStream(stream); 213c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 214c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 215c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void setVolume(Object routeObj, int volume) { 216c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolume(volume); 217c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 218c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 219c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void setVolumeMax(Object routeObj, int volumeMax) { 220c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeMax(volumeMax); 221c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 222c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 223c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void setVolumeHandling(Object routeObj, int volumeHandling) { 224c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeHandling(volumeHandling); 225c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 226c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 227c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static void setVolumeCallback(Object routeObj, Object volumeCallbackObj) { 228c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeCallback( 229567dbb1c7f8a0cb3c4340ad607b6d833fc1b2270Jeff Brown (android.media.MediaRouter.VolumeCallback)volumeCallbackObj); 230567dbb1c7f8a0cb3c4340ad607b6d833fc1b2270Jeff Brown } 231567dbb1c7f8a0cb3c4340ad607b6d833fc1b2270Jeff Brown 232567dbb1c7f8a0cb3c4340ad607b6d833fc1b2270Jeff Brown public static void setRemoteControlClient(Object routeObj, Object rccObj) { 233567dbb1c7f8a0cb3c4340ad607b6d833fc1b2270Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setRemoteControlClient( 234567dbb1c7f8a0cb3c4340ad607b6d833fc1b2270Jeff Brown (android.media.RemoteControlClient)rccObj); 235c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 236c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 237c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 238c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static final class RouteCategory { 239c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static CharSequence getName(Object categoryObj, Context context) { 240c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter.RouteCategory)categoryObj).getName(context); 241c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 242c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 243c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown @SuppressWarnings({ "rawtypes", "unchecked" }) 244c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static List getRoutes(Object categoryObj) { 245c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ArrayList out = new ArrayList(); 246c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown ((android.media.MediaRouter.RouteCategory)categoryObj).getRoutes(out); 247c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return out; 248c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 249c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 250c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static int getSupportedTypes(Object categoryObj) { 251c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter.RouteCategory)categoryObj).getSupportedTypes(); 252c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 253c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 254c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static boolean isGroupable(Object categoryObj) { 255c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown return ((android.media.MediaRouter.RouteCategory)categoryObj).isGroupable(); 256c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 257c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 258c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 259c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static interface Callback { 260c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onRouteSelected(int type, Object routeObj); 261c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onRouteUnselected(int type, Object routeObj); 262c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onRouteAdded(Object routeObj); 263c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onRouteRemoved(Object routeObj); 264c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onRouteChanged(Object routeObj); 265c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onRouteGrouped(Object routeObj, Object groupObj, int index); 266c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onRouteUngrouped(Object routeObj, Object groupObj); 267c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onRouteVolumeChanged(Object routeObj); 268c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 269c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 270c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public static interface VolumeCallback { 271c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onVolumeSetRequest(Object routeObj, int volume); 272c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onVolumeUpdateRequest(Object routeObj, int direction); 273c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 274c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 27511417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 27611417b1cfde8f1749905f2d735623af9214148afJeff Brown * Workaround for limitations of selectRoute() on JB and JB MR1. 27711417b1cfde8f1749905f2d735623af9214148afJeff Brown * Do not use on JB MR2 and above. 27811417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 27911417b1cfde8f1749905f2d735623af9214148afJeff Brown public static final class SelectRouteWorkaround { 28011417b1cfde8f1749905f2d735623af9214148afJeff Brown private Method mSelectRouteIntMethod; 28111417b1cfde8f1749905f2d735623af9214148afJeff Brown 28211417b1cfde8f1749905f2d735623af9214148afJeff Brown public SelectRouteWorkaround() { 28311417b1cfde8f1749905f2d735623af9214148afJeff Brown if (Build.VERSION.SDK_INT < 16 || Build.VERSION.SDK_INT > 17) { 28411417b1cfde8f1749905f2d735623af9214148afJeff Brown throw new UnsupportedOperationException(); 28511417b1cfde8f1749905f2d735623af9214148afJeff Brown } 28611417b1cfde8f1749905f2d735623af9214148afJeff Brown try { 28711417b1cfde8f1749905f2d735623af9214148afJeff Brown mSelectRouteIntMethod = android.media.MediaRouter.class.getMethod( 28811417b1cfde8f1749905f2d735623af9214148afJeff Brown "selectRouteInt", int.class, android.media.MediaRouter.RouteInfo.class); 28911417b1cfde8f1749905f2d735623af9214148afJeff Brown } catch (NoSuchMethodException ex) { 29011417b1cfde8f1749905f2d735623af9214148afJeff Brown } 29111417b1cfde8f1749905f2d735623af9214148afJeff Brown } 29211417b1cfde8f1749905f2d735623af9214148afJeff Brown 29311417b1cfde8f1749905f2d735623af9214148afJeff Brown public void selectRoute(Object routerObj, int types, Object routeObj) { 29411417b1cfde8f1749905f2d735623af9214148afJeff Brown android.media.MediaRouter router = (android.media.MediaRouter)routerObj; 29511417b1cfde8f1749905f2d735623af9214148afJeff Brown android.media.MediaRouter.RouteInfo route = 29611417b1cfde8f1749905f2d735623af9214148afJeff Brown (android.media.MediaRouter.RouteInfo)routeObj; 29711417b1cfde8f1749905f2d735623af9214148afJeff Brown 29811417b1cfde8f1749905f2d735623af9214148afJeff Brown int routeTypes = route.getSupportedTypes(); 29911417b1cfde8f1749905f2d735623af9214148afJeff Brown if ((routeTypes & ROUTE_TYPE_USER) == 0) { 30011417b1cfde8f1749905f2d735623af9214148afJeff Brown // Handle non-user routes. 30111417b1cfde8f1749905f2d735623af9214148afJeff Brown // On JB and JB MR1, the selectRoute() API only supports programmatically 30211417b1cfde8f1749905f2d735623af9214148afJeff Brown // selecting user routes. So instead we rely on the hidden selectRouteInt() 30311417b1cfde8f1749905f2d735623af9214148afJeff Brown // method on these versions of the platform. 30411417b1cfde8f1749905f2d735623af9214148afJeff Brown // This limitation was removed in JB MR2. 30511417b1cfde8f1749905f2d735623af9214148afJeff Brown if (mSelectRouteIntMethod != null) { 30611417b1cfde8f1749905f2d735623af9214148afJeff Brown try { 30711417b1cfde8f1749905f2d735623af9214148afJeff Brown mSelectRouteIntMethod.invoke(router, types, route); 30811417b1cfde8f1749905f2d735623af9214148afJeff Brown return; // success! 30911417b1cfde8f1749905f2d735623af9214148afJeff Brown } catch (IllegalAccessException ex) { 31011417b1cfde8f1749905f2d735623af9214148afJeff Brown Log.w(TAG, "Cannot programmatically select non-user route. " 31111417b1cfde8f1749905f2d735623af9214148afJeff Brown + "Media routing may not work.", ex); 31211417b1cfde8f1749905f2d735623af9214148afJeff Brown } catch (InvocationTargetException ex) { 31311417b1cfde8f1749905f2d735623af9214148afJeff Brown Log.w(TAG, "Cannot programmatically select non-user route. " 31411417b1cfde8f1749905f2d735623af9214148afJeff Brown + "Media routing may not work.", ex); 31511417b1cfde8f1749905f2d735623af9214148afJeff Brown } 31611417b1cfde8f1749905f2d735623af9214148afJeff Brown } else { 31711417b1cfde8f1749905f2d735623af9214148afJeff Brown Log.w(TAG, "Cannot programmatically select non-user route " 31811417b1cfde8f1749905f2d735623af9214148afJeff Brown + "because the platform is missing the selectRouteInt() " 31911417b1cfde8f1749905f2d735623af9214148afJeff Brown + "method. Media routing may not work."); 32011417b1cfde8f1749905f2d735623af9214148afJeff Brown } 32111417b1cfde8f1749905f2d735623af9214148afJeff Brown } 32211417b1cfde8f1749905f2d735623af9214148afJeff Brown 32311417b1cfde8f1749905f2d735623af9214148afJeff Brown // Default handling. 32411417b1cfde8f1749905f2d735623af9214148afJeff Brown router.selectRoute(types, route); 32511417b1cfde8f1749905f2d735623af9214148afJeff Brown } 32611417b1cfde8f1749905f2d735623af9214148afJeff Brown } 32711417b1cfde8f1749905f2d735623af9214148afJeff Brown 32811417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 32911417b1cfde8f1749905f2d735623af9214148afJeff Brown * Workaround the fact that the getDefaultRoute() method does not exist in JB and JB MR1. 33011417b1cfde8f1749905f2d735623af9214148afJeff Brown * Do not use on JB MR2 and above. 33111417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 33211417b1cfde8f1749905f2d735623af9214148afJeff Brown public static final class GetDefaultRouteWorkaround { 33311417b1cfde8f1749905f2d735623af9214148afJeff Brown private Method mGetSystemAudioRouteMethod; 33411417b1cfde8f1749905f2d735623af9214148afJeff Brown 33511417b1cfde8f1749905f2d735623af9214148afJeff Brown public GetDefaultRouteWorkaround() { 33611417b1cfde8f1749905f2d735623af9214148afJeff Brown if (Build.VERSION.SDK_INT < 16 || Build.VERSION.SDK_INT > 17) { 33711417b1cfde8f1749905f2d735623af9214148afJeff Brown throw new UnsupportedOperationException(); 33811417b1cfde8f1749905f2d735623af9214148afJeff Brown } 33911417b1cfde8f1749905f2d735623af9214148afJeff Brown try { 34011417b1cfde8f1749905f2d735623af9214148afJeff Brown mGetSystemAudioRouteMethod = 34111417b1cfde8f1749905f2d735623af9214148afJeff Brown android.media.MediaRouter.class.getMethod("getSystemAudioRoute"); 34211417b1cfde8f1749905f2d735623af9214148afJeff Brown } catch (NoSuchMethodException ex) { 34311417b1cfde8f1749905f2d735623af9214148afJeff Brown } 34411417b1cfde8f1749905f2d735623af9214148afJeff Brown } 34511417b1cfde8f1749905f2d735623af9214148afJeff Brown 34611417b1cfde8f1749905f2d735623af9214148afJeff Brown public Object getDefaultRoute(Object routerObj) { 34711417b1cfde8f1749905f2d735623af9214148afJeff Brown android.media.MediaRouter router = (android.media.MediaRouter)routerObj; 34811417b1cfde8f1749905f2d735623af9214148afJeff Brown 34911417b1cfde8f1749905f2d735623af9214148afJeff Brown if (mGetSystemAudioRouteMethod != null) { 35011417b1cfde8f1749905f2d735623af9214148afJeff Brown try { 35111417b1cfde8f1749905f2d735623af9214148afJeff Brown return mGetSystemAudioRouteMethod.invoke(router); 35211417b1cfde8f1749905f2d735623af9214148afJeff Brown } catch (IllegalAccessException ex) { 35311417b1cfde8f1749905f2d735623af9214148afJeff Brown } catch (InvocationTargetException ex) { 35411417b1cfde8f1749905f2d735623af9214148afJeff Brown } 35511417b1cfde8f1749905f2d735623af9214148afJeff Brown } 35611417b1cfde8f1749905f2d735623af9214148afJeff Brown 35711417b1cfde8f1749905f2d735623af9214148afJeff Brown // Could not find the method or it does not work. 35811417b1cfde8f1749905f2d735623af9214148afJeff Brown // Return the first route and hope for the best. 35911417b1cfde8f1749905f2d735623af9214148afJeff Brown return router.getRouteAt(0); 36011417b1cfde8f1749905f2d735623af9214148afJeff Brown } 36111417b1cfde8f1749905f2d735623af9214148afJeff Brown } 36211417b1cfde8f1749905f2d735623af9214148afJeff Brown 363c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown static class CallbackProxy<T extends Callback> 364c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown extends android.media.MediaRouter.Callback { 365c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown protected final T mCallback; 366c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 367c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public CallbackProxy(T callback) { 368c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown mCallback = callback; 369c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 370c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 371c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown @Override 372c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onRouteSelected(android.media.MediaRouter router, 373c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown int type, android.media.MediaRouter.RouteInfo route) { 374c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown mCallback.onRouteSelected(type, route); 375c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 376c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 377c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown @Override 378c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onRouteUnselected(android.media.MediaRouter router, 379c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown int type, android.media.MediaRouter.RouteInfo route) { 380c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown mCallback.onRouteUnselected(type, route); 381c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 382c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 383c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown @Override 384c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onRouteAdded(android.media.MediaRouter router, 385c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown android.media.MediaRouter.RouteInfo route) { 386c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown mCallback.onRouteAdded(route); 387c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 388c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 389c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown @Override 390c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onRouteRemoved(android.media.MediaRouter router, 391c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown android.media.MediaRouter.RouteInfo route) { 392c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown mCallback.onRouteRemoved(route); 393c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 394c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 395c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown @Override 396c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onRouteChanged(android.media.MediaRouter router, 397c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown android.media.MediaRouter.RouteInfo route) { 398c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown mCallback.onRouteChanged(route); 399c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 400c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 401c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown @Override 402c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onRouteGrouped(android.media.MediaRouter router, 403c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown android.media.MediaRouter.RouteInfo route, 404c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown android.media.MediaRouter.RouteGroup group, int index) { 405c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown mCallback.onRouteGrouped(route, group, index); 406c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 407c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 408c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown @Override 409c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onRouteUngrouped(android.media.MediaRouter router, 410c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown android.media.MediaRouter.RouteInfo route, 411c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown android.media.MediaRouter.RouteGroup group) { 412c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown mCallback.onRouteUngrouped(route, group); 413c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 414c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 415c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown @Override 416c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onRouteVolumeChanged(android.media.MediaRouter router, 417c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown android.media.MediaRouter.RouteInfo route) { 418c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown mCallback.onRouteVolumeChanged(route); 419c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 420c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 421c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 422c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown static class VolumeCallbackProxy<T extends VolumeCallback> 423c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown extends android.media.MediaRouter.VolumeCallback { 424c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown protected final T mCallback; 425c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 426c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public VolumeCallbackProxy(T callback) { 427c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown mCallback = callback; 428c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 429c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 430c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown @Override 431c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onVolumeSetRequest(android.media.MediaRouter.RouteInfo route, 432c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown int volume) { 433c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown mCallback.onVolumeSetRequest(route, volume); 434c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 435c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown 436c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown @Override 437c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown public void onVolumeUpdateRequest(android.media.MediaRouter.RouteInfo route, 438c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown int direction) { 439c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown mCallback.onVolumeUpdateRequest(route, direction); 440c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 441c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown } 442c21f57ed68b81a77167f1df000b0e272e1598bc0Jeff Brown} 443