Merge "Monitor MediaRouter for remote display connections." into lmp-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
3119b82c43
@@ -23,6 +23,7 @@ import android.app.AppOpsManager;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.hardware.display.DisplayManager;
|
||||
import android.media.MediaRouter;
|
||||
import android.media.projection.IMediaProjectionManager;
|
||||
import android.media.projection.IMediaProjection;
|
||||
import android.media.projection.IMediaProjectionCallback;
|
||||
@@ -68,6 +69,10 @@ public final class MediaProjectionManagerService extends SystemService
|
||||
private final Context mContext;
|
||||
private final AppOpsManager mAppOps;
|
||||
|
||||
private final MediaRouter mMediaRouter;
|
||||
private final MediaRouterCallback mMediaRouterCallback;
|
||||
private MediaRouter.RouteInfo mMediaRouteInfo;
|
||||
|
||||
private IBinder mProjectionToken;
|
||||
private MediaProjection mProjectionGrant;
|
||||
|
||||
@@ -77,6 +82,8 @@ public final class MediaProjectionManagerService extends SystemService
|
||||
mDeathEaters = new ArrayMap<IBinder, IBinder.DeathRecipient>();
|
||||
mCallbackDelegate = new CallbackDelegate();
|
||||
mAppOps = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
|
||||
mMediaRouter = (MediaRouter) mContext.getSystemService(Context.MEDIA_ROUTER_SERVICE);
|
||||
mMediaRouterCallback = new MediaRouterCallback();
|
||||
Watchdog.getInstance().addMonitor(this);
|
||||
}
|
||||
|
||||
@@ -84,6 +91,12 @@ public final class MediaProjectionManagerService extends SystemService
|
||||
public void onStart() {
|
||||
publishBinderService(Context.MEDIA_PROJECTION_SERVICE, new BinderService(),
|
||||
false /*allowIsolated*/);
|
||||
mMediaRouter.addCallback(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY, mMediaRouterCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSwitchUser(int userId) {
|
||||
mMediaRouter.rebindAsUser(userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -95,6 +108,9 @@ public final class MediaProjectionManagerService extends SystemService
|
||||
if (mProjectionGrant != null) {
|
||||
mProjectionGrant.stop();
|
||||
}
|
||||
if (mMediaRouteInfo != null) {
|
||||
mMediaRouter.getDefaultRoute().select();
|
||||
}
|
||||
mProjectionToken = projection.asBinder();
|
||||
mProjectionGrant = projection;
|
||||
dispatchStart(projection);
|
||||
@@ -448,6 +464,27 @@ public final class MediaProjectionManagerService extends SystemService
|
||||
}
|
||||
}
|
||||
|
||||
private class MediaRouterCallback extends MediaRouter.SimpleCallback {
|
||||
@Override
|
||||
public void onRouteSelected(MediaRouter router, int type, MediaRouter.RouteInfo info) {
|
||||
synchronized (mLock) {
|
||||
if ((type & MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY) != 0) {
|
||||
mMediaRouteInfo = info;
|
||||
if (mProjectionGrant != null) {
|
||||
mProjectionGrant.stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRouteUnselected(MediaRouter route, int type, MediaRouter.RouteInfo info) {
|
||||
if (mMediaRouteInfo == info) {
|
||||
mMediaRouteInfo = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static class CallbackDelegate {
|
||||
private Map<IBinder, IMediaProjectionCallback> mClientCallbacks;
|
||||
|
||||
Reference in New Issue
Block a user