CastControllerImpl.java revision ccb6b9a90f228cc4e31a9442ed28756ff474c080
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 private boolean mEnabled; 32 private boolean mConnecting; 33 private String mConnectedRouteName; 34 35 public CastControllerImpl(Context context) { 36 mMediaRouter = (MediaRouter) context.getSystemService(Context.MEDIA_ROUTER_SERVICE); 37 } 38 39 @Override 40 public void addCallback(Callback callback) { 41 mCallbacks.add(callback); 42 fireStateChanged(callback); 43 } 44 45 @Override 46 public void removeCallback(Callback callback) { 47 mCallbacks.remove(callback); 48 } 49 50 @Override 51 public void setDiscovering(boolean request) { 52 if (request) { 53 mMediaRouter.addCallback(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY, 54 mMediaCallback, 55 MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY); 56 } else { 57 mMediaRouter.removeCallback(mMediaCallback); 58 } 59 } 60 61 @Override 62 public void setCurrentUserId(int currentUserId) { 63 mMediaRouter.rebindAsUser(currentUserId); 64 } 65 66 private void updateRemoteDisplays() { 67 final MediaRouter.RouteInfo connectedRoute = mMediaRouter.getSelectedRoute( 68 MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY); 69 boolean enabled = connectedRoute != null 70 && connectedRoute.matchesTypes(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY); 71 boolean connecting; 72 if (enabled) { 73 connecting = connectedRoute.isConnecting(); 74 } else { 75 connecting = false; 76 enabled = mMediaRouter.isRouteAvailable(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY, 77 MediaRouter.AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE); 78 } 79 80 String connectedRouteName = null; 81 if (connectedRoute != null) { 82 connectedRouteName = connectedRoute.getName().toString(); 83 } 84 synchronized(mCallbacks) { 85 mEnabled = enabled; 86 mConnecting = connecting; 87 mConnectedRouteName = connectedRouteName; 88 } 89 fireStateChanged(); 90 } 91 92 private void fireStateChanged() { 93 for (Callback callback : mCallbacks) { 94 fireStateChanged(callback); 95 } 96 } 97 98 private void fireStateChanged(Callback callback) { 99 synchronized(mCallbacks) { 100 callback.onStateChanged(mEnabled, mConnecting, mConnectedRouteName); 101 } 102 } 103 104 private final MediaRouter.SimpleCallback mMediaCallback = new MediaRouter.SimpleCallback() { 105 @Override 106 public void onRouteAdded(MediaRouter router, RouteInfo route) { 107 updateRemoteDisplays(); 108 } 109 @Override 110 public void onRouteChanged(MediaRouter router, RouteInfo route) { 111 updateRemoteDisplays(); 112 } 113 @Override 114 public void onRouteRemoved(MediaRouter router, RouteInfo route) { 115 updateRemoteDisplays(); 116 } 117 @Override 118 public void onRouteSelected(MediaRouter router, int type, RouteInfo route) { 119 updateRemoteDisplays(); 120 } 121 @Override 122 public void onRouteUnselected(MediaRouter router, int type, RouteInfo route) { 123 updateRemoteDisplays(); 124 } 125 }; 126} 127