Merge "Add new interface to get active local media session and to adjust volume" into rvc-dev
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
index 002bbec..436f2fa 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java
@@ -249,6 +249,15 @@
         return deviceList;
     }
 
+    void adjustSessionVolume(RoutingSessionInfo info, int volume) {
+        if (info == null) {
+            Log.w(TAG, "Unable to adjust session volume. RoutingSessionInfo is empty");
+            return;
+        }
+
+        mRouterManager.setSessionVolume(info, volume);
+    }
+
     /**
      * Adjust the volume of {@link android.media.RoutingSessionInfo}.
      *
@@ -352,6 +361,10 @@
         }
     }
 
+    List<RoutingSessionInfo> getActiveMediaSession() {
+        return mRouterManager.getActiveSessions();
+    }
+
     private void buildAvailableRoutes() {
         for (MediaRoute2Info route : mRouterManager.getAvailableRoutes(mPackageName)) {
             if (DEBUG) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java
index af69178..4a7a60f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java
@@ -20,6 +20,7 @@
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothProfile;
 import android.content.Context;
+import android.media.RoutingSessionInfo;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -256,22 +257,6 @@
     }
 
     /**
-     * Find the active MediaDevice.
-     *
-     * @param type the media device type.
-     * @return MediaDevice list
-     */
-    public List<MediaDevice> getActiveMediaDevice(@MediaDevice.MediaDeviceType int type) {
-        final List<MediaDevice> devices = new ArrayList<>();
-        for (MediaDevice device : mMediaDevices) {
-            if (type == device.mType && device.getClientPackageName() != null) {
-                devices.add(device);
-            }
-        }
-        return devices;
-    }
-
-    /**
      * Add a MediaDevice to let it play current media.
      *
      * @param device MediaDevice
@@ -319,6 +304,23 @@
     /**
      * Adjust the volume of session.
      *
+     * @param sessionId the value of media session id
+     * @param volume the value of volume
+     */
+    public void adjustSessionVolume(String sessionId, int volume) {
+        final List<RoutingSessionInfo> infos = getActiveMediaSession();
+        for (RoutingSessionInfo info : infos) {
+            if (TextUtils.equals(sessionId, info.getId())) {
+                mInfoMediaManager.adjustSessionVolume(info, volume);
+                return;
+            }
+        }
+        Log.w(TAG, "adjustSessionVolume: Unable to find session: " + sessionId);
+    }
+
+    /**
+     * Adjust the volume of session.
+     *
      * @param volume the value of volume
      */
     public void adjustSessionVolume(int volume) {
@@ -352,6 +354,15 @@
         return mInfoMediaManager.getSessionName();
     }
 
+    /**
+     * Gets the current active session.
+     *
+     * @return current active session list{@link android.media.RoutingSessionInfo}
+     */
+    public List<RoutingSessionInfo> getActiveMediaSession() {
+        return mInfoMediaManager.getActiveMediaSession();
+    }
+
     private MediaDevice updateCurrentConnectedDevice() {
         MediaDevice phoneMediaDevice = null;
         for (MediaDevice device : mMediaDevices) {
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 76eea67..2ed9c7b 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
@@ -416,6 +416,11 @@
     }
 
     @Test
+    public void adjustSessionVolume_routingSessionInfoIsNull_noCrash() {
+        mInfoMediaManager.adjustSessionVolume(null, 10);
+    }
+
+    @Test
     public void adjustSessionVolume_packageNameIsNull_noCrash() {
         mInfoMediaManager.mPackageName = null;
 
@@ -487,6 +492,14 @@
     }
 
     @Test
+    public void getActiveMediaSession_returnActiveSession() {
+        final List<RoutingSessionInfo> infos = new ArrayList<>();
+        mShadowRouter2Manager.setActiveSessions(infos);
+
+        assertThat(mInfoMediaManager.getActiveMediaSession()).containsExactlyElementsIn(infos);
+    }
+
+    @Test
     public void releaseSession_packageNameIsNull_returnFalse() {
         mInfoMediaManager.mPackageName = null;
 
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java
index f3b49a6..77316e9 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java
@@ -34,6 +34,7 @@
 import android.content.Context;
 import android.media.MediaRoute2Info;
 import android.media.MediaRouter2Manager;
+import android.media.RoutingSessionInfo;
 
 import com.android.settingslib.bluetooth.A2dpProfile;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
@@ -67,6 +68,7 @@
     private static final String TEST_DEVICE_ID_3 = "device_id_3";
     private static final String TEST_CURRENT_DEVICE_ID = "currentDevice_id";
     private static final String TEST_PACKAGE_NAME = "com.test.playmusic";
+    private static final String TEST_SESSION_ID = "session_id";
 
     @Mock
     private InfoMediaManager mInfoMediaManager;
@@ -526,40 +528,6 @@
     }
 
     @Test
-    public void getActiveMediaDevice_checkList() {
-        final List<MediaDevice> devices = new ArrayList<>();
-        final MediaDevice device1 = mock(MediaDevice.class);
-        final MediaDevice device2 = mock(MediaDevice.class);
-        final MediaDevice device3 = mock(MediaDevice.class);
-        device1.mType = MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE;
-        device2.mType = MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE;
-        device3.mType = MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE;
-        when(device1.getClientPackageName()).thenReturn(TEST_DEVICE_ID_1);
-        when(device2.getClientPackageName()).thenReturn(TEST_DEVICE_ID_2);
-        when(device3.getClientPackageName()).thenReturn(TEST_DEVICE_ID_3);
-        when(device1.getId()).thenReturn(TEST_DEVICE_ID_1);
-        when(device2.getId()).thenReturn(TEST_DEVICE_ID_2);
-        when(device3.getId()).thenReturn(TEST_DEVICE_ID_3);
-        devices.add(device1);
-        devices.add(device2);
-        devices.add(device3);
-        mLocalMediaManager.registerCallback(mCallback);
-        mLocalMediaManager.mMediaDeviceCallback.onDeviceListAdded(devices);
-
-        List<MediaDevice> activeDevices = mLocalMediaManager.getActiveMediaDevice(
-                MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE);
-        assertThat(activeDevices).containsExactly(device1);
-
-        activeDevices = mLocalMediaManager.getActiveMediaDevice(
-                MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
-        assertThat(activeDevices).containsExactly(device2);
-
-        activeDevices = mLocalMediaManager.getActiveMediaDevice(
-                MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE);
-        assertThat(activeDevices).containsExactly(device3);
-    }
-
-    @Test
     public void onDeviceAttributesChanged_shouldBeCalled() {
         mLocalMediaManager.registerCallback(mCallback);
 
@@ -569,6 +537,18 @@
     }
 
     @Test
+    public void getActiveMediaSession_verifyCorrectSession() {
+        final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
+        final RoutingSessionInfo info = mock(RoutingSessionInfo.class);
+        when(info.getId()).thenReturn(TEST_SESSION_ID);
+        routingSessionInfos.add(info);
+        when(mInfoMediaManager.getActiveMediaSession()).thenReturn(routingSessionInfos);
+
+        assertThat(mLocalMediaManager.getActiveMediaSession().get(0).getId())
+                .matches(TEST_SESSION_ID);
+    }
+
+    @Test
     public void onDeviceListAdded_haveDisconnectedDevice_addDisconnectedDevice() {
         final List<MediaDevice> devices = new ArrayList<>();
         final MediaDevice device1 = mock(MediaDevice.class);
@@ -721,4 +701,17 @@
         assertThat(mLocalMediaManager.mMediaDevices).hasSize(2);
         verify(mCallback).onDeviceListUpdate(any());
     }
+
+    @Test
+    public void adjustSessionVolume_verifyCorrectSessionVolume() {
+        final List<RoutingSessionInfo> routingSessionInfos = new ArrayList<>();
+        final RoutingSessionInfo info = mock(RoutingSessionInfo.class);
+        when(info.getId()).thenReturn(TEST_SESSION_ID);
+        routingSessionInfos.add(info);
+        when(mInfoMediaManager.getActiveMediaSession()).thenReturn(routingSessionInfos);
+
+        mLocalMediaManager.adjustSessionVolume(TEST_SESSION_ID, 10);
+
+        verify(mInfoMediaManager).adjustSessionVolume(info, 10);
+    }
 }