Make MediaRouter2Manager provide correct system routes info

System route info could be changed per different apps. For example,
when a BT headset is connected, if a media app call
MediaRouter.selectRoute(defaultRoute) via Jetpack lib, the app will use
the phone speaker while the other media apps use the BT headset.

System UI should be changed depends on this CL.

Bug: 156549746
Test: atest mediaroutertest
      atest CtsMediaTestCases:android.media.cts.SystemMediaRouter2Test
Ignore-AOSP-First: AOSP doesn't have SystemMediaRouter2Test
Change-Id: Ie24f97023b7113a2b59f0b55ab7b4230b394e9bd
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
index 3c43f4a6..dd8f604 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
@@ -112,11 +112,9 @@
      */
     boolean connectDeviceWithoutPackageName(MediaDevice device) {
         boolean isConnected = false;
-        final List<RoutingSessionInfo> infos = mRouterManager.getActiveSessions();
-        if (infos.size() > 0) {
-            final RoutingSessionInfo info = infos.get(0);
+        final RoutingSessionInfo info = mRouterManager.getSystemRoutingSession(null);
+        if (info != null) {
             mRouterManager.transfer(info, device.mRouteInfo);
-
             isConnected = true;
         }
         return isConnected;
@@ -414,7 +412,10 @@
     }
 
     List<RoutingSessionInfo> getActiveMediaSession() {
-        return mRouterManager.getActiveSessions();
+        List<RoutingSessionInfo> infos = new ArrayList<>();
+        infos.add(mRouterManager.getSystemRoutingSession(null));
+        infos.addAll(mRouterManager.getRemoteSessions());
+        return infos;
     }
 
     private void buildAvailableRoutes() {
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java
index 0d03f33..2d53831 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java
@@ -237,7 +237,7 @@
 
         final List<RoutingSessionInfo> infos = new ArrayList<>();
 
-        mShadowRouter2Manager.setActiveSessions(infos);
+        mShadowRouter2Manager.setRemoteSessions(infos);
 
         assertThat(mInfoMediaManager.connectDeviceWithoutPackageName(device)).isFalse();
     }
@@ -525,10 +525,18 @@
 
     @Test
     public void getActiveMediaSession_returnActiveSession() {
+        RoutingSessionInfo sysSessionInfo = mock(RoutingSessionInfo.class);
         final List<RoutingSessionInfo> infos = new ArrayList<>();
-        mShadowRouter2Manager.setActiveSessions(infos);
+        infos.add(mock(RoutingSessionInfo.class));
+        final List<RoutingSessionInfo> activeSessionInfos = new ArrayList<>();
+        activeSessionInfos.add(sysSessionInfo);
+        activeSessionInfos.addAll(infos);
 
-        assertThat(mInfoMediaManager.getActiveMediaSession()).containsExactlyElementsIn(infos);
+        mShadowRouter2Manager.setSystemRoutingSession(sysSessionInfo);
+        mShadowRouter2Manager.setRemoteSessions(infos);
+
+        assertThat(mInfoMediaManager.getActiveMediaSession())
+                .containsExactlyElementsIn(activeSessionInfos);
     }
 
     @Test
diff --git a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowRouter2Manager.java b/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowRouter2Manager.java
index 5959863..dac8142 100644
--- a/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowRouter2Manager.java
+++ b/packages/SettingsLib/tests/robotests/testutils/com/android/settingslib/testutils/shadow/ShadowRouter2Manager.java
@@ -16,6 +16,7 @@
 package com.android.settingslib.testutils.shadow;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.media.MediaRoute2Info;
 import android.media.MediaRouter2Manager;
 import android.media.RoutingSessionInfo;
@@ -33,8 +34,9 @@
     private List<MediaRoute2Info> mAvailableRoutes;
     private List<MediaRoute2Info> mAllRoutes;
     private List<MediaRoute2Info> mDeselectableRoutes;
-    private List<RoutingSessionInfo> mActiveSessions;
+    private List<RoutingSessionInfo> mRemoteSessions;
     private List<RoutingSessionInfo> mRoutingSessions;
+    private RoutingSessionInfo mSystemRoutingSession;
 
     @Implementation
     protected List<MediaRoute2Info> getAvailableRoutes(String packageName) {
@@ -55,12 +57,12 @@
     }
 
     @Implementation
-    protected List<RoutingSessionInfo> getActiveSessions() {
-        return mActiveSessions;
+    protected List<RoutingSessionInfo> getRemoteSessions() {
+        return mRemoteSessions;
     }
 
-    public void setActiveSessions(List<RoutingSessionInfo> infos) {
-        mActiveSessions = infos;
+    public void setRemoteSessions(List<RoutingSessionInfo> infos) {
+        mRemoteSessions = infos;
     }
 
     @Implementation
@@ -73,6 +75,15 @@
     }
 
     @Implementation
+    public RoutingSessionInfo getSystemRoutingSession(@Nullable String packageName) {
+        return mSystemRoutingSession;
+    }
+
+    public void setSystemRoutingSession(RoutingSessionInfo sessionInfo) {
+        mSystemRoutingSession = sessionInfo;
+    }
+
+    @Implementation
     public List<MediaRoute2Info> getDeselectableRoutes(@NonNull RoutingSessionInfo sessionInfo) {
         return mDeselectableRoutes;
     }
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 54fb647..b9eec6e 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -554,6 +554,7 @@
 
     <!-- Permission required for CTS test - SystemMediaRouter2Test -->
     <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
+    <uses-permission android:name="android.permission.MODIFY_AUDIO_ROUTING" />
 
     <!-- Permission required for CTS test - CtsRotationResolverServiceDeviceTestCases -->
     <uses-permission android:name="android.permission.MANAGE_ROTATION_RESOLVER" />