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