From 47d289e205d5b2149f0dff7451561114518bc36f Mon Sep 17 00:00:00 2001 From: Kyunglyul Hyun Date: Fri, 7 Feb 2020 19:24:08 +0900 Subject: [PATCH] MediaRouter: clear session info when disconnected When MediaRoute2ProviderProxy disconnects, it should clear its session info but it didn't. This CL corrects it such that sessions are released correctly. In addition to that, it also releases the previous controllers when transfer w/ MediaRouter2Manager. Test: manually Change-Id: If827a9473d79e3a154688c0dfaa3075b0e0b6ef5 --- media/java/android/media/MediaRouter2Manager.java | 14 ++++++++++++-- .../server/media/MediaRoute2ProviderProxy.java | 6 ++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java index b1f930d0f2cc4..2c1fdab9da010 100644 --- a/media/java/android/media/MediaRouter2Manager.java +++ b/media/java/android/media/MediaRouter2Manager.java @@ -247,13 +247,23 @@ public class MediaRouter2Manager { Objects.requireNonNull(packageName, "packageName must not be null"); Objects.requireNonNull(route, "route must not be null"); + boolean transferred = false; + //TODO: instead of release all controllers, add an API to specify controllers that + // should be released (or is the system controller). for (RoutingController controller : getRoutingControllers(packageName)) { - if (controller.getSessionInfo().getTransferrableRoutes().contains(route.getId())) { + if (!transferred && controller.getSessionInfo().getTransferrableRoutes() + .contains(route.getId())) { controller.transferToRoute(route); - return; + transferred = true; + } else if (!controller.getSessionInfo().isSystemSession()) { + controller.release(); } } + if (transferred) { + return; + } + Client client; synchronized (sLock) { client = mClient; diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java b/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java index d08fb71d3dee6..dd536ecd19fa4 100644 --- a/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java +++ b/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java @@ -411,6 +411,12 @@ final class MediaRoute2ProviderProxy extends MediaRoute2Provider implements Serv mActiveConnection.dispose(); mActiveConnection = null; setAndNotifyProviderState(null); + synchronized (mLock) { + for (RoutingSessionInfo sessionInfo : mSessionInfos) { + mCallback.onSessionReleased(this, sessionInfo); + } + mSessionInfos.clear(); + } } }