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