From e224e3420ce94290ec8f8e7cc0995b1921ec30ce Mon Sep 17 00:00:00 2001 From: Kyunglyul Hyun Date: Wed, 9 Jun 2021 07:36:54 +0000 Subject: [PATCH] Hide non transferable routes As non-transferable routes don't look valid targets as "seamless transfer", this CL hides those from the output switcher. Bug: 189803271 Test: Manually Change-Id: If2dc86e9a8e1af323e282ae65f70b04c52b996a6 --- .../android/media/MediaRouter2Manager.java | 58 ++++++++++++++++++- .../settingslib/media/InfoMediaManager.java | 4 +- 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java index 915cb1272040f..628f7eef84f9a 100644 --- a/media/java/android/media/MediaRouter2Manager.java +++ b/media/java/android/media/MediaRouter2Manager.java @@ -221,9 +221,23 @@ public final class MediaRouter2Manager { Objects.requireNonNull(packageName, "packageName must not be null"); List sessions = getRoutingSessions(packageName); - return getAvailableRoutesForRoutingSession(sessions.get(sessions.size() - 1)); + return getAvailableRoutes(sessions.get(sessions.size() - 1)); } + /** + * Gets routes that can be transferable seamlessly for an application. + * + * @param packageName the package name of the application + */ + @NonNull + public List getTransferableRoutes(@NonNull String packageName) { + Objects.requireNonNull(packageName, "packageName must not be null"); + + List sessions = getRoutingSessions(packageName); + return getTransferableRoutes(sessions.get(sessions.size() - 1)); + } + + /** * Gets available routes for the given routing session. * The returned routes can be passed to @@ -232,8 +246,7 @@ public final class MediaRouter2Manager { * @param sessionInfo the routing session that would be transferred */ @NonNull - public List getAvailableRoutesForRoutingSession( - @NonNull RoutingSessionInfo sessionInfo) { + public List getAvailableRoutes(@NonNull RoutingSessionInfo sessionInfo) { Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); List routes = new ArrayList<>(); @@ -255,6 +268,45 @@ public final class MediaRouter2Manager { return routes; } + /** + * Gets routes that can be transferable seamlessly for the given routing session. + * The returned routes can be passed to + * {@link #transfer(RoutingSessionInfo, MediaRoute2Info)} for transferring the routing session. + *

+ * This includes routes that are {@link RoutingSessionInfo#getTransferableRoutes() transferable} + * by provider itself and routes that are different playback type (e.g. local/remote) + * from the given routing session. + * + * @param sessionInfo the routing session that would be transferred + */ + @NonNull + public List getTransferableRoutes(@NonNull RoutingSessionInfo sessionInfo) { + Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); + + List routes = new ArrayList<>(); + + String packageName = sessionInfo.getClientPackageName(); + List preferredFeatures = mPreferredFeaturesMap.get(packageName); + if (preferredFeatures == null) { + preferredFeatures = Collections.emptyList(); + } + synchronized (mRoutesLock) { + for (MediaRoute2Info route : mRoutes.values()) { + if (sessionInfo.getSelectedRoutes().contains(route.getId()) + || sessionInfo.getTransferableRoutes().contains(route.getId())) { + routes.add(route); + continue; + } + // Add Phone -> Cast and Cast -> Phone + if (route.hasAnyFeatures(preferredFeatures) + && (sessionInfo.isSystemSession() ^ route.isSystemRoute())) { + routes.add(route); + } + } + } + return routes; + } + /** * Returns the preferred features of the specified package name. */ diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index 6b1e282ecdd89..79446e430d4fd 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -372,7 +372,7 @@ public class InfoMediaManager extends MediaManager { Log.w(TAG, "shouldDisableMediaOutput() package name is null or empty!"); return false; } - final List infos = mRouterManager.getAvailableRoutes(packageName); + final List infos = mRouterManager.getTransferableRoutes(packageName); if (infos.size() == 1) { final MediaRoute2Info info = infos.get(0); final int deviceType = info.getType(); @@ -456,7 +456,7 @@ public class InfoMediaManager extends MediaManager { } private void buildAvailableRoutes() { - for (MediaRoute2Info route : mRouterManager.getAvailableRoutes(mPackageName)) { + for (MediaRoute2Info route : mRouterManager.getTransferableRoutes(mPackageName)) { if (DEBUG) { Log.d(TAG, "buildAvailableRoutes() route : " + route.getName() + ", volume : " + route.getVolume() + ", type : " + route.getType());