diff options
4 files changed, 95 insertions, 20 deletions
diff --git a/media/java/android/media/IMediaRouter2Manager.aidl b/media/java/android/media/IMediaRouter2Manager.aidl index 5925d380115c..5113dc2058e0 100644 --- a/media/java/android/media/IMediaRouter2Manager.aidl +++ b/media/java/android/media/IMediaRouter2Manager.aidl @@ -24,8 +24,9 @@ import android.media.RoutingSessionInfo; * {@hide} */ oneway interface IMediaRouter2Manager { - void notifySessionCreated(int requestId, in RoutingSessionInfo sessionInfo); - void notifySessionUpdated(in RoutingSessionInfo sessionInfo); + void notifySessionCreated(int requestId, in RoutingSessionInfo session); + void notifySessionUpdated(in RoutingSessionInfo session); + void notifySessionReleased(in RoutingSessionInfo session); void notifyPreferredFeaturesChanged(String packageName, in List<String> preferredFeatures); void notifyRoutesAdded(in List<MediaRoute2Info> routes); void notifyRoutesRemoved(in List<MediaRoute2Info> routes); diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java index 673fffe710a2..1c2d581b733d 100644 --- a/media/java/android/media/MediaRouter2Manager.java +++ b/media/java/android/media/MediaRouter2Manager.java @@ -509,7 +509,7 @@ public final class MediaRouter2Manager { notifyRequestFailed(reason); } - void handleSessionsUpdated(RoutingSessionInfo sessionInfo) { + void handleSessionsUpdatedOnHandler(RoutingSessionInfo sessionInfo) { for (TransferRequest request : mTransferRequests) { String sessionId = request.mOldSessionInfo.getId(); if (!TextUtils.equals(sessionId, sessionInfo.getId())) { @@ -551,6 +551,12 @@ public final class MediaRouter2Manager { } } + void notifySessionReleased(RoutingSessionInfo session) { + for (CallbackRecord record : mCallbackRecords) { + record.mExecutor.execute(() -> record.mCallback.onSessionReleased(session)); + } + } + void notifyRequestFailed(int reason) { for (CallbackRecord record : mCallbackRecords) { record.mExecutor.execute(() -> record.mCallback.onRequestFailed(reason)); @@ -864,9 +870,16 @@ public final class MediaRouter2Manager { /** * Called when a session is changed. - * @param sessionInfo the updated session + * @param session the updated session + */ + public void onSessionUpdated(@NonNull RoutingSessionInfo session) {} + + /** + * Called when a session is released. + * @param session the released session. + * @see #releaseSession(RoutingSessionInfo) */ - public void onSessionUpdated(@NonNull RoutingSessionInfo sessionInfo) {} + public void onSessionReleased(@NonNull RoutingSessionInfo session) {} /** * Called when media is transferred. @@ -946,15 +959,21 @@ public final class MediaRouter2Manager { class Client extends IMediaRouter2Manager.Stub { @Override - public void notifySessionCreated(int requestId, RoutingSessionInfo sessionInfo) { + public void notifySessionCreated(int requestId, RoutingSessionInfo session) { mHandler.sendMessage(obtainMessage(MediaRouter2Manager::createSessionOnHandler, - MediaRouter2Manager.this, requestId, sessionInfo)); + MediaRouter2Manager.this, requestId, session)); + } + + @Override + public void notifySessionUpdated(RoutingSessionInfo session) { + mHandler.sendMessage(obtainMessage(MediaRouter2Manager::handleSessionsUpdatedOnHandler, + MediaRouter2Manager.this, session)); } @Override - public void notifySessionUpdated(RoutingSessionInfo sessionInfo) { - mHandler.sendMessage(obtainMessage(MediaRouter2Manager::handleSessionsUpdated, - MediaRouter2Manager.this, sessionInfo)); + public void notifySessionReleased(RoutingSessionInfo session) { + mHandler.sendMessage(obtainMessage(MediaRouter2Manager::notifySessionReleased, + MediaRouter2Manager.this, session)); } @Override diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java index 356acdcc9dd8..957558107de9 100644 --- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java +++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java @@ -281,17 +281,19 @@ public class MediaRouter2ManagerTest { } @Test - public void testGetRoutingControllers() throws Exception { + public void testGetRoutingSessions() throws Exception { CountDownLatch latch = new CountDownLatch(1); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); + MediaRoute2Info routeToSelect = routes.get(ROUTE_ID1); + addRouterCallback(new RouteCallback() {}); addManagerCallback(new MediaRouter2Manager.Callback() { @Override public void onTransferred(RoutingSessionInfo oldSessionInfo, RoutingSessionInfo newSessionInfo) { if (TextUtils.equals(mPackageName, newSessionInfo.getClientPackageName()) - && newSessionInfo.getSelectedRoutes().contains(ROUTE_ID1)) { + && newSessionInfo.getSelectedRoutes().contains(routeToSelect.getId())) { latch.countDown(); } } @@ -299,11 +301,10 @@ public class MediaRouter2ManagerTest { assertEquals(1, mManager.getRoutingSessions(mPackageName).size()); - mManager.selectRoute(mPackageName, routes.get(ROUTE_ID1)); - latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS); + mManager.selectRoute(mPackageName, routeToSelect); + assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); List<RoutingSessionInfo> sessions = mManager.getRoutingSessions(mPackageName); - assertEquals(2, sessions.size()); RoutingSessionInfo sessionInfo = sessions.get(1); @@ -344,6 +345,47 @@ public class MediaRouter2ManagerTest { assertTrue(onTransferFailedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); } + @Test + public void testRouterRelease_managerGetRoutingSessions() throws Exception { + CountDownLatch transferLatch = new CountDownLatch(1); + CountDownLatch releaseLatch = new CountDownLatch(1); + + Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); + MediaRoute2Info routeToSelect = routes.get(ROUTE_ID1); + assertNotNull(routeToSelect); + + addRouterCallback(new RouteCallback() {}); + addManagerCallback(new MediaRouter2Manager.Callback() { + @Override + public void onTransferred(RoutingSessionInfo oldSessionInfo, + RoutingSessionInfo newSessionInfo) { + if (TextUtils.equals(mPackageName, newSessionInfo.getClientPackageName()) + && newSessionInfo.getSelectedRoutes().contains(routeToSelect.getId())) { + transferLatch.countDown(); + } + } + @Override + public void onSessionReleased(RoutingSessionInfo session) { + releaseLatch.countDown(); + } + }); + + assertEquals(1, mManager.getRoutingSessions(mPackageName).size()); + assertEquals(1, mRouter2.getControllers().size()); + + mManager.transfer(mManager.getRoutingSessions(mPackageName).get(0), routeToSelect); + assertTrue(transferLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); + + assertEquals(2, mManager.getRoutingSessions(mPackageName).size()); + assertEquals(2, mRouter2.getControllers().size()); + mRouter2.getControllers().get(1).release(); + + assertTrue(releaseLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); + + assertEquals(1, mRouter2.getControllers().size()); + assertEquals(1, mManager.getRoutingSessions(mPackageName).size()); + } + /** * Tests select, transfer, release of routes of a provider */ diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java index 0e997155e7af..c12f89c25a9e 100644 --- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java @@ -1583,7 +1583,7 @@ class MediaRouter2ServiceImpl { private void onSessionInfoChangedOnHandler(@NonNull MediaRoute2Provider provider, @NonNull RoutingSessionInfo sessionInfo) { List<IMediaRouter2Manager> managers = getManagers(); - notifySessionInfoChangedToManagers(managers, sessionInfo); + notifySessionUpdatedToManagers(managers, sessionInfo); // For system provider, notify all routers. if (provider == mSystemProvider) { @@ -1608,7 +1608,7 @@ class MediaRouter2ServiceImpl { private void onSessionReleasedOnHandler(@NonNull MediaRoute2Provider provider, @NonNull RoutingSessionInfo sessionInfo) { List<IMediaRouter2Manager> managers = getManagers(); - notifySessionInfoChangedToManagers(managers, sessionInfo); + notifySessionReleasedToManagers(managers, sessionInfo); RouterRecord routerRecord = mSessionToRouterMap.get(sessionInfo.getId()); if (routerRecord == null) { @@ -1913,15 +1913,28 @@ class MediaRouter2ServiceImpl { } } - private void notifySessionInfoChangedToManagers( + private void notifySessionUpdatedToManagers( @NonNull List<IMediaRouter2Manager> managers, @NonNull RoutingSessionInfo sessionInfo) { for (IMediaRouter2Manager manager : managers) { try { manager.notifySessionUpdated(sessionInfo); } catch (RemoteException ex) { - Slog.w(TAG, "notifySessionInfosChangedToManagers: " - + "failed to notify. Manager probably died.", ex); + Slog.w(TAG, "notifySessionUpdatedToManagers: " + + "Failed to notify. Manager probably died.", ex); + } + } + } + + private void notifySessionReleasedToManagers( + @NonNull List<IMediaRouter2Manager> managers, + @NonNull RoutingSessionInfo sessionInfo) { + for (IMediaRouter2Manager manager : managers) { + try { + manager.notifySessionReleased(sessionInfo); + } catch (RemoteException ex) { + Slog.w(TAG, "notifySessionReleasedToManagers: " + + "Failed to notify. Manager probably died.", ex); } } } |