Do not filter receiver-driven transferable routes
All in-session transferable routes must be shown in the Output Switcher
regardless of their route features. RouterInfoMediaManager now matches
the behaviour of ManagerInfoMediaManager#getTransferableRoutes.
Test: `adb shell device_config put media_solutions
com.android.settingslib.media.flags.use_media_router2_for_info_media_manager true`
and then verify transferable routes appear in Output Switcher.
Bug: 192657812
Bug: 306391272
Change-Id: Iaaf91a623f3f62f31c2ed20fb58fe10b1a001ead
diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java
index f68eb3d..8230a82 100644
--- a/media/java/android/media/MediaRouter2.java
+++ b/media/java/android/media/MediaRouter2.java
@@ -1399,6 +1399,20 @@
}
/**
+ * Returns the unmodifiable list of transferable routes for the session.
+ *
+ * @hide
+ */
+ @NonNull
+ public List<MediaRoute2Info> getTransferableRoutes() {
+ List<String> transferableRoutes;
+ synchronized (mControllerLock) {
+ transferableRoutes = mSessionInfo.getTransferableRoutes();
+ }
+ return getRoutesWithIds(transferableRoutes);
+ }
+
+ /**
* Returns the current {@link RoutingSessionInfo} associated to this controller.
*/
@NonNull
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java
index 9ab3b47..5298a46 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/RouterInfoMediaManager.java
@@ -35,6 +35,7 @@
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
@@ -244,25 +245,25 @@
@NonNull
@Override
protected List<MediaRoute2Info> getTransferableRoutes(@NonNull String packageName) {
- List<MediaRoute2Info> transferableRoutes = new ArrayList<>();
-
List<RoutingController> controllers = mRouter.getControllers();
RoutingController activeController = controllers.get(controllers.size() - 1);
- RoutingSessionInfo sessionInfo = activeController.getRoutingSessionInfo();
- List<MediaRoute2Info> routes = mRouter.getRoutes();
+ HashMap<String, MediaRoute2Info> transferableRoutes = new HashMap<>();
- for (MediaRoute2Info route : routes) {
- boolean isCrossDeviceTransfer = sessionInfo.isSystemSession() ^ route.isSystemRoute();
+ activeController
+ .getTransferableRoutes()
+ .forEach(route -> transferableRoutes.put(route.getId(), route));
- // Always show remote routes if transfer is local -> remote or viceversa regardless of
- // whether route is in transferable routes list.
- if (sessionInfo.getTransferableRoutes().contains(route.getId())
- || isCrossDeviceTransfer) {
- transferableRoutes.add(route);
- }
+ if (activeController.getRoutingSessionInfo().isSystemSession()) {
+ mRouter.getRoutes().stream()
+ .filter(route -> !route.isSystemRoute())
+ .forEach(route -> transferableRoutes.put(route.getId(), route));
+ } else {
+ mRouter.getRoutes().stream()
+ .filter(route -> route.isSystemRoute())
+ .forEach(route -> transferableRoutes.put(route.getId(), route));
}
- return transferableRoutes;
+ return new ArrayList<>(transferableRoutes.values());
}
@Nullable