Merge "[Output Switcher] Disable volume control if route is volume_fixed" into tm-dev am: 25639f1b6d

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18756771

Change-Id: Ic11bc62236f85cdb873c1dc25b10232251a5d3d8
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java
index c29d188..c829bc3 100644
--- a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java
@@ -33,6 +33,7 @@
 
 import static com.android.settingslib.media.LocalMediaManager.MediaDeviceState.STATE_SELECTED;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 import android.media.MediaRoute2Info;
@@ -268,6 +269,20 @@
     }
 
     /**
+     * Checks if route's volume is fixed, if true, we should disable volume control for the device.
+     *
+     * @return route for this device is fixed.
+     */
+    @SuppressLint("NewApi")
+    public boolean isVolumeFixed() {
+        if (mRouteInfo == null) {
+            Log.w(TAG, "RouteInfo is empty, regarded as volume fixed.");
+            return true;
+        }
+        return mRouteInfo.getVolumeHandling() == MediaRoute2Info.PLAYBACK_VOLUME_FIXED;
+    }
+
+    /**
      * Transfer MediaDevice for media
      *
      * @return result of transfer media
diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java
index e372be3..42e9af8 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java
@@ -932,8 +932,9 @@
     }
 
     boolean isVolumeControlEnabled(@NonNull MediaDevice device) {
-        return isPlayBackInfoLocal()
-                || device.getDeviceType() != MediaDevice.MediaDeviceType.TYPE_CAST_GROUP_DEVICE;
+        return (isPlayBackInfoLocal()
+                || device.getDeviceType() != MediaDevice.MediaDeviceType.TYPE_CAST_GROUP_DEVICE)
+                && !device.isVolumeFixed();
     }
 
     @Override
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java
index edc45ee..feed334 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java
@@ -571,4 +571,24 @@
 
         assertThat(mMediaOutputController.getNotificationIcon()).isNull();
     }
+
+    @Test
+    public void isVolumeControlEnabled_isCastWithVolumeFixed_returnsFalse() {
+        when(mMediaDevice1.getDeviceType()).thenReturn(
+                MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
+
+        when(mMediaDevice1.isVolumeFixed()).thenReturn(true);
+
+        assertThat(mMediaOutputController.isVolumeControlEnabled(mMediaDevice1)).isFalse();
+    }
+
+    @Test
+    public void isVolumeControlEnabled_isCastWithVolumeNotFixed_returnsTrue() {
+        when(mMediaDevice1.getDeviceType()).thenReturn(
+                MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
+
+        when(mMediaDevice1.isVolumeFixed()).thenReturn(false);
+
+        assertThat(mMediaOutputController.isVolumeControlEnabled(mMediaDevice1)).isTrue();
+    }
 }