Merge "MediaRouter: make route controllers return route info"
diff --git a/media/java/android/media/MediaRoute2Info.java b/media/java/android/media/MediaRoute2Info.java
index d919d78..506d616 100644
--- a/media/java/android/media/MediaRoute2Info.java
+++ b/media/java/android/media/MediaRoute2Info.java
@@ -195,11 +195,15 @@
     private String createUniqueId() {
         String uniqueId = null;
         if (mProviderId != null) {
-            uniqueId = mProviderId + ":" + mId;
+            uniqueId = toUniqueId(mProviderId, mId);
         }
         return uniqueId;
     }
 
+    static String toUniqueId(String providerId, String routeId) {
+        return providerId + ":" + routeId;
+    }
+
     /**
      * Returns true if the route info has all of the required field.
      * A route info only obtained from {@link com.android.server.media.MediaRouterService}
diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java
index 046a8bb..600e630 100644
--- a/media/java/android/media/MediaRouter2.java
+++ b/media/java/android/media/MediaRouter2.java
@@ -110,7 +110,7 @@
 
     private final String mPackageName;
     @GuardedBy("sLock")
-    private final Map<String, MediaRoute2Info> mRoutes = new HashMap<>();
+    final Map<String, MediaRoute2Info> mRoutes = new HashMap<>();
 
     @GuardedBy("sLock")
     private List<String> mControlCategories = Collections.emptyList();
@@ -678,8 +678,6 @@
      * A class to control media route session in media route provider.
      * For example, selecting/deselcting/transferring routes to session can be done through this
      * class. Instances are created by {@link MediaRouter2}.
-     *
-     * @hide
      */
     public final class RouteSessionController {
         private final Object mLock = new Object();
@@ -724,42 +722,42 @@
         }
 
         /**
-         * @return the unmodifiable list of IDs of currently selected routes
+         * @return the unmodifiable list of currently selected routes
          */
         @NonNull
-        public List<String> getSelectedRoutes() {
+        public List<MediaRoute2Info> getSelectedRoutes() {
             synchronized (mLock) {
-                return Collections.unmodifiableList(mSessionInfo.getSelectedRoutes());
+                return getRoutesWithIdsLocked(mSessionInfo.getSelectedRoutes());
             }
         }
 
         /**
-         * @return the unmodifiable list of IDs of selectable routes for the session.
+         * @return the unmodifiable list of selectable routes for the session.
          */
         @NonNull
-        public List<String> getSelectableRoutes() {
+        public List<MediaRoute2Info> getSelectableRoutes() {
             synchronized (mLock) {
-                return Collections.unmodifiableList(mSessionInfo.getSelectableRoutes());
+                return getRoutesWithIdsLocked(mSessionInfo.getSelectableRoutes());
             }
         }
 
         /**
-         * @return the unmodifiable list of IDs of deselectable routes for the session.
+         * @return the unmodifiable list of deselectable routes for the session.
          */
         @NonNull
-        public List<String> getDeselectableRoutes() {
+        public List<MediaRoute2Info> getDeselectableRoutes() {
             synchronized (mLock) {
-                return Collections.unmodifiableList(mSessionInfo.getDeselectableRoutes());
+                return getRoutesWithIdsLocked(mSessionInfo.getDeselectableRoutes());
             }
         }
 
         /**
-         * @return the unmodifiable list of IDs of transferrable routes for the session.
+         * @return the unmodifiable list of transferrable routes for the session.
          */
         @NonNull
-        public List<String> getTransferrableRoutes() {
+        public List<MediaRoute2Info> getTransferrableRoutes() {
             synchronized (mLock) {
-                return Collections.unmodifiableList(mSessionInfo.getTransferrableRoutes());
+                return getRoutesWithIdsLocked(mSessionInfo.getTransferrableRoutes());
             }
         }
 
@@ -784,7 +782,7 @@
          * @see #getSelectedRoutes()
          * @see SessionCallback#onSessionInfoChanged
          */
-        public void selectRoute(MediaRoute2Info route) {
+        public void selectRoute(@NonNull MediaRoute2Info route) {
             // TODO: Implement this when the actual connection logic is implemented.
         }
 
@@ -796,7 +794,7 @@
          * @see #getSelectedRoutes()
          * @see SessionCallback#onSessionInfoChanged
          */
-        public void deselectRoute(MediaRoute2Info route) {
+        public void deselectRoute(@NonNull MediaRoute2Info route) {
             // TODO: Implement this when the actual connection logic is implemented.
         }
 
@@ -817,6 +815,20 @@
             }
             // TODO: Use stopMedia variable when the actual connection logic is implemented.
         }
+
+        private List<MediaRoute2Info> getRoutesWithIdsLocked(List<String> routeIds) {
+            List<MediaRoute2Info> routes = new ArrayList<>();
+            synchronized (mLock) {
+                for (String routeId : routeIds) {
+                    MediaRoute2Info route = mRoutes.get(
+                            MediaRoute2Info.toUniqueId(mSessionInfo.mProviderId, routeId));
+                    if (route != null) {
+                        routes.add(route);
+                    }
+                }
+            }
+            return Collections.unmodifiableList(routes);
+        }
     }
 
     final class RouteCallbackRecord {
diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java
index 6e79dd1..0c4c437 100644
--- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java
+++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2Test.java
@@ -260,7 +260,7 @@
             @Override
             public void onSessionCreated(RouteSessionController controller) {
                 assertNotNull(controller);
-                assertTrue(controller.getSelectedRoutes().contains(ROUTE_ID1));
+                assertTrue(createRouteMap(controller.getSelectedRoutes()).containsKey(ROUTE_ID1));
                 assertTrue(TextUtils.equals(CATEGORY_SAMPLE, controller.getControlCategory()));
                 successLatch.countDown();
             }
@@ -384,8 +384,8 @@
             RouteSessionController controller2 = createdControllers.get(1);
 
             assertNotEquals(controller1.getSessionId(), controller2.getSessionId());
-            assertTrue(controller1.getSelectedRoutes().contains(ROUTE_ID1));
-            assertTrue(controller2.getSelectedRoutes().contains(ROUTE_ID2));
+            assertTrue(createRouteMap(controller1.getSelectedRoutes()).containsKey(ROUTE_ID1));
+            assertTrue(createRouteMap(controller2.getSelectedRoutes()).containsKey(ROUTE_ID2));
             assertTrue(TextUtils.equals(CATEGORY_SAMPLE, controller1.getControlCategory()));
             assertTrue(TextUtils.equals(CATEGORY_SAMPLE, controller2.getControlCategory()));
         } finally {