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