Loading media/java/android/media/MediaRouter2.java +132 −144 Original line number Original line Diff line number Diff line Loading @@ -1882,12 +1882,12 @@ public final class MediaRouter2 { * <p>Proxy routers behave differently than local routers. See {@link #getInstance(Context, * <p>Proxy routers behave differently than local routers. See {@link #getInstance(Context, * String)} for more details. * String)} for more details. */ */ private class ProxyMediaRouter2Impl implements MediaRouter2Impl, MediaRouter2Manager.Callback { private class ProxyMediaRouter2Impl implements MediaRouter2Impl { // Fields originating from MediaRouter2Manager. // Fields originating from MediaRouter2Manager. private final MediaRouter2Manager mManager; private final MediaRouter2Manager mManager; private final IMediaRouter2Manager.Stub mClient; private final IMediaRouter2Manager.Stub mClient; private final CopyOnWriteArrayList<MediaRouter2Manager.TransferRequest> private final CopyOnWriteArrayList<MediaRouter2Manager.TransferRequest> mTransferRequestsMgr = new CopyOnWriteArrayList<>(); mTransferRequests = new CopyOnWriteArrayList<>(); // Fields originating from MediaRouter2. // Fields originating from MediaRouter2. @NonNull private final String mClientPackageName; @NonNull private final String mClientPackageName; Loading Loading @@ -2010,16 +2010,16 @@ public final class MediaRouter2 { public void transferTo(MediaRoute2Info route) { public void transferTo(MediaRoute2Info route) { Objects.requireNonNull(route, "route must not be null"); Objects.requireNonNull(route, "route must not be null"); List<RoutingSessionInfo> sessionInfos = getRoutingSessionsMgr(); List<RoutingSessionInfo> sessionInfos = getRoutingSessions(); RoutingSessionInfo targetSession = sessionInfos.get(sessionInfos.size() - 1); RoutingSessionInfo targetSession = sessionInfos.get(sessionInfos.size() - 1); transfer(targetSession, route); transfer(targetSession, route); } } @Override @Override public void stop() { public void stop() { List<RoutingSessionInfo> sessionInfos = getRoutingSessionsMgr(); List<RoutingSessionInfo> sessionInfos = getRoutingSessions(); RoutingSessionInfo sessionToRelease = sessionInfos.get(sessionInfos.size() - 1); RoutingSessionInfo sessionToRelease = sessionInfos.get(sessionInfos.size() - 1); releaseSessionMgr(sessionToRelease); releaseSession(sessionToRelease); } } /** /** Loading @@ -2035,8 +2035,8 @@ public final class MediaRouter2 { * * * @param sessionInfo The {@link RoutingSessionInfo routing session} to transfer. * @param sessionInfo The {@link RoutingSessionInfo routing session} to transfer. * @param route The {@link MediaRoute2Info route} to transfer to. * @param route The {@link MediaRoute2Info route} to transfer to. * @see #transferToRouteMgr(RoutingSessionInfo, MediaRoute2Info) * @see #transferToRoute(RoutingSessionInfo, MediaRoute2Info) * @see #requestCreateSessionMgr(RoutingSessionInfo, MediaRoute2Info) * @see #requestCreateSession(RoutingSessionInfo, MediaRoute2Info) */ */ @Override @Override public void transfer( public void transfer( Loading @@ -2060,9 +2060,9 @@ public final class MediaRouter2 { } } if (sessionInfo.getTransferableRoutes().contains(route.getId())) { if (sessionInfo.getTransferableRoutes().contains(route.getId())) { transferToRouteMgr(sessionInfo, route); transferToRoute(sessionInfo, route); } else { } else { requestCreateSessionMgr(sessionInfo, route); requestCreateSession(sessionInfo, route); } } } } Loading @@ -2074,7 +2074,7 @@ public final class MediaRouter2 { * RoutingSessionInfo routing session's} {@link RoutingSessionInfo#getTransferableRoutes() * RoutingSessionInfo routing session's} {@link RoutingSessionInfo#getTransferableRoutes() * transferable routes list}. Otherwise, the request will fail. * transferable routes list}. Otherwise, the request will fail. * * * <p>Use {@link #requestCreateSessionMgr(RoutingSessionInfo, MediaRoute2Info)} to request * <p>Use {@link #requestCreateSession(RoutingSessionInfo, MediaRoute2Info)} to request * an out-of-session transfer. * an out-of-session transfer. * * * @param session The {@link RoutingSessionInfo routing session} to transfer. * @param session The {@link RoutingSessionInfo routing session} to transfer. Loading @@ -2082,9 +2082,9 @@ public final class MediaRouter2 { * RoutingSessionInfo routing session's} {@link * RoutingSessionInfo routing session's} {@link * RoutingSessionInfo#getTransferableRoutes() transferable routes}. * RoutingSessionInfo#getTransferableRoutes() transferable routes}. */ */ private void transferToRouteMgr( private void transferToRoute( @NonNull RoutingSessionInfo session, @NonNull MediaRoute2Info route) { @NonNull RoutingSessionInfo session, @NonNull MediaRoute2Info route) { int requestId = createTransferRequestMgr(session, route); int requestId = createTransferRequest(session, route); try { try { mMediaRouterService.transferToRouteWithManager( mMediaRouterService.transferToRouteWithManager( Loading @@ -2102,21 +2102,21 @@ public final class MediaRouter2 { * whether the {@link MediaRoute2Info route} is one of the {@link RoutingSessionInfo current * whether the {@link MediaRoute2Info route} is one of the {@link RoutingSessionInfo current * session's} {@link RoutingSessionInfo#getTransferableRoutes() transferable routes}. * session's} {@link RoutingSessionInfo#getTransferableRoutes() transferable routes}. * * * <p>Use {@link #transferToRouteMgr(RoutingSessionInfo, MediaRoute2Info)} to request an * <p>Use {@link #transferToRoute(RoutingSessionInfo, MediaRoute2Info)} to request an * in-session transfer. * in-session transfer. * * * @param oldSession The {@link RoutingSessionInfo routing session} to transfer. * @param oldSession The {@link RoutingSessionInfo routing session} to transfer. * @param route The {@link MediaRoute2Info route} to transfer to. * @param route The {@link MediaRoute2Info route} to transfer to. */ */ private void requestCreateSessionMgr( private void requestCreateSession( @NonNull RoutingSessionInfo oldSession, @NonNull MediaRoute2Info route) { @NonNull RoutingSessionInfo oldSession, @NonNull MediaRoute2Info route) { if (TextUtils.isEmpty(oldSession.getClientPackageName())) { if (TextUtils.isEmpty(oldSession.getClientPackageName())) { Log.w(TAG, "requestCreateSessionMgr: Can't create a session without package name."); Log.w(TAG, "requestCreateSession: Can't create a session without package name."); this.onTransferFailed(oldSession, route); this.onTransferFailed(oldSession, route); return; return; } } int requestId = createTransferRequestMgr(oldSession, route); int requestId = createTransferRequest(oldSession, route); try { try { mMediaRouterService.requestCreateSessionWithManager( mMediaRouterService.requestCreateSessionWithManager( Loading @@ -2132,7 +2132,7 @@ public final class MediaRouter2 { /* Unlike local MediaRouter2 instances, controller instances cannot be kept because /* Unlike local MediaRouter2 instances, controller instances cannot be kept because transfer events initiated from other apps will not come through manager.*/ transfer events initiated from other apps will not come through manager.*/ List<RoutingSessionInfo> sessions = getRoutingSessionsMgr(); List<RoutingSessionInfo> sessions = getRoutingSessions(); for (RoutingSessionInfo session : sessions) { for (RoutingSessionInfo session : sessions) { RoutingController controller; RoutingController controller; if (session.isSystemSession()) { if (session.isSystemSession()) { Loading Loading @@ -2297,7 +2297,7 @@ public final class MediaRouter2 { boolean shouldReleaseSession, boolean shouldReleaseSession, boolean shouldNotifyStop, boolean shouldNotifyStop, RoutingController controller) { RoutingController controller) { releaseSessionMgr(controller.getRoutingSessionInfo()); releaseSession(controller.getRoutingSessionInfo()); } } @Override @Override Loading Loading @@ -2332,7 +2332,7 @@ public final class MediaRouter2 { * * * <p>Once released, a routing session ignores incoming requests. * <p>Once released, a routing session ignores incoming requests. */ */ private void releaseSessionMgr(@NonNull RoutingSessionInfo sessionInfo) { private void releaseSession(@NonNull RoutingSessionInfo sessionInfo) { Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); try { try { Loading @@ -2344,22 +2344,22 @@ public final class MediaRouter2 { } } } } private int createTransferRequestMgr( private int createTransferRequest( @NonNull RoutingSessionInfo session, @NonNull MediaRoute2Info route) { @NonNull RoutingSessionInfo session, @NonNull MediaRoute2Info route) { int requestId = mNextRequestId.getAndIncrement(); int requestId = mNextRequestId.getAndIncrement(); MediaRouter2Manager.TransferRequest transferRequest = MediaRouter2Manager.TransferRequest transferRequest = new MediaRouter2Manager.TransferRequest(requestId, session, route); new MediaRouter2Manager.TransferRequest(requestId, session, route); mTransferRequestsMgr.add(transferRequest); mTransferRequests.add(transferRequest); Message timeoutMessage = Message timeoutMessage = obtainMessage( obtainMessage( ProxyMediaRouter2Impl::handleTransferTimeoutMgr, this, transferRequest); ProxyMediaRouter2Impl::handleTransferTimeout, this, transferRequest); mHandler.sendMessageDelayed(timeoutMessage, TRANSFER_TIMEOUT_MS); mHandler.sendMessageDelayed(timeoutMessage, TRANSFER_TIMEOUT_MS); return requestId; return requestId; } } private void handleTransferTimeoutMgr(MediaRouter2Manager.TransferRequest request) { private void handleTransferTimeout(MediaRouter2Manager.TransferRequest request) { boolean removed = mTransferRequestsMgr.remove(request); boolean removed = mTransferRequests.remove(request); if (removed) { if (removed) { this.onTransferFailed(request.mOldSessionInfo, request.mTargetRoute); this.onTransferFailed(request.mOldSessionInfo, request.mTargetRoute); } } Loading @@ -2373,7 +2373,7 @@ public final class MediaRouter2 { * @see #getSystemSessionInfo() * @see #getSystemSessionInfo() */ */ @NonNull @NonNull private List<RoutingSessionInfo> getRoutingSessionsMgr() { private List<RoutingSessionInfo> getRoutingSessions() { List<RoutingSessionInfo> sessions = new ArrayList<>(); List<RoutingSessionInfo> sessions = new ArrayList<>(); sessions.add(getSystemSessionInfo()); sessions.add(getSystemSessionInfo()); Loading @@ -2392,28 +2392,76 @@ public final class MediaRouter2 { return sessions; return sessions; } } private void updateDiscoveryPreferenceOnHandler( private void onTransferred( String packageName, RouteDiscoveryPreference preference) { @NonNull RoutingSessionInfo oldSession, @NonNull RoutingSessionInfo newSession) { if (!TextUtils.equals(getClientPackageName(), packageName)) { if (!oldSession.isSystemSession() && !TextUtils.equals( getClientPackageName(), oldSession.getClientPackageName())) { return; return; } } if (preference == null) { if (!newSession.isSystemSession() && !TextUtils.equals( getClientPackageName(), newSession.getClientPackageName())) { return; return; } } synchronized (mLock) { if (Objects.equals(preference, mDiscoveryPreference)) { // For successful in-session transfer, onControllerUpdated() handles it. if (TextUtils.equals(oldSession.getId(), newSession.getId())) { return; return; } } mDiscoveryPreference = preference; updateFilteredRoutesLocked(); RoutingController oldController; if (oldSession.isSystemSession()) { mSystemController.setRoutingSessionInfo( ensureClientPackageNameForSystemSession(oldSession)); oldController = mSystemController; } else { oldController = new RoutingController(oldSession); } } notifyPreferredFeaturesChanged(preference.getPreferredFeatures()); RoutingController newController; if (newSession.isSystemSession()) { mSystemController.setRoutingSessionInfo( ensureClientPackageNameForSystemSession(newSession)); newController = mSystemController; } else { newController = new RoutingController(newSession); } notifyTransfer(oldController, newController); } private void onTransferFailed( @NonNull RoutingSessionInfo session, @NonNull MediaRoute2Info route) { if (!session.isSystemSession() && !TextUtils.equals(getClientPackageName(), session.getClientPackageName())) { return; } notifyTransferFailure(route); } } private void createSessionOnHandlerMgr(int requestId, RoutingSessionInfo sessionInfo) { private void onSessionUpdated(@NonNull RoutingSessionInfo session) { if (!session.isSystemSession() && !TextUtils.equals(getClientPackageName(), session.getClientPackageName())) { return; } RoutingController controller; if (session.isSystemSession()) { mSystemController.setRoutingSessionInfo( ensureClientPackageNameForSystemSession(session)); controller = mSystemController; } else { controller = new RoutingController(session); } notifyControllerUpdated(controller); } private void onSessionCreatedOnHandler( int requestId, @NonNull RoutingSessionInfo sessionInfo) { MediaRouter2Manager.TransferRequest matchingRequest = null; MediaRouter2Manager.TransferRequest matchingRequest = null; for (MediaRouter2Manager.TransferRequest request : mTransferRequestsMgr) { for (MediaRouter2Manager.TransferRequest request : mTransferRequests) { if (request.mRequestId == requestId) { if (request.mRequestId == requestId) { matchingRequest = request; matchingRequest = request; break; break; Loading @@ -2424,7 +2472,7 @@ public final class MediaRouter2 { return; return; } } mTransferRequestsMgr.remove(matchingRequest); mTransferRequests.remove(matchingRequest); MediaRoute2Info requestedRoute = matchingRequest.mTargetRoute; MediaRoute2Info requestedRoute = matchingRequest.mTargetRoute; Loading Loading @@ -2454,31 +2502,14 @@ public final class MediaRouter2 { } } } } private void handleFailureOnHandlerMgr(int requestId, int reason) { private void onSessionUpdatedOnHandler(@NonNull RoutingSessionInfo sessionInfo) { MediaRouter2Manager.TransferRequest matchingRequest = null; for (MediaRouter2Manager.TransferRequest request : mTransferRequests) { for (MediaRouter2Manager.TransferRequest request : mTransferRequestsMgr) { if (request.mRequestId == requestId) { matchingRequest = request; break; } } if (matchingRequest != null) { mTransferRequestsMgr.remove(matchingRequest); onTransferFailed(matchingRequest.mOldSessionInfo, matchingRequest.mTargetRoute); } else { this.onRequestFailed(reason); } } private void handleSessionsUpdatedOnHandlerMgr(RoutingSessionInfo sessionInfo) { for (MediaRouter2Manager.TransferRequest request : mTransferRequestsMgr) { String sessionId = request.mOldSessionInfo.getId(); String sessionId = request.mOldSessionInfo.getId(); if (!TextUtils.equals(sessionId, sessionInfo.getId())) { if (!TextUtils.equals(sessionId, sessionInfo.getId())) { continue; continue; } } if (sessionInfo.getSelectedRoutes().contains(request.mTargetRoute.getId())) { if (sessionInfo.getSelectedRoutes().contains(request.mTargetRoute.getId())) { mTransferRequestsMgr.remove(request); mTransferRequests.remove(request); this.onTransferred(request.mOldSessionInfo, sessionInfo); this.onTransferred(request.mOldSessionInfo, sessionInfo); break; break; } } Loading @@ -2486,115 +2517,72 @@ public final class MediaRouter2 { this.onSessionUpdated(sessionInfo); this.onSessionUpdated(sessionInfo); } } private void updateRoutesOnHandlerMgr(@NonNull List<MediaRoute2Info> routes) { private void onSessionReleasedOnHandler(@NonNull RoutingSessionInfo session) { synchronized (mLock) { if (session.isSystemSession()) { mRoutes.clear(); Log.e(TAG, "onSessionReleasedOnHandler: Called on system session. Ignoring."); for (MediaRoute2Info route : routes) { mRoutes.put(route.getId(), route); } updateFilteredRoutesLocked(); } } // MediaRouter2Manager.Callback implementation. // Note: All methods are run on main thread. @Override public void onTransferred( @NonNull RoutingSessionInfo oldSession, @NonNull RoutingSessionInfo newSession) { if (!oldSession.isSystemSession() && !TextUtils.equals( getClientPackageName(), oldSession.getClientPackageName())) { return; } if (!newSession.isSystemSession() && !TextUtils.equals( getClientPackageName(), newSession.getClientPackageName())) { return; return; } } // For successful in-session transfer, onControllerUpdated() handles it. if (!TextUtils.equals(getClientPackageName(), session.getClientPackageName())) { if (TextUtils.equals(oldSession.getId(), newSession.getId())) { return; return; } } RoutingController oldController; notifyStop(new RoutingController(session, RoutingController.CONTROLLER_STATE_RELEASED)); if (oldSession.isSystemSession()) { mSystemController.setRoutingSessionInfo( ensureClientPackageNameForSystemSession(oldSession)); oldController = mSystemController; } else { oldController = new RoutingController(oldSession); } } RoutingController newController; private void onDiscoveryPreferenceChangedOnHandler( if (newSession.isSystemSession()) { @NonNull String packageName, @Nullable RouteDiscoveryPreference preference) { mSystemController.setRoutingSessionInfo( if (!TextUtils.equals(getClientPackageName(), packageName)) { ensureClientPackageNameForSystemSession(newSession)); return; newController = mSystemController; } else { newController = new RoutingController(newSession); } } notifyTransfer(oldController, newController); if (preference == null) { return; } } synchronized (mLock) { @Override if (Objects.equals(preference, mDiscoveryPreference)) { public void onTransferFailed( @NonNull RoutingSessionInfo session, @NonNull MediaRoute2Info route) { if (!session.isSystemSession() && !TextUtils.equals(getClientPackageName(), session.getClientPackageName())) { return; return; } } notifyTransferFailure(route); mDiscoveryPreference = preference; updateFilteredRoutesLocked(); } } notifyPreferredFeaturesChanged(preference.getPreferredFeatures()); @Override public void onSessionUpdated(@NonNull RoutingSessionInfo session) { if (!session.isSystemSession() && !TextUtils.equals(getClientPackageName(), session.getClientPackageName())) { return; } } RoutingController controller; private void onRoutesUpdatedOnHandler(@NonNull List<MediaRoute2Info> routes) { if (session.isSystemSession()) { synchronized (mLock) { mSystemController.setRoutingSessionInfo( mRoutes.clear(); ensureClientPackageNameForSystemSession(session)); for (MediaRoute2Info route : routes) { controller = mSystemController; mRoutes.put(route.getId(), route); } else { controller = new RoutingController(session); } } notifyControllerUpdated(controller); updateFilteredRoutesLocked(); } } private void onSessionReleasedOnHandler(@NonNull RoutingSessionInfo session) { if (session.isSystemSession()) { Log.e(TAG, "onSessionReleasedOnHandler: Called on system session. Ignoring."); return; } } if (!TextUtils.equals(getClientPackageName(), session.getClientPackageName())) { private void onRequestFailedOnHandler(int requestId, int reason) { return; MediaRouter2Manager.TransferRequest matchingRequest = null; for (MediaRouter2Manager.TransferRequest request : mTransferRequests) { if (request.mRequestId == requestId) { matchingRequest = request; break; } } notifyStop(new RoutingController(session, RoutingController.CONTROLLER_STATE_RELEASED)); } } @Override if (matchingRequest != null) { public void onRequestFailed(int reason) { mTransferRequests.remove(matchingRequest); onTransferFailed(matchingRequest.mOldSessionInfo, matchingRequest.mTargetRoute); } else { // Does nothing. // Does nothing. } } } private class Client extends IMediaRouter2Manager.Stub { private class Client extends IMediaRouter2Manager.Stub { private static final String TAG = "MediaRouter2ManagerClient"; @Override @Override public void notifySessionCreated(int requestId, RoutingSessionInfo routingSessionInfo) { public void notifySessionCreated(int requestId, RoutingSessionInfo routingSessionInfo) { Log.w(TAG, "notifySessionCreated"); mHandler.sendMessage( mHandler.sendMessage( obtainMessage( obtainMessage( ProxyMediaRouter2Impl::createSessionOnHandlerMgr, ProxyMediaRouter2Impl::onSessionCreatedOnHandler, ProxyMediaRouter2Impl.this, ProxyMediaRouter2Impl.this, requestId, requestId, routingSessionInfo)); routingSessionInfo)); Loading @@ -2604,7 +2592,7 @@ public final class MediaRouter2 { public void notifySessionUpdated(RoutingSessionInfo routingSessionInfo) { public void notifySessionUpdated(RoutingSessionInfo routingSessionInfo) { mHandler.sendMessage( mHandler.sendMessage( obtainMessage( obtainMessage( ProxyMediaRouter2Impl::handleSessionsUpdatedOnHandlerMgr, ProxyMediaRouter2Impl::onSessionUpdatedOnHandler, ProxyMediaRouter2Impl.this, ProxyMediaRouter2Impl.this, routingSessionInfo)); routingSessionInfo)); } } Loading @@ -2623,7 +2611,7 @@ public final class MediaRouter2 { String packageName, RouteDiscoveryPreference routeDiscoveryPreference) { String packageName, RouteDiscoveryPreference routeDiscoveryPreference) { mHandler.sendMessage( mHandler.sendMessage( obtainMessage( obtainMessage( ProxyMediaRouter2Impl::updateDiscoveryPreferenceOnHandler, ProxyMediaRouter2Impl::onDiscoveryPreferenceChangedOnHandler, ProxyMediaRouter2Impl.this, ProxyMediaRouter2Impl.this, packageName, packageName, routeDiscoveryPreference)); routeDiscoveryPreference)); Loading @@ -2639,7 +2627,7 @@ public final class MediaRouter2 { public void notifyRoutesUpdated(List<MediaRoute2Info> routes) { public void notifyRoutesUpdated(List<MediaRoute2Info> routes) { mHandler.sendMessage( mHandler.sendMessage( obtainMessage( obtainMessage( ProxyMediaRouter2Impl::updateRoutesOnHandlerMgr, ProxyMediaRouter2Impl::onRoutesUpdatedOnHandler, ProxyMediaRouter2Impl.this, ProxyMediaRouter2Impl.this, routes)); routes)); } } Loading @@ -2648,7 +2636,7 @@ public final class MediaRouter2 { public void notifyRequestFailed(int requestId, int reason) { public void notifyRequestFailed(int requestId, int reason) { mHandler.sendMessage( mHandler.sendMessage( obtainMessage( obtainMessage( ProxyMediaRouter2Impl::handleFailureOnHandlerMgr, ProxyMediaRouter2Impl::onRequestFailedOnHandler, ProxyMediaRouter2Impl.this, ProxyMediaRouter2Impl.this, requestId, requestId, reason)); reason)); Loading Loading
media/java/android/media/MediaRouter2.java +132 −144 Original line number Original line Diff line number Diff line Loading @@ -1882,12 +1882,12 @@ public final class MediaRouter2 { * <p>Proxy routers behave differently than local routers. See {@link #getInstance(Context, * <p>Proxy routers behave differently than local routers. See {@link #getInstance(Context, * String)} for more details. * String)} for more details. */ */ private class ProxyMediaRouter2Impl implements MediaRouter2Impl, MediaRouter2Manager.Callback { private class ProxyMediaRouter2Impl implements MediaRouter2Impl { // Fields originating from MediaRouter2Manager. // Fields originating from MediaRouter2Manager. private final MediaRouter2Manager mManager; private final MediaRouter2Manager mManager; private final IMediaRouter2Manager.Stub mClient; private final IMediaRouter2Manager.Stub mClient; private final CopyOnWriteArrayList<MediaRouter2Manager.TransferRequest> private final CopyOnWriteArrayList<MediaRouter2Manager.TransferRequest> mTransferRequestsMgr = new CopyOnWriteArrayList<>(); mTransferRequests = new CopyOnWriteArrayList<>(); // Fields originating from MediaRouter2. // Fields originating from MediaRouter2. @NonNull private final String mClientPackageName; @NonNull private final String mClientPackageName; Loading Loading @@ -2010,16 +2010,16 @@ public final class MediaRouter2 { public void transferTo(MediaRoute2Info route) { public void transferTo(MediaRoute2Info route) { Objects.requireNonNull(route, "route must not be null"); Objects.requireNonNull(route, "route must not be null"); List<RoutingSessionInfo> sessionInfos = getRoutingSessionsMgr(); List<RoutingSessionInfo> sessionInfos = getRoutingSessions(); RoutingSessionInfo targetSession = sessionInfos.get(sessionInfos.size() - 1); RoutingSessionInfo targetSession = sessionInfos.get(sessionInfos.size() - 1); transfer(targetSession, route); transfer(targetSession, route); } } @Override @Override public void stop() { public void stop() { List<RoutingSessionInfo> sessionInfos = getRoutingSessionsMgr(); List<RoutingSessionInfo> sessionInfos = getRoutingSessions(); RoutingSessionInfo sessionToRelease = sessionInfos.get(sessionInfos.size() - 1); RoutingSessionInfo sessionToRelease = sessionInfos.get(sessionInfos.size() - 1); releaseSessionMgr(sessionToRelease); releaseSession(sessionToRelease); } } /** /** Loading @@ -2035,8 +2035,8 @@ public final class MediaRouter2 { * * * @param sessionInfo The {@link RoutingSessionInfo routing session} to transfer. * @param sessionInfo The {@link RoutingSessionInfo routing session} to transfer. * @param route The {@link MediaRoute2Info route} to transfer to. * @param route The {@link MediaRoute2Info route} to transfer to. * @see #transferToRouteMgr(RoutingSessionInfo, MediaRoute2Info) * @see #transferToRoute(RoutingSessionInfo, MediaRoute2Info) * @see #requestCreateSessionMgr(RoutingSessionInfo, MediaRoute2Info) * @see #requestCreateSession(RoutingSessionInfo, MediaRoute2Info) */ */ @Override @Override public void transfer( public void transfer( Loading @@ -2060,9 +2060,9 @@ public final class MediaRouter2 { } } if (sessionInfo.getTransferableRoutes().contains(route.getId())) { if (sessionInfo.getTransferableRoutes().contains(route.getId())) { transferToRouteMgr(sessionInfo, route); transferToRoute(sessionInfo, route); } else { } else { requestCreateSessionMgr(sessionInfo, route); requestCreateSession(sessionInfo, route); } } } } Loading @@ -2074,7 +2074,7 @@ public final class MediaRouter2 { * RoutingSessionInfo routing session's} {@link RoutingSessionInfo#getTransferableRoutes() * RoutingSessionInfo routing session's} {@link RoutingSessionInfo#getTransferableRoutes() * transferable routes list}. Otherwise, the request will fail. * transferable routes list}. Otherwise, the request will fail. * * * <p>Use {@link #requestCreateSessionMgr(RoutingSessionInfo, MediaRoute2Info)} to request * <p>Use {@link #requestCreateSession(RoutingSessionInfo, MediaRoute2Info)} to request * an out-of-session transfer. * an out-of-session transfer. * * * @param session The {@link RoutingSessionInfo routing session} to transfer. * @param session The {@link RoutingSessionInfo routing session} to transfer. Loading @@ -2082,9 +2082,9 @@ public final class MediaRouter2 { * RoutingSessionInfo routing session's} {@link * RoutingSessionInfo routing session's} {@link * RoutingSessionInfo#getTransferableRoutes() transferable routes}. * RoutingSessionInfo#getTransferableRoutes() transferable routes}. */ */ private void transferToRouteMgr( private void transferToRoute( @NonNull RoutingSessionInfo session, @NonNull MediaRoute2Info route) { @NonNull RoutingSessionInfo session, @NonNull MediaRoute2Info route) { int requestId = createTransferRequestMgr(session, route); int requestId = createTransferRequest(session, route); try { try { mMediaRouterService.transferToRouteWithManager( mMediaRouterService.transferToRouteWithManager( Loading @@ -2102,21 +2102,21 @@ public final class MediaRouter2 { * whether the {@link MediaRoute2Info route} is one of the {@link RoutingSessionInfo current * whether the {@link MediaRoute2Info route} is one of the {@link RoutingSessionInfo current * session's} {@link RoutingSessionInfo#getTransferableRoutes() transferable routes}. * session's} {@link RoutingSessionInfo#getTransferableRoutes() transferable routes}. * * * <p>Use {@link #transferToRouteMgr(RoutingSessionInfo, MediaRoute2Info)} to request an * <p>Use {@link #transferToRoute(RoutingSessionInfo, MediaRoute2Info)} to request an * in-session transfer. * in-session transfer. * * * @param oldSession The {@link RoutingSessionInfo routing session} to transfer. * @param oldSession The {@link RoutingSessionInfo routing session} to transfer. * @param route The {@link MediaRoute2Info route} to transfer to. * @param route The {@link MediaRoute2Info route} to transfer to. */ */ private void requestCreateSessionMgr( private void requestCreateSession( @NonNull RoutingSessionInfo oldSession, @NonNull MediaRoute2Info route) { @NonNull RoutingSessionInfo oldSession, @NonNull MediaRoute2Info route) { if (TextUtils.isEmpty(oldSession.getClientPackageName())) { if (TextUtils.isEmpty(oldSession.getClientPackageName())) { Log.w(TAG, "requestCreateSessionMgr: Can't create a session without package name."); Log.w(TAG, "requestCreateSession: Can't create a session without package name."); this.onTransferFailed(oldSession, route); this.onTransferFailed(oldSession, route); return; return; } } int requestId = createTransferRequestMgr(oldSession, route); int requestId = createTransferRequest(oldSession, route); try { try { mMediaRouterService.requestCreateSessionWithManager( mMediaRouterService.requestCreateSessionWithManager( Loading @@ -2132,7 +2132,7 @@ public final class MediaRouter2 { /* Unlike local MediaRouter2 instances, controller instances cannot be kept because /* Unlike local MediaRouter2 instances, controller instances cannot be kept because transfer events initiated from other apps will not come through manager.*/ transfer events initiated from other apps will not come through manager.*/ List<RoutingSessionInfo> sessions = getRoutingSessionsMgr(); List<RoutingSessionInfo> sessions = getRoutingSessions(); for (RoutingSessionInfo session : sessions) { for (RoutingSessionInfo session : sessions) { RoutingController controller; RoutingController controller; if (session.isSystemSession()) { if (session.isSystemSession()) { Loading Loading @@ -2297,7 +2297,7 @@ public final class MediaRouter2 { boolean shouldReleaseSession, boolean shouldReleaseSession, boolean shouldNotifyStop, boolean shouldNotifyStop, RoutingController controller) { RoutingController controller) { releaseSessionMgr(controller.getRoutingSessionInfo()); releaseSession(controller.getRoutingSessionInfo()); } } @Override @Override Loading Loading @@ -2332,7 +2332,7 @@ public final class MediaRouter2 { * * * <p>Once released, a routing session ignores incoming requests. * <p>Once released, a routing session ignores incoming requests. */ */ private void releaseSessionMgr(@NonNull RoutingSessionInfo sessionInfo) { private void releaseSession(@NonNull RoutingSessionInfo sessionInfo) { Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); try { try { Loading @@ -2344,22 +2344,22 @@ public final class MediaRouter2 { } } } } private int createTransferRequestMgr( private int createTransferRequest( @NonNull RoutingSessionInfo session, @NonNull MediaRoute2Info route) { @NonNull RoutingSessionInfo session, @NonNull MediaRoute2Info route) { int requestId = mNextRequestId.getAndIncrement(); int requestId = mNextRequestId.getAndIncrement(); MediaRouter2Manager.TransferRequest transferRequest = MediaRouter2Manager.TransferRequest transferRequest = new MediaRouter2Manager.TransferRequest(requestId, session, route); new MediaRouter2Manager.TransferRequest(requestId, session, route); mTransferRequestsMgr.add(transferRequest); mTransferRequests.add(transferRequest); Message timeoutMessage = Message timeoutMessage = obtainMessage( obtainMessage( ProxyMediaRouter2Impl::handleTransferTimeoutMgr, this, transferRequest); ProxyMediaRouter2Impl::handleTransferTimeout, this, transferRequest); mHandler.sendMessageDelayed(timeoutMessage, TRANSFER_TIMEOUT_MS); mHandler.sendMessageDelayed(timeoutMessage, TRANSFER_TIMEOUT_MS); return requestId; return requestId; } } private void handleTransferTimeoutMgr(MediaRouter2Manager.TransferRequest request) { private void handleTransferTimeout(MediaRouter2Manager.TransferRequest request) { boolean removed = mTransferRequestsMgr.remove(request); boolean removed = mTransferRequests.remove(request); if (removed) { if (removed) { this.onTransferFailed(request.mOldSessionInfo, request.mTargetRoute); this.onTransferFailed(request.mOldSessionInfo, request.mTargetRoute); } } Loading @@ -2373,7 +2373,7 @@ public final class MediaRouter2 { * @see #getSystemSessionInfo() * @see #getSystemSessionInfo() */ */ @NonNull @NonNull private List<RoutingSessionInfo> getRoutingSessionsMgr() { private List<RoutingSessionInfo> getRoutingSessions() { List<RoutingSessionInfo> sessions = new ArrayList<>(); List<RoutingSessionInfo> sessions = new ArrayList<>(); sessions.add(getSystemSessionInfo()); sessions.add(getSystemSessionInfo()); Loading @@ -2392,28 +2392,76 @@ public final class MediaRouter2 { return sessions; return sessions; } } private void updateDiscoveryPreferenceOnHandler( private void onTransferred( String packageName, RouteDiscoveryPreference preference) { @NonNull RoutingSessionInfo oldSession, @NonNull RoutingSessionInfo newSession) { if (!TextUtils.equals(getClientPackageName(), packageName)) { if (!oldSession.isSystemSession() && !TextUtils.equals( getClientPackageName(), oldSession.getClientPackageName())) { return; return; } } if (preference == null) { if (!newSession.isSystemSession() && !TextUtils.equals( getClientPackageName(), newSession.getClientPackageName())) { return; return; } } synchronized (mLock) { if (Objects.equals(preference, mDiscoveryPreference)) { // For successful in-session transfer, onControllerUpdated() handles it. if (TextUtils.equals(oldSession.getId(), newSession.getId())) { return; return; } } mDiscoveryPreference = preference; updateFilteredRoutesLocked(); RoutingController oldController; if (oldSession.isSystemSession()) { mSystemController.setRoutingSessionInfo( ensureClientPackageNameForSystemSession(oldSession)); oldController = mSystemController; } else { oldController = new RoutingController(oldSession); } } notifyPreferredFeaturesChanged(preference.getPreferredFeatures()); RoutingController newController; if (newSession.isSystemSession()) { mSystemController.setRoutingSessionInfo( ensureClientPackageNameForSystemSession(newSession)); newController = mSystemController; } else { newController = new RoutingController(newSession); } notifyTransfer(oldController, newController); } private void onTransferFailed( @NonNull RoutingSessionInfo session, @NonNull MediaRoute2Info route) { if (!session.isSystemSession() && !TextUtils.equals(getClientPackageName(), session.getClientPackageName())) { return; } notifyTransferFailure(route); } } private void createSessionOnHandlerMgr(int requestId, RoutingSessionInfo sessionInfo) { private void onSessionUpdated(@NonNull RoutingSessionInfo session) { if (!session.isSystemSession() && !TextUtils.equals(getClientPackageName(), session.getClientPackageName())) { return; } RoutingController controller; if (session.isSystemSession()) { mSystemController.setRoutingSessionInfo( ensureClientPackageNameForSystemSession(session)); controller = mSystemController; } else { controller = new RoutingController(session); } notifyControllerUpdated(controller); } private void onSessionCreatedOnHandler( int requestId, @NonNull RoutingSessionInfo sessionInfo) { MediaRouter2Manager.TransferRequest matchingRequest = null; MediaRouter2Manager.TransferRequest matchingRequest = null; for (MediaRouter2Manager.TransferRequest request : mTransferRequestsMgr) { for (MediaRouter2Manager.TransferRequest request : mTransferRequests) { if (request.mRequestId == requestId) { if (request.mRequestId == requestId) { matchingRequest = request; matchingRequest = request; break; break; Loading @@ -2424,7 +2472,7 @@ public final class MediaRouter2 { return; return; } } mTransferRequestsMgr.remove(matchingRequest); mTransferRequests.remove(matchingRequest); MediaRoute2Info requestedRoute = matchingRequest.mTargetRoute; MediaRoute2Info requestedRoute = matchingRequest.mTargetRoute; Loading Loading @@ -2454,31 +2502,14 @@ public final class MediaRouter2 { } } } } private void handleFailureOnHandlerMgr(int requestId, int reason) { private void onSessionUpdatedOnHandler(@NonNull RoutingSessionInfo sessionInfo) { MediaRouter2Manager.TransferRequest matchingRequest = null; for (MediaRouter2Manager.TransferRequest request : mTransferRequests) { for (MediaRouter2Manager.TransferRequest request : mTransferRequestsMgr) { if (request.mRequestId == requestId) { matchingRequest = request; break; } } if (matchingRequest != null) { mTransferRequestsMgr.remove(matchingRequest); onTransferFailed(matchingRequest.mOldSessionInfo, matchingRequest.mTargetRoute); } else { this.onRequestFailed(reason); } } private void handleSessionsUpdatedOnHandlerMgr(RoutingSessionInfo sessionInfo) { for (MediaRouter2Manager.TransferRequest request : mTransferRequestsMgr) { String sessionId = request.mOldSessionInfo.getId(); String sessionId = request.mOldSessionInfo.getId(); if (!TextUtils.equals(sessionId, sessionInfo.getId())) { if (!TextUtils.equals(sessionId, sessionInfo.getId())) { continue; continue; } } if (sessionInfo.getSelectedRoutes().contains(request.mTargetRoute.getId())) { if (sessionInfo.getSelectedRoutes().contains(request.mTargetRoute.getId())) { mTransferRequestsMgr.remove(request); mTransferRequests.remove(request); this.onTransferred(request.mOldSessionInfo, sessionInfo); this.onTransferred(request.mOldSessionInfo, sessionInfo); break; break; } } Loading @@ -2486,115 +2517,72 @@ public final class MediaRouter2 { this.onSessionUpdated(sessionInfo); this.onSessionUpdated(sessionInfo); } } private void updateRoutesOnHandlerMgr(@NonNull List<MediaRoute2Info> routes) { private void onSessionReleasedOnHandler(@NonNull RoutingSessionInfo session) { synchronized (mLock) { if (session.isSystemSession()) { mRoutes.clear(); Log.e(TAG, "onSessionReleasedOnHandler: Called on system session. Ignoring."); for (MediaRoute2Info route : routes) { mRoutes.put(route.getId(), route); } updateFilteredRoutesLocked(); } } // MediaRouter2Manager.Callback implementation. // Note: All methods are run on main thread. @Override public void onTransferred( @NonNull RoutingSessionInfo oldSession, @NonNull RoutingSessionInfo newSession) { if (!oldSession.isSystemSession() && !TextUtils.equals( getClientPackageName(), oldSession.getClientPackageName())) { return; } if (!newSession.isSystemSession() && !TextUtils.equals( getClientPackageName(), newSession.getClientPackageName())) { return; return; } } // For successful in-session transfer, onControllerUpdated() handles it. if (!TextUtils.equals(getClientPackageName(), session.getClientPackageName())) { if (TextUtils.equals(oldSession.getId(), newSession.getId())) { return; return; } } RoutingController oldController; notifyStop(new RoutingController(session, RoutingController.CONTROLLER_STATE_RELEASED)); if (oldSession.isSystemSession()) { mSystemController.setRoutingSessionInfo( ensureClientPackageNameForSystemSession(oldSession)); oldController = mSystemController; } else { oldController = new RoutingController(oldSession); } } RoutingController newController; private void onDiscoveryPreferenceChangedOnHandler( if (newSession.isSystemSession()) { @NonNull String packageName, @Nullable RouteDiscoveryPreference preference) { mSystemController.setRoutingSessionInfo( if (!TextUtils.equals(getClientPackageName(), packageName)) { ensureClientPackageNameForSystemSession(newSession)); return; newController = mSystemController; } else { newController = new RoutingController(newSession); } } notifyTransfer(oldController, newController); if (preference == null) { return; } } synchronized (mLock) { @Override if (Objects.equals(preference, mDiscoveryPreference)) { public void onTransferFailed( @NonNull RoutingSessionInfo session, @NonNull MediaRoute2Info route) { if (!session.isSystemSession() && !TextUtils.equals(getClientPackageName(), session.getClientPackageName())) { return; return; } } notifyTransferFailure(route); mDiscoveryPreference = preference; updateFilteredRoutesLocked(); } } notifyPreferredFeaturesChanged(preference.getPreferredFeatures()); @Override public void onSessionUpdated(@NonNull RoutingSessionInfo session) { if (!session.isSystemSession() && !TextUtils.equals(getClientPackageName(), session.getClientPackageName())) { return; } } RoutingController controller; private void onRoutesUpdatedOnHandler(@NonNull List<MediaRoute2Info> routes) { if (session.isSystemSession()) { synchronized (mLock) { mSystemController.setRoutingSessionInfo( mRoutes.clear(); ensureClientPackageNameForSystemSession(session)); for (MediaRoute2Info route : routes) { controller = mSystemController; mRoutes.put(route.getId(), route); } else { controller = new RoutingController(session); } } notifyControllerUpdated(controller); updateFilteredRoutesLocked(); } } private void onSessionReleasedOnHandler(@NonNull RoutingSessionInfo session) { if (session.isSystemSession()) { Log.e(TAG, "onSessionReleasedOnHandler: Called on system session. Ignoring."); return; } } if (!TextUtils.equals(getClientPackageName(), session.getClientPackageName())) { private void onRequestFailedOnHandler(int requestId, int reason) { return; MediaRouter2Manager.TransferRequest matchingRequest = null; for (MediaRouter2Manager.TransferRequest request : mTransferRequests) { if (request.mRequestId == requestId) { matchingRequest = request; break; } } notifyStop(new RoutingController(session, RoutingController.CONTROLLER_STATE_RELEASED)); } } @Override if (matchingRequest != null) { public void onRequestFailed(int reason) { mTransferRequests.remove(matchingRequest); onTransferFailed(matchingRequest.mOldSessionInfo, matchingRequest.mTargetRoute); } else { // Does nothing. // Does nothing. } } } private class Client extends IMediaRouter2Manager.Stub { private class Client extends IMediaRouter2Manager.Stub { private static final String TAG = "MediaRouter2ManagerClient"; @Override @Override public void notifySessionCreated(int requestId, RoutingSessionInfo routingSessionInfo) { public void notifySessionCreated(int requestId, RoutingSessionInfo routingSessionInfo) { Log.w(TAG, "notifySessionCreated"); mHandler.sendMessage( mHandler.sendMessage( obtainMessage( obtainMessage( ProxyMediaRouter2Impl::createSessionOnHandlerMgr, ProxyMediaRouter2Impl::onSessionCreatedOnHandler, ProxyMediaRouter2Impl.this, ProxyMediaRouter2Impl.this, requestId, requestId, routingSessionInfo)); routingSessionInfo)); Loading @@ -2604,7 +2592,7 @@ public final class MediaRouter2 { public void notifySessionUpdated(RoutingSessionInfo routingSessionInfo) { public void notifySessionUpdated(RoutingSessionInfo routingSessionInfo) { mHandler.sendMessage( mHandler.sendMessage( obtainMessage( obtainMessage( ProxyMediaRouter2Impl::handleSessionsUpdatedOnHandlerMgr, ProxyMediaRouter2Impl::onSessionUpdatedOnHandler, ProxyMediaRouter2Impl.this, ProxyMediaRouter2Impl.this, routingSessionInfo)); routingSessionInfo)); } } Loading @@ -2623,7 +2611,7 @@ public final class MediaRouter2 { String packageName, RouteDiscoveryPreference routeDiscoveryPreference) { String packageName, RouteDiscoveryPreference routeDiscoveryPreference) { mHandler.sendMessage( mHandler.sendMessage( obtainMessage( obtainMessage( ProxyMediaRouter2Impl::updateDiscoveryPreferenceOnHandler, ProxyMediaRouter2Impl::onDiscoveryPreferenceChangedOnHandler, ProxyMediaRouter2Impl.this, ProxyMediaRouter2Impl.this, packageName, packageName, routeDiscoveryPreference)); routeDiscoveryPreference)); Loading @@ -2639,7 +2627,7 @@ public final class MediaRouter2 { public void notifyRoutesUpdated(List<MediaRoute2Info> routes) { public void notifyRoutesUpdated(List<MediaRoute2Info> routes) { mHandler.sendMessage( mHandler.sendMessage( obtainMessage( obtainMessage( ProxyMediaRouter2Impl::updateRoutesOnHandlerMgr, ProxyMediaRouter2Impl::onRoutesUpdatedOnHandler, ProxyMediaRouter2Impl.this, ProxyMediaRouter2Impl.this, routes)); routes)); } } Loading @@ -2648,7 +2636,7 @@ public final class MediaRouter2 { public void notifyRequestFailed(int requestId, int reason) { public void notifyRequestFailed(int requestId, int reason) { mHandler.sendMessage( mHandler.sendMessage( obtainMessage( obtainMessage( ProxyMediaRouter2Impl::handleFailureOnHandlerMgr, ProxyMediaRouter2Impl::onRequestFailedOnHandler, ProxyMediaRouter2Impl.this, ProxyMediaRouter2Impl.this, requestId, requestId, reason)); reason)); Loading