CastControllerImpl.java revision af8d6c44f06d2f8baac2c5774a9efdae3fc36797
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.systemui.statusbar.policy; 18 19import android.content.Context; 20import android.media.MediaRouter; 21import android.media.MediaRouter.RouteInfo; 22 23import java.util.ArrayList; 24 25/** Platform implementation of the cast controller. **/ 26public class CastControllerImpl implements CastController { 27 28 private final ArrayList<Callback> mCallbacks = new ArrayList<Callback>(); 29 private final MediaRouter mMediaRouter; 30 31 public CastControllerImpl(Context context) { 32 mMediaRouter = (MediaRouter) context.getSystemService(Context.MEDIA_ROUTER_SERVICE); 33 } 34 35 @Override 36 public void addCallback(Callback callback) { 37 mCallbacks.add(callback); 38 } 39 40 @Override 41 public void removeCallback(Callback callback) { 42 mCallbacks.remove(callback); 43 } 44 45 @Override 46 public void setDiscovering(boolean request) { 47 if (request) { 48 mMediaRouter.addCallback(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY, 49 mMediaCallback, 50 MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY); 51 } else { 52 mMediaRouter.removeCallback(mMediaCallback); 53 } 54 } 55 56 @Override 57 public void setCurrentUserId(int currentUserId) { 58 mMediaRouter.rebindAsUser(currentUserId); 59 } 60 61 private void updateRemoteDisplays() { 62 final MediaRouter.RouteInfo connectedRoute = mMediaRouter.getSelectedRoute( 63 MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY); 64 boolean enabled = connectedRoute != null 65 && connectedRoute.matchesTypes(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY); 66 boolean connecting; 67 if (enabled) { 68 connecting = connectedRoute.isConnecting(); 69 } else { 70 connecting = false; 71 enabled = mMediaRouter.isRouteAvailable(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY, 72 MediaRouter.AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE); 73 } 74 75 String connectedRouteName = null; 76 if (connectedRoute != null) { 77 connectedRouteName = connectedRoute.getName().toString(); 78 } 79 fireStateChanged(enabled, connecting, connectedRouteName); 80 } 81 82 private void fireStateChanged(boolean enabled, boolean connecting, String connectedRouteName) { 83 for (Callback callback : mCallbacks) { 84 callback.onStateChanged(enabled, connecting, connectedRouteName); 85 } 86 } 87 88 private final MediaRouter.SimpleCallback mMediaCallback = new MediaRouter.SimpleCallback() { 89 @Override 90 public void onRouteAdded(MediaRouter router, RouteInfo route) { 91 updateRemoteDisplays(); 92 } 93 @Override 94 public void onRouteChanged(MediaRouter router, RouteInfo route) { 95 updateRemoteDisplays(); 96 } 97 @Override 98 public void onRouteRemoved(MediaRouter router, RouteInfo route) { 99 updateRemoteDisplays(); 100 } 101 @Override 102 public void onRouteSelected(MediaRouter router, int type, RouteInfo route) { 103 updateRemoteDisplays(); 104 } 105 @Override 106 public void onRouteUnselected(MediaRouter router, int type, RouteInfo route) { 107 updateRemoteDisplays(); 108 } 109 }; 110} 111