Add isVolumeFixed to AudioManagerCompat

Bug: 194239360
Relnote: Add isVolumeFixed to AudioManagerCompat
Test: AudioManagerCompatTest
Change-Id: I26d0f7d38a43fdb6d42c53586a205209be10141b
diff --git a/media/media/api/current.txt b/media/media/api/current.txt
index e82dbe2..bee633f 100644
--- a/media/media/api/current.txt
+++ b/media/media/api/current.txt
@@ -596,6 +596,7 @@
     method public static int abandonAudioFocusRequest(android.media.AudioManager, androidx.media.AudioFocusRequestCompat);
     method @IntRange(from=0) public static int getStreamMaxVolume(android.media.AudioManager, int);
     method @IntRange(from=0) public static int getStreamMinVolume(android.media.AudioManager, int);
+    method public static boolean isVolumeFixed(android.media.AudioManager);
     method public static int requestAudioFocus(android.media.AudioManager, androidx.media.AudioFocusRequestCompat);
     field public static final int AUDIOFOCUS_GAIN = 1; // 0x1
     field public static final int AUDIOFOCUS_GAIN_TRANSIENT = 2; // 0x2
diff --git a/media/media/api/public_plus_experimental_current.txt b/media/media/api/public_plus_experimental_current.txt
index e82dbe2..bee633f 100644
--- a/media/media/api/public_plus_experimental_current.txt
+++ b/media/media/api/public_plus_experimental_current.txt
@@ -596,6 +596,7 @@
     method public static int abandonAudioFocusRequest(android.media.AudioManager, androidx.media.AudioFocusRequestCompat);
     method @IntRange(from=0) public static int getStreamMaxVolume(android.media.AudioManager, int);
     method @IntRange(from=0) public static int getStreamMinVolume(android.media.AudioManager, int);
+    method public static boolean isVolumeFixed(android.media.AudioManager);
     method public static int requestAudioFocus(android.media.AudioManager, androidx.media.AudioFocusRequestCompat);
     field public static final int AUDIOFOCUS_GAIN = 1; // 0x1
     field public static final int AUDIOFOCUS_GAIN_TRANSIENT = 2; // 0x2
diff --git a/media/media/api/restricted_current.txt b/media/media/api/restricted_current.txt
index bd39a46..5fea5ac 100644
--- a/media/media/api/restricted_current.txt
+++ b/media/media/api/restricted_current.txt
@@ -619,6 +619,7 @@
     method public static int abandonAudioFocusRequest(android.media.AudioManager, androidx.media.AudioFocusRequestCompat);
     method @IntRange(from=0) public static int getStreamMaxVolume(android.media.AudioManager, @androidx.core.app.NotificationCompat.StreamType int);
     method @IntRange(from=0) public static int getStreamMinVolume(android.media.AudioManager, @androidx.core.app.NotificationCompat.StreamType int);
+    method public static boolean isVolumeFixed(android.media.AudioManager);
     method public static int requestAudioFocus(android.media.AudioManager, androidx.media.AudioFocusRequestCompat);
     field public static final int AUDIOFOCUS_GAIN = 1; // 0x1
     field public static final int AUDIOFOCUS_GAIN_TRANSIENT = 2; // 0x2
diff --git a/media/media/src/main/java/androidx/media/AudioManagerCompat.java b/media/media/src/main/java/androidx/media/AudioManagerCompat.java
index 8215406..aaec259 100644
--- a/media/media/src/main/java/androidx/media/AudioManagerCompat.java
+++ b/media/media/src/main/java/androidx/media/AudioManagerCompat.java
@@ -155,11 +155,38 @@
         }
     }
 
+    /**
+     * Indicates if the device implements a fixed volume policy.
+     *
+     * <p>Some devices may not have volume control and may operate at a fixed volume, and may not
+     * enable muting or changing the volume of audio streams. This method will return {@code true}
+     * on such devices.
+     *
+     * <p>Compatibility: It returns {@code false} on API level below 21.
+     */
+    public static boolean isVolumeFixed(@NonNull AudioManager audioManager) {
+        if (Build.VERSION.SDK_INT >= 21) {
+            return Api21Impl.isVolumeFixed(audioManager);
+        } else {
+            return false;
+        }
+    }
+
     private AudioManagerCompat() {}
 
+    @RequiresApi(21)
+    private static class Api21Impl {
+
+        @DoNotInline
+        static boolean isVolumeFixed(AudioManager audioManager) {
+            return audioManager.isVolumeFixed();
+        }
+
+        private Api21Impl() {}
+    }
+
     @RequiresApi(26)
     private static class Api26Impl {
-        private Api26Impl() {}
 
         @DoNotInline
         static int abandonAudioFocusRequest(AudioManager audioManager,
@@ -171,15 +198,18 @@
         static int requestAudioFocus(AudioManager audioManager, AudioFocusRequest focusRequest) {
             return audioManager.requestAudioFocus(focusRequest);
         }
+
+        private Api26Impl() {}
     }
 
     @RequiresApi(28)
     private static class Api28Impl {
-        private Api28Impl() {}
 
         @DoNotInline
         static int getStreamMinVolume(AudioManager audioManager, int streamType) {
             return audioManager.getStreamMinVolume(streamType);
         }
+
+        private Api28Impl() {}
     }
 }
diff --git a/media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/AudioManagerCompatTest.java b/media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/AudioManagerCompatTest.java
index 8f6c15a..0b6faa1 100644
--- a/media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/AudioManagerCompatTest.java
+++ b/media/version-compat-tests/current/client/src/androidTest/java/android/support/mediacompat/client/AudioManagerCompatTest.java
@@ -17,6 +17,7 @@
 package android.support.mediacompat.client;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 
 import android.content.Context;
 import android.media.AudioManager;
@@ -67,4 +68,18 @@
     public void getStreamMinVolume_underP_returnsZero() {
         assertEquals(0, AudioManagerCompat.getStreamMinVolume(mAudioManager, mStreamType));
     }
+
+    @SdkSuppress(minSdkVersion = 21)
+    @Test
+    public void isVolumeFixed_fromApi21_returnsIsVolumeFixed() {
+        assertEquals(
+                mAudioManager.isVolumeFixed(),
+                AudioManagerCompat.isVolumeFixed(mAudioManager));
+    }
+
+    @SdkSuppress(maxSdkVersion = 20)
+    @Test
+    public void isVolumeFixed_underApi21_returnsFalse() {
+        assertFalse(AudioManagerCompat.isVolumeFixed(mAudioManager));
+    }
 }