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