MediaRouterJellybean.java revision 24fa6c0dd42df057729e1a258388183f94da7f82
1f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock/* 2f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock * Copyright (C) 2013 The Android Open Source Project 3f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock * 4f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock * Licensed under the Apache License, Version 2.0 (the "License"); 5f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock * you may not use this file except in compliance with the License. 6f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock * You may obtain a copy of the License at 7f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock * 8f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock * http://www.apache.org/licenses/LICENSE-2.0 9f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock * 10f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock * Unless required by applicable law or agreed to in writing, software 11f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock * distributed under the License is distributed on an "AS IS" BASIS, 12f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock * See the License for the specific language governing permissions and 14f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock * limitations under the License. 15f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock */ 16f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 17cef440f2a2bb8b6e8d082d12a67dc21f2ee65e3cJeff Brownpackage android.support.v4.media.routing; 18f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 1962c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brownimport android.content.Context; 204ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brownimport android.graphics.drawable.Drawable; 21567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brownimport android.os.Build; 22f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlockimport android.util.Log; 23567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 2462c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brownimport java.lang.reflect.InvocationTargetException; 25f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlockimport java.lang.reflect.Method; 26f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlockimport java.util.ArrayList; 27f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlockimport java.util.List; 28f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 29f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlockclass MediaRouterJellybean { 30f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock private static final String TAG = "MediaRouterJellybean"; 31bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock 32f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public static final int ROUTE_TYPE_LIVE_AUDIO = 0x1; 332687550272ba061448f5d5b914700dc335299ee7Jeff Brown public static final int ROUTE_TYPE_LIVE_VIDEO = 0x2; 34f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public static final int ROUTE_TYPE_USER = 0x00800000; 35f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 3662c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public static final int ALL_ROUTE_TYPES = 3762c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown MediaRouterJellybean.ROUTE_TYPE_LIVE_AUDIO 3862c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown | MediaRouterJellybean.ROUTE_TYPE_LIVE_VIDEO 392687550272ba061448f5d5b914700dc335299ee7Jeff Brown | MediaRouterJellybean.ROUTE_TYPE_USER; 40f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 41f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public static Object getMediaRouter(Context context) { 42567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown return context.getSystemService(Context.MEDIA_ROUTER_SERVICE); 43567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 442687550272ba061448f5d5b914700dc335299ee7Jeff Brown 45f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock @SuppressWarnings({ "rawtypes", "unchecked" }) 462687550272ba061448f5d5b914700dc335299ee7Jeff Brown public static List getRoutes(Object routerObj) { 47f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock final android.media.MediaRouter router = (android.media.MediaRouter)routerObj; 48f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock final int count = router.getRouteCount(); 49f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock List out = new ArrayList(count); 50f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock for (int i = 0; i < count; i++) { 51bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock out.add(router.getRouteAt(i)); 52bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock } 53f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock return out; 5462c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 5562c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 56f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock @SuppressWarnings({ "rawtypes", "unchecked" }) 57f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public static List getCategories(Object routerObj) { 58f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock final android.media.MediaRouter router = (android.media.MediaRouter)routerObj; 59f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock final int count = router.getCategoryCount(); 60f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock List out = new ArrayList(count); 61567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown for (int i = 0; i < count; i++) { 6240e9f2922cae76ffcbc521481e5be8e80e8744efDianne Hackborn out.add(router.getCategoryAt(i)); 6362c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 64f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock return out; 65f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock } 66f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 6762c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public static Object getSelectedRoute(Object routerObj, int type) { 6862c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown return ((android.media.MediaRouter)routerObj).getSelectedRoute(type); 6962c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 7062c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 712687550272ba061448f5d5b914700dc335299ee7Jeff Brown public static void selectRoute(Object routerObj, int types, Object routeObj) { 722687550272ba061448f5d5b914700dc335299ee7Jeff Brown ((android.media.MediaRouter)routerObj).selectRoute(types, 73f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock (android.media.MediaRouter.RouteInfo)routeObj); 7462c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 7562c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 7662c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public static void addCallback(Object routerObj, int types, Object callbackObj) { 7762c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown ((android.media.MediaRouter)routerObj).addCallback(types, 782687550272ba061448f5d5b914700dc335299ee7Jeff Brown (android.media.MediaRouter.Callback)callbackObj); 792687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 802687550272ba061448f5d5b914700dc335299ee7Jeff Brown 81f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public static void removeCallback(Object routerObj, Object callbackObj) { 824ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown ((android.media.MediaRouter)routerObj).removeCallback( 83567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown (android.media.MediaRouter.Callback)callbackObj); 84f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock } 854ccb823a9f62e57f9d221f83a97e82967e79a9e5Jeff Brown 8662c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public static Object createRouteCategory(Object routerObj, 8762c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown String name, boolean isGroupable) { 8862c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown return ((android.media.MediaRouter)routerObj).createRouteCategory(name, isGroupable); 892687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 902687550272ba061448f5d5b914700dc335299ee7Jeff Brown 912687550272ba061448f5d5b914700dc335299ee7Jeff Brown public static Object createUserRoute(Object routerObj, Object categoryObj) { 922687550272ba061448f5d5b914700dc335299ee7Jeff Brown return ((android.media.MediaRouter)routerObj).createUserRoute( 932687550272ba061448f5d5b914700dc335299ee7Jeff Brown (android.media.MediaRouter.RouteCategory)categoryObj); 942687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 95f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 96f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public static void addUserRoute(Object routerObj, Object routeObj) { 97567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown ((android.media.MediaRouter)routerObj).addUserRoute( 98567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown (android.media.MediaRouter.UserRouteInfo)routeObj); 99567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 100567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 101f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public static void removeUserRoute(Object routerObj, Object routeObj) { 102f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock ((android.media.MediaRouter)routerObj).removeUserRoute( 103f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock (android.media.MediaRouter.UserRouteInfo)routeObj); 104567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 105567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 106567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown public static Object createCallback(Callback callback) { 107567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown return new CallbackProxy<Callback>(callback); 108567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 109567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 110567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown public static Object createVolumeCallback(VolumeCallback callback) { 111567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown return new VolumeCallbackProxy<VolumeCallback>(callback); 112567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 113567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 114da5b6f2dc4ba23b6b70209f9b34fb39c93a51fc4John Spurlock public static final class RouteInfo { 115567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown public static CharSequence getName(Object routeObj, Context context) { 116f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock return ((android.media.MediaRouter.RouteInfo)routeObj).getName(context); 117567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 11862c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 11962c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public static CharSequence getStatus(Object routeObj) { 12062c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getStatus(); 1212687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 1222687550272ba061448f5d5b914700dc335299ee7Jeff Brown 12362c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public static int getSupportedTypes(Object routeObj) { 12462c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getSupportedTypes(); 12562c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 12662c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 1272687550272ba061448f5d5b914700dc335299ee7Jeff Brown public static Object getCategory(Object routeObj) { 1282687550272ba061448f5d5b914700dc335299ee7Jeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getCategory(); 1292687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 13062c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 13162c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public static Drawable getIconDrawable(Object routeObj) { 13262c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getIconDrawable(); 13362c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 13462c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 13562c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public static int getPlaybackType(Object routeObj) { 13662c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getPlaybackType(); 13762c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 138f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 139f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public static int getPlaybackStream(Object routeObj) { 140567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getPlaybackStream(); 14162c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 14262c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 14362c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public static int getVolume(Object routeObj) { 144f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock return ((android.media.MediaRouter.RouteInfo)routeObj).getVolume(); 145f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock } 146567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 147567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown public static int getVolumeMax(Object routeObj) { 148567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getVolumeMax(); 149567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 150567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 151567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown public static int getVolumeHandling(Object routeObj) { 152567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getVolumeHandling(); 153567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 154f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 155f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public static Object getTag(Object routeObj) { 156567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getTag(); 157567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 158567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 159567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown public static void setTag(Object routeObj, Object tag) { 160567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown ((android.media.MediaRouter.RouteInfo)routeObj).setTag(tag); 161567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 162567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 163567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown public static void requestSetVolume(Object routeObj, int volume) { 164f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock ((android.media.MediaRouter.RouteInfo)routeObj).requestSetVolume(volume); 165567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 166567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 167567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown public static void requestUpdateVolume(Object routeObj, int direction) { 16862c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown ((android.media.MediaRouter.RouteInfo)routeObj).requestUpdateVolume(direction); 16962c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 170567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 171567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown public static Object getGroup(Object routeObj) { 172567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown return ((android.media.MediaRouter.RouteInfo)routeObj).getGroup(); 173567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 174567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 175567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown public static boolean isGroup(Object routeObj) { 176567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown return routeObj instanceof android.media.MediaRouter.RouteGroup; 177567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 178567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 179567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 180f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public static final class RouteGroup { 181f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock @SuppressWarnings({ "rawtypes", "unchecked" }) 182f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public static List getGroupedRoutes(Object groupObj) { 183f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock final android.media.MediaRouter.RouteGroup group = 184567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown (android.media.MediaRouter.RouteGroup)groupObj; 185567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown final int count = group.getRouteCount(); 1862687550272ba061448f5d5b914700dc335299ee7Jeff Brown List out = new ArrayList(count); 187f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock for (int i = 0; i < count; i++) { 188f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock out.add(group.getRouteAt(i)); 189f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock } 1902687550272ba061448f5d5b914700dc335299ee7Jeff Brown return out; 1912687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 1922687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 19362c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 19462c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public static final class UserRouteInfo { 1952687550272ba061448f5d5b914700dc335299ee7Jeff Brown public static void setName(Object routeObj, CharSequence name) { 19662c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setName(name); 19762c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 198f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 199f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public static void setStatus(Object routeObj, CharSequence status) { 200567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setStatus(status); 20162c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 20262c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 203f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public static void setIconDrawable(Object routeObj, Drawable icon) { 204f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock ((android.media.MediaRouter.UserRouteInfo)routeObj).setIconDrawable(icon); 205f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock } 2062687550272ba061448f5d5b914700dc335299ee7Jeff Brown 2072687550272ba061448f5d5b914700dc335299ee7Jeff Brown public static void setPlaybackType(Object routeObj, int type) { 2082687550272ba061448f5d5b914700dc335299ee7Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setPlaybackType(type); 2092687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 2102687550272ba061448f5d5b914700dc335299ee7Jeff Brown 2112687550272ba061448f5d5b914700dc335299ee7Jeff Brown public static void setPlaybackStream(Object routeObj, int stream) { 2122687550272ba061448f5d5b914700dc335299ee7Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setPlaybackStream(stream); 2132687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 2142687550272ba061448f5d5b914700dc335299ee7Jeff Brown 2152687550272ba061448f5d5b914700dc335299ee7Jeff Brown public static void setVolume(Object routeObj, int volume) { 2162687550272ba061448f5d5b914700dc335299ee7Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolume(volume); 2172687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 2182687550272ba061448f5d5b914700dc335299ee7Jeff Brown 2192687550272ba061448f5d5b914700dc335299ee7Jeff Brown public static void setVolumeMax(Object routeObj, int volumeMax) { 2202687550272ba061448f5d5b914700dc335299ee7Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeMax(volumeMax); 2212687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 2222687550272ba061448f5d5b914700dc335299ee7Jeff Brown 2232687550272ba061448f5d5b914700dc335299ee7Jeff Brown public static void setVolumeHandling(Object routeObj, int volumeHandling) { 2242687550272ba061448f5d5b914700dc335299ee7Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeHandling(volumeHandling); 2252687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 2262687550272ba061448f5d5b914700dc335299ee7Jeff Brown 2272687550272ba061448f5d5b914700dc335299ee7Jeff Brown public static void setVolumeCallback(Object routeObj, Object volumeCallbackObj) { 2282687550272ba061448f5d5b914700dc335299ee7Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setVolumeCallback( 2292687550272ba061448f5d5b914700dc335299ee7Jeff Brown (android.media.MediaRouter.VolumeCallback)volumeCallbackObj); 2302687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 2312687550272ba061448f5d5b914700dc335299ee7Jeff Brown 2322687550272ba061448f5d5b914700dc335299ee7Jeff Brown public static void setRemoteControlClient(Object routeObj, Object rccObj) { 2332687550272ba061448f5d5b914700dc335299ee7Jeff Brown ((android.media.MediaRouter.UserRouteInfo)routeObj).setRemoteControlClient( 2342687550272ba061448f5d5b914700dc335299ee7Jeff Brown (android.media.RemoteControlClient)rccObj); 2352687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 2362687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 2372687550272ba061448f5d5b914700dc335299ee7Jeff Brown 2382687550272ba061448f5d5b914700dc335299ee7Jeff Brown public static final class RouteCategory { 2392687550272ba061448f5d5b914700dc335299ee7Jeff Brown public static CharSequence getName(Object categoryObj, Context context) { 2402687550272ba061448f5d5b914700dc335299ee7Jeff Brown return ((android.media.MediaRouter.RouteCategory)categoryObj).getName(context); 2412687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 2422687550272ba061448f5d5b914700dc335299ee7Jeff Brown 2432687550272ba061448f5d5b914700dc335299ee7Jeff Brown @SuppressWarnings({ "rawtypes", "unchecked" }) 24462c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public static List getRoutes(Object categoryObj) { 24562c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown ArrayList out = new ArrayList(); 24662c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown ((android.media.MediaRouter.RouteCategory)categoryObj).getRoutes(out); 247f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock return out; 248f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock } 249f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 250f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public static int getSupportedTypes(Object categoryObj) { 25162c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown return ((android.media.MediaRouter.RouteCategory)categoryObj).getSupportedTypes(); 252f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock } 253bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock 254bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock public static boolean isGroupable(Object categoryObj) { 255bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock return ((android.media.MediaRouter.RouteCategory)categoryObj).isGroupable(); 256bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock } 257bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock } 258bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock 259bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock public static interface Callback { 260bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock public void onRouteSelected(int type, Object routeObj); 261bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock public void onRouteUnselected(int type, Object routeObj); 262bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock public void onRouteAdded(Object routeObj); 263bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock public void onRouteRemoved(Object routeObj); 264bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock public void onRouteChanged(Object routeObj); 265bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock public void onRouteGrouped(Object routeObj, Object groupObj, int index); 266bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock public void onRouteUngrouped(Object routeObj, Object groupObj); 267bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock public void onRouteVolumeChanged(Object routeObj); 268bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock } 269567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 270bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock public static interface VolumeCallback { 271bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock public void onVolumeSetRequest(Object routeObj, int volume); 272bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock public void onVolumeUpdateRequest(Object routeObj, int direction); 273bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock } 274bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock 275bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock /** 276bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock * Workaround for limitations of selectRoute() on JB and JB MR1. 277bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock * Do not use on JB MR2 and above. 278567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown */ 279567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown public static final class SelectRouteWorkaround { 280567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown private Method mSelectRouteIntMethod; 281567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 282567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown public SelectRouteWorkaround() { 283567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown if (Build.VERSION.SDK_INT < 16 || Build.VERSION.SDK_INT > 17) { 284567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown throw new UnsupportedOperationException(); 285567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 286567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown try { 287567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown mSelectRouteIntMethod = android.media.MediaRouter.class.getMethod( 288567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown "selectRouteInt", int.class, android.media.MediaRouter.RouteInfo.class); 289567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } catch (NoSuchMethodException ex) { 290567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 291567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 2922687550272ba061448f5d5b914700dc335299ee7Jeff Brown 2932687550272ba061448f5d5b914700dc335299ee7Jeff Brown public void selectRoute(Object routerObj, int types, Object routeObj) { 2942687550272ba061448f5d5b914700dc335299ee7Jeff Brown android.media.MediaRouter router = (android.media.MediaRouter)routerObj; 2952687550272ba061448f5d5b914700dc335299ee7Jeff Brown android.media.MediaRouter.RouteInfo route = 2962687550272ba061448f5d5b914700dc335299ee7Jeff Brown (android.media.MediaRouter.RouteInfo)routeObj; 2972687550272ba061448f5d5b914700dc335299ee7Jeff Brown 2982687550272ba061448f5d5b914700dc335299ee7Jeff Brown int routeTypes = route.getSupportedTypes(); 2992687550272ba061448f5d5b914700dc335299ee7Jeff Brown if ((routeTypes & ROUTE_TYPE_USER) == 0) { 3002687550272ba061448f5d5b914700dc335299ee7Jeff Brown // Handle non-user routes. 3012687550272ba061448f5d5b914700dc335299ee7Jeff Brown // On JB and JB MR1, the selectRoute() API only supports programmatically 3022687550272ba061448f5d5b914700dc335299ee7Jeff Brown // selecting user routes. So instead we rely on the hidden selectRouteInt() 3032687550272ba061448f5d5b914700dc335299ee7Jeff Brown // method on these versions of the platform. 3042687550272ba061448f5d5b914700dc335299ee7Jeff Brown // This limitation was removed in JB MR2. 3052687550272ba061448f5d5b914700dc335299ee7Jeff Brown if (mSelectRouteIntMethod != null) { 306bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock try { 307bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock mSelectRouteIntMethod.invoke(router, types, route); 308bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock return; // success! 309bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock } catch (IllegalAccessException ex) { 310bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock Log.w(TAG, "Cannot programmatically select non-user route. " 311bbdb062d98275f6833ebc2f0998b9e2a6534cecbJohn Spurlock + "Media routing may not work.", ex); 312f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock } catch (InvocationTargetException ex) { 313f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock Log.w(TAG, "Cannot programmatically select non-user route. " 31462c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown + "Media routing may not work.", ex); 3152687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 31662c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } else { 31762c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown Log.w(TAG, "Cannot programmatically select non-user route " 3182687550272ba061448f5d5b914700dc335299ee7Jeff Brown + "because the platform is missing the selectRouteInt() " 31962c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown + "method. Media routing may not work."); 32062c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 32162c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 32262c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 32362c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown // Default handling. 32462c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown router.selectRoute(types, route); 32540e9f2922cae76ffcbc521481e5be8e80e8744efDianne Hackborn } 32662c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 32762c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 32862c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown /** 32962c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown * Workaround the fact that the getDefaultRoute() method does not exist in JB and JB MR1. 33062c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown * Do not use on JB MR2 and above. 3312687550272ba061448f5d5b914700dc335299ee7Jeff Brown */ 33262c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public static final class GetDefaultRouteWorkaround { 33362c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown private Method mGetSystemAudioRouteMethod; 33462c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 33562c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public GetDefaultRouteWorkaround() { 33662c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown if (Build.VERSION.SDK_INT < 16 || Build.VERSION.SDK_INT > 17) { 3372687550272ba061448f5d5b914700dc335299ee7Jeff Brown throw new UnsupportedOperationException(); 33862c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 33962c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown try { 34062c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown mGetSystemAudioRouteMethod = 34162c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown android.media.MediaRouter.class.getMethod("getSystemAudioRoute"); 34262c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } catch (NoSuchMethodException ex) { 34362c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 34440e9f2922cae76ffcbc521481e5be8e80e8744efDianne Hackborn } 34562c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 34662c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public Object getDefaultRoute(Object routerObj) { 34762c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown android.media.MediaRouter router = (android.media.MediaRouter)routerObj; 34862c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 34962c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown if (mGetSystemAudioRouteMethod != null) { 35062c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown try { 35162c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown return mGetSystemAudioRouteMethod.invoke(router); 35262c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } catch (IllegalAccessException ex) { 35362c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } catch (InvocationTargetException ex) { 35462c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 35562c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 35662c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 35762c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown // Could not find the method or it does not work. 35862c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown // Return the first route and hope for the best. 35962c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown return router.getRouteAt(0); 36062c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 3612687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 36262c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 3632687550272ba061448f5d5b914700dc335299ee7Jeff Brown static class CallbackProxy<T extends Callback> 3642687550272ba061448f5d5b914700dc335299ee7Jeff Brown extends android.media.MediaRouter.Callback { 3652687550272ba061448f5d5b914700dc335299ee7Jeff Brown protected final T mCallback; 3662687550272ba061448f5d5b914700dc335299ee7Jeff Brown 3672687550272ba061448f5d5b914700dc335299ee7Jeff Brown public CallbackProxy(T callback) { 3682687550272ba061448f5d5b914700dc335299ee7Jeff Brown mCallback = callback; 3692687550272ba061448f5d5b914700dc335299ee7Jeff Brown } 3702687550272ba061448f5d5b914700dc335299ee7Jeff Brown 37162c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown @Override 37262c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public void onRouteSelected(android.media.MediaRouter router, 37362c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown int type, android.media.MediaRouter.RouteInfo route) { 37462c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown mCallback.onRouteSelected(type, route); 37562c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 37662c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 37762c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown @Override 37862c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public void onRouteUnselected(android.media.MediaRouter router, 37962c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown int type, android.media.MediaRouter.RouteInfo route) { 38062c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown mCallback.onRouteUnselected(type, route); 381f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock } 382f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 383f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock @Override 384f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public void onRouteAdded(android.media.MediaRouter router, 385f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock android.media.MediaRouter.RouteInfo route) { 386f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock mCallback.onRouteAdded(route); 387f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock } 388f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 389f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock @Override 390f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public void onRouteRemoved(android.media.MediaRouter router, 391f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock android.media.MediaRouter.RouteInfo route) { 392f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock mCallback.onRouteRemoved(route); 393f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock } 394f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 395f5df689aa65682ce9217405e4a6b686e94129e8fJohn Spurlock @Override 396f5df689aa65682ce9217405e4a6b686e94129e8fJohn Spurlock public void onRouteChanged(android.media.MediaRouter router, 397f5df689aa65682ce9217405e4a6b686e94129e8fJohn Spurlock android.media.MediaRouter.RouteInfo route) { 398f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock mCallback.onRouteChanged(route); 399f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock } 400f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 401f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock @Override 402f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public void onRouteGrouped(android.media.MediaRouter router, 403f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock android.media.MediaRouter.RouteInfo route, 404f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock android.media.MediaRouter.RouteGroup group, int index) { 405f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock mCallback.onRouteGrouped(route, group, index); 40662c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown } 40762c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 40862c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown @Override 40962c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown public void onRouteUngrouped(android.media.MediaRouter router, 41062c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown android.media.MediaRouter.RouteInfo route, 41162c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown android.media.MediaRouter.RouteGroup group) { 412f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock mCallback.onRouteUngrouped(route, group); 413f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock } 414f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 41562c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown @Override 416f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock public void onRouteVolumeChanged(android.media.MediaRouter router, 417f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock android.media.MediaRouter.RouteInfo route) { 418f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock mCallback.onRouteVolumeChanged(route); 419f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock } 420f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock } 42162c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown 42262c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown static class VolumeCallbackProxy<T extends VolumeCallback> 42362c82e4d92cc0b856059f905d81885f7808a0e7dJeff Brown extends android.media.MediaRouter.VolumeCallback { 424f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock protected final T mCallback; 425f4f6b4c8b0fcf77d46567f13b409255948fe107bJohn Spurlock 426567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown public VolumeCallbackProxy(T callback) { 427567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown mCallback = callback; 428567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 429567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 430567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown @Override 431567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown public void onVolumeSetRequest(android.media.MediaRouter.RouteInfo route, 432567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown int volume) { 433567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown mCallback.onVolumeSetRequest(route, volume); 434567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 435567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown 436567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown @Override 437567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown public void onVolumeUpdateRequest(android.media.MediaRouter.RouteInfo route, 438567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown int direction) { 439567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown mCallback.onVolumeUpdateRequest(route, direction); 440567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 441567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown } 442567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown} 443567f7ca424280ae957b04d4f3df690055f2d41dfJeff Brown