diff options
16 files changed, 435 insertions, 209 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 32b170a6286b..ee91f280e8ed 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -7336,7 +7336,15 @@ package android.media { public class AudioDeviceVolumeManager { method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED}) public android.media.VolumeInfo getDeviceVolume(@NonNull android.media.VolumeInfo, @NonNull android.media.AudioDeviceAttributes); + method @FlaggedApi("android.media.audio.unify_absolute_volume_management") @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, "android.permission.QUERY_AUDIO_STATE", android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED}) public int getDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes); method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED}) public void setDeviceVolume(@NonNull android.media.VolumeInfo, @NonNull android.media.AudioDeviceAttributes); + method @FlaggedApi("android.media.audio.unify_absolute_volume_management") @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED}) public void setDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes, int); + field @FlaggedApi("android.media.audio.unify_absolute_volume_management") public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE = 3; // 0x3 + field @FlaggedApi("android.media.audio.unify_absolute_volume_management") public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY = 5; // 0x5 + field @FlaggedApi("android.media.audio.unify_absolute_volume_management") public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE = 4; // 0x4 + field @FlaggedApi("android.media.audio.unify_absolute_volume_management") public static final int DEVICE_VOLUME_BEHAVIOR_FIXED = 2; // 0x2 + field @FlaggedApi("android.media.audio.unify_absolute_volume_management") public static final int DEVICE_VOLUME_BEHAVIOR_FULL = 1; // 0x1 + field @FlaggedApi("android.media.audio.unify_absolute_volume_management") public static final int DEVICE_VOLUME_BEHAVIOR_VARIABLE = 0; // 0x0 } public final class AudioFocusInfo implements android.os.Parcelable { @@ -7381,7 +7389,7 @@ package android.media { method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List<android.media.audiopolicy.AudioVolumeGroup> getAudioVolumeGroups(); method @NonNull @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public android.media.AudioRecord getCallDownlinkExtractionAudioRecord(@NonNull android.media.AudioFormat); method @NonNull @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public android.media.AudioTrack getCallUplinkInjectionAudioTrack(@NonNull android.media.AudioFormat); - method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, "android.permission.QUERY_AUDIO_STATE", android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED}) public int getDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes); + method @Deprecated @FlaggedApi("android.media.audio.unify_absolute_volume_management") @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, "android.permission.QUERY_AUDIO_STATE", android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED}) public int getDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes); method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, "android.permission.QUERY_AUDIO_STATE"}) public java.util.List<android.media.AudioDeviceAttributes> getDevicesForAttributes(@NonNull android.media.AudioAttributes); method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) public java.util.List<java.lang.Integer> getIndependentStreamTypes(); method @RequiresPermission("android.permission.QUERY_AUDIO_STATE") public int getLastAudibleStreamVolume(int); @@ -7427,7 +7435,7 @@ package android.media { method public void setAudioServerStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.AudioServerStateCallback); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setBluetoothVariableLatencyEnabled(boolean); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setDeviceAsNonDefaultForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull android.media.AudioDeviceAttributes); - method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED}) public void setDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes, int); + method @Deprecated @FlaggedApi("android.media.audio.unify_absolute_volume_management") @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED}) public void setDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes, int); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setFocusRequestResult(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDeviceForCapturePreset(int, @NonNull android.media.AudioDeviceAttributes); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull android.media.AudioDeviceAttributes); @@ -7447,12 +7455,12 @@ package android.media { field public static final int AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS = 2; // 0x2 field @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int DEVICE_CONNECTION_STATE_CONNECTED = 1; // 0x1 field @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int DEVICE_CONNECTION_STATE_DISCONNECTED = 0; // 0x0 - field public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE = 3; // 0x3 - field public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY = 5; // 0x5 - field public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE = 4; // 0x4 - field public static final int DEVICE_VOLUME_BEHAVIOR_FIXED = 2; // 0x2 - field public static final int DEVICE_VOLUME_BEHAVIOR_FULL = 1; // 0x1 - field public static final int DEVICE_VOLUME_BEHAVIOR_VARIABLE = 0; // 0x0 + field @Deprecated @FlaggedApi("android.media.audio.unify_absolute_volume_management") public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE = 3; // 0x3 + field @Deprecated @FlaggedApi("android.media.audio.unify_absolute_volume_management") public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY = 5; // 0x5 + field @Deprecated @FlaggedApi("android.media.audio.unify_absolute_volume_management") public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE = 4; // 0x4 + field @Deprecated @FlaggedApi("android.media.audio.unify_absolute_volume_management") public static final int DEVICE_VOLUME_BEHAVIOR_FIXED = 2; // 0x2 + field @Deprecated @FlaggedApi("android.media.audio.unify_absolute_volume_management") public static final int DEVICE_VOLUME_BEHAVIOR_FULL = 1; // 0x1 + field @Deprecated @FlaggedApi("android.media.audio.unify_absolute_volume_management") public static final int DEVICE_VOLUME_BEHAVIOR_VARIABLE = 0; // 0x0 field public static final String EXTRA_VOLUME_STREAM_TYPE = "android.media.EXTRA_VOLUME_STREAM_TYPE"; field public static final String EXTRA_VOLUME_STREAM_VALUE = "android.media.EXTRA_VOLUME_STREAM_VALUE"; field public static final int FLAG_BLUETOOTH_ABS_VOLUME = 64; // 0x40 diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 12bfccf2172c..7cef40738082 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1955,6 +1955,10 @@ package android.media { method public static void enforceValidAudioDeviceTypeOut(int); } + public class AudioDeviceVolumeManager { + method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.QUERY_AUDIO_STATE, android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED}) public boolean isFullVolumeDevice(); + } + public final class AudioFocusRequest { method @Nullable public android.media.AudioManager.OnAudioFocusChangeListener getOnAudioFocusChangeListener(); } @@ -2010,7 +2014,6 @@ package android.media { method @NonNull public android.media.VolumePolicy getVolumePolicy(); method public boolean hasRegisteredDynamicPolicy(); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) public boolean isCsdEnabled(); - method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.QUERY_AUDIO_STATE, android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED}) public boolean isFullVolumeDevice(); method @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public boolean isPstnCallAudioInterceptable(); method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) public boolean isVolumeControlUsingVolumeGroups(); method public void permissionUpdateBarrier(); diff --git a/media/java/android/media/AudioDeviceVolumeManager.java b/media/java/android/media/AudioDeviceVolumeManager.java index 56d3df3b2555..311d64f6c7e8 100644 --- a/media/java/android/media/AudioDeviceVolumeManager.java +++ b/media/java/android/media/AudioDeviceVolumeManager.java @@ -29,6 +29,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.content.Context; import android.os.IBinder; import android.os.RemoteException; @@ -52,6 +53,127 @@ public class AudioDeviceVolumeManager { private static final String TAG = "AudioDeviceVolumeManager"; + /** + * @hide + * Volume behavior for an audio device that has no particular volume behavior set. Invalid as + * an argument to {@link #setDeviceVolumeBehavior(AudioDeviceAttributes, int)} and should not + * be returned by {@link #getDeviceVolumeBehavior(AudioDeviceAttributes)}. + */ + public static final int DEVICE_VOLUME_BEHAVIOR_UNSET = -1; + /** + * @hide + * Volume behavior for an audio device where a software attenuation is applied + * @see #setDeviceVolumeBehavior(AudioDeviceAttributes, int) + */ + @SystemApi + @FlaggedApi(FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT) + public static final int DEVICE_VOLUME_BEHAVIOR_VARIABLE = 0; + /** + * @hide + * Volume behavior for an audio device where the volume is always set to provide no attenuation + * nor gain (e.g. unit gain). + * @see #setDeviceVolumeBehavior(AudioDeviceAttributes, int) + */ + @SystemApi + @FlaggedApi(FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT) + public static final int DEVICE_VOLUME_BEHAVIOR_FULL = 1; + /** + * @hide + * Volume behavior for an audio device where the volume is either set to muted, or to provide + * no attenuation nor gain (e.g. unit gain). + * @see #setDeviceVolumeBehavior(AudioDeviceAttributes, int) + */ + @SystemApi + @FlaggedApi(FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT) + public static final int DEVICE_VOLUME_BEHAVIOR_FIXED = 2; + /** + * @hide + * Volume behavior for an audio device where no software attenuation is applied, and + * the volume is kept synchronized between the host and the device itself through a + * device-specific protocol such as BT AVRCP. + * @see #setDeviceVolumeBehavior(AudioDeviceAttributes, int) + */ + @SystemApi + @FlaggedApi(FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT) + public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE = 3; + /** + * @hide + * Volume behavior for an audio device where no software attenuation is applied, and + * the volume is kept synchronized between the host and the device itself through a + * device-specific protocol (such as for hearing aids), based on the audio mode (e.g. + * normal vs in phone call). + * @see AudioManager#setMode(int) + * @see #setDeviceVolumeBehavior(AudioDeviceAttributes, int) + */ + @SystemApi + @FlaggedApi(FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT) + public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE = 4; + + /** + * @hide + * A variant of {@link #DEVICE_VOLUME_BEHAVIOR_ABSOLUTE} where the host cannot reliably set + * the volume percentage of the audio device. Specifically, {@link AudioManager#setStreamVolume} + * will have no effect, or an unreliable effect. + */ + @SystemApi + @FlaggedApi(FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT) + public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY = 5; + + /** @hide */ + @IntDef({ + DEVICE_VOLUME_BEHAVIOR_VARIABLE, + DEVICE_VOLUME_BEHAVIOR_FULL, + DEVICE_VOLUME_BEHAVIOR_FIXED, + DEVICE_VOLUME_BEHAVIOR_ABSOLUTE, + DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE, + DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface DeviceVolumeBehavior {} + + /** @hide */ + @IntDef({ + DEVICE_VOLUME_BEHAVIOR_UNSET, + DEVICE_VOLUME_BEHAVIOR_VARIABLE, + DEVICE_VOLUME_BEHAVIOR_FULL, + DEVICE_VOLUME_BEHAVIOR_FIXED, + DEVICE_VOLUME_BEHAVIOR_ABSOLUTE, + DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE, + DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface DeviceVolumeBehaviorState {} + + /** + * Variants of absolute volume behavior that are set in for absolute volume management. + * @hide + */ + @IntDef({ + DEVICE_VOLUME_BEHAVIOR_ABSOLUTE, + DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AbsoluteDeviceVolumeBehavior {} + + /** + * @hide + * Throws IAE on an invalid volume behavior value + * @param volumeBehavior behavior value to check + */ + public static void enforceValidVolumeBehavior(int volumeBehavior) { + switch (volumeBehavior) { + case DEVICE_VOLUME_BEHAVIOR_VARIABLE: + case DEVICE_VOLUME_BEHAVIOR_FULL: + case DEVICE_VOLUME_BEHAVIOR_FIXED: + case DEVICE_VOLUME_BEHAVIOR_ABSOLUTE: + case DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE: + case DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY: + return; + default: + throw new IllegalArgumentException("Illegal volume behavior " + volumeBehavior); + } + } + /** @hide * Indicates no special treatment in the handling of the volume adjustment */ public static final int ADJUST_MODE_NORMAL = 0; @@ -158,7 +280,7 @@ public class AudioDeviceVolumeManager { android.Manifest.permission.BLUETOOTH_PRIVILEGED }) public void register(boolean register, @NonNull AudioDeviceAttributes device, @NonNull List<VolumeInfo> volumes, boolean handlesVolumeAdjustment, - @AudioManager.AbsoluteDeviceVolumeBehavior int behavior) { + @AbsoluteDeviceVolumeBehavior int behavior) { try { getService().registerDeviceVolumeDispatcherForAbsoluteVolume(register, this, mPackageName, @@ -204,6 +326,94 @@ public class AudioDeviceVolumeManager { /** * @hide + * Sets the volume behavior for an audio output device. + * @see #DEVICE_VOLUME_BEHAVIOR_VARIABLE + * @see #DEVICE_VOLUME_BEHAVIOR_FULL + * @see #DEVICE_VOLUME_BEHAVIOR_FIXED + * @see #DEVICE_VOLUME_BEHAVIOR_ABSOLUTE + * @see #DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE + * @param device the device to be affected + * @param deviceVolumeBehavior one of the device behaviors + */ + @SystemApi + @RequiresPermission(anyOf = { + Manifest.permission.MODIFY_AUDIO_ROUTING, + Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED + }) + @FlaggedApi(FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT) + public void setDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device, + @DeviceVolumeBehavior int deviceVolumeBehavior) { + // verify arguments (validity of device type is enforced in server) + Objects.requireNonNull(device); + enforceValidVolumeBehavior(deviceVolumeBehavior); + // communicate with service + final IAudioService service = getService(); + try { + service.setDeviceVolumeBehavior(device, deviceVolumeBehavior, mPackageName); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * @hide + * Returns the volume device behavior for the given audio device + * @param device the audio device + * @return the volume behavior for the device + */ + @SystemApi + @RequiresPermission(anyOf = { + Manifest.permission.MODIFY_AUDIO_ROUTING, + Manifest.permission.QUERY_AUDIO_STATE, + Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED + }) + @FlaggedApi(FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT) + public @DeviceVolumeBehavior int getDeviceVolumeBehavior( + @NonNull AudioDeviceAttributes device) { + // verify arguments (validity of device type is enforced in server) + Objects.requireNonNull(device); + // communicate with service + final IAudioService service = getService(); + try { + return service.getDeviceVolumeBehavior(device); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * @hide + * Returns {@code true} if the volume device behavior is {@link #DEVICE_VOLUME_BEHAVIOR_FULL}. + */ + @TestApi + @RequiresPermission(anyOf = { + Manifest.permission.MODIFY_AUDIO_ROUTING, + Manifest.permission.QUERY_AUDIO_STATE, + Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED + }) + @SuppressWarnings("UnflaggedApi") // @TestApi without associated feature. + public boolean isFullVolumeDevice() { + final AudioAttributes attributes = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_MEDIA) + .build(); + List<AudioDeviceAttributes> devices; + final IAudioService service = getService(); + try { + devices = service.getDevicesForAttributes(attributes); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + + for (AudioDeviceAttributes device : devices) { + if (getDeviceVolumeBehavior(device) == DEVICE_VOLUME_BEHAVIOR_FULL) { + return true; + } + } + return false; + } + + /** + * @hide * Configures a device to use absolute volume model, and registers a listener for receiving * volume updates to apply on that device * @param device the audio device set to absolute volume mode @@ -297,7 +507,7 @@ public class AudioDeviceVolumeManager { @NonNull @CallbackExecutor Executor executor, @NonNull OnAudioDeviceVolumeChangedListener vclistener) { baseSetDeviceAbsoluteMultiVolumeBehavior(device, volumes, executor, vclistener, - handlesVolumeAdjustment, AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE); + handlesVolumeAdjustment, DEVICE_VOLUME_BEHAVIOR_ABSOLUTE); } /** @@ -355,12 +565,12 @@ public class AudioDeviceVolumeManager { @NonNull @CallbackExecutor Executor executor, @NonNull OnAudioDeviceVolumeChangedListener vclistener) { baseSetDeviceAbsoluteMultiVolumeBehavior(device, volumes, executor, vclistener, - handlesVolumeAdjustment, AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY); + handlesVolumeAdjustment, DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY); } /** * Base method for configuring a device to use absolute volume behavior, or one of its variants. - * See {@link AudioManager.AbsoluteDeviceVolumeBehavior} for a list of allowed behaviors. + * See {@link AbsoluteDeviceVolumeBehavior} for a list of allowed behaviors. * * @param behavior the variant of absolute device volume behavior to adopt */ @@ -372,7 +582,7 @@ public class AudioDeviceVolumeManager { @NonNull @CallbackExecutor Executor executor, @NonNull OnAudioDeviceVolumeChangedListener vclistener, boolean handlesVolumeAdjustment, - @AudioManager.AbsoluteDeviceVolumeBehavior int behavior) { + @AbsoluteDeviceVolumeBehavior int behavior) { Objects.requireNonNull(device); Objects.requireNonNull(volumes); Objects.requireNonNull(executor); @@ -417,7 +627,7 @@ public class AudioDeviceVolumeManager { */ void onDeviceVolumeBehaviorChanged( @NonNull AudioDeviceAttributes device, - @AudioManager.DeviceVolumeBehavior int volumeBehavior); + @DeviceVolumeBehavior int volumeBehavior); } /** @@ -580,19 +790,19 @@ public class AudioDeviceVolumeManager { * @param behavior one of the volume behaviors defined in AudioManager * @return a string for the given behavior */ - public static String volumeBehaviorName(@AudioManager.DeviceVolumeBehavior int behavior) { + public static String volumeBehaviorName(@DeviceVolumeBehavior int behavior) { switch (behavior) { - case AudioManager.DEVICE_VOLUME_BEHAVIOR_VARIABLE: + case DEVICE_VOLUME_BEHAVIOR_VARIABLE: return "DEVICE_VOLUME_BEHAVIOR_VARIABLE"; - case AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL: + case DEVICE_VOLUME_BEHAVIOR_FULL: return "DEVICE_VOLUME_BEHAVIOR_FULL"; - case AudioManager.DEVICE_VOLUME_BEHAVIOR_FIXED: + case DEVICE_VOLUME_BEHAVIOR_FIXED: return "DEVICE_VOLUME_BEHAVIOR_FIXED"; - case AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE: + case DEVICE_VOLUME_BEHAVIOR_ABSOLUTE: return "DEVICE_VOLUME_BEHAVIOR_ABSOLUTE"; - case AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE: + case DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE: return "DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE"; - case AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY: + case DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY: return "DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY"; default: return "invalid volume behavior " + behavior; @@ -611,7 +821,7 @@ public class AudioDeviceVolumeManager { @Override public void dispatchDeviceVolumeBehaviorChanged(@NonNull AudioDeviceAttributes device, - @AudioManager.DeviceVolumeBehavior int volumeBehavior) { + @DeviceVolumeBehavior int volumeBehavior) { mDeviceVolumeBehaviorChangedListenerMgr.callListeners((listener) -> listener.onDeviceVolumeBehaviorChanged(device, volumeBehavior)); } diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 32af7c6fca68..4aba491c291e 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -19,6 +19,7 @@ package android.media; import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT; import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_AUDIO; import static android.content.Context.DEVICE_ID_DEFAULT; +import static android.media.audio.Flags.FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT; import static android.media.audio.Flags.autoPublicVolumeApiHardening; import static android.media.audio.Flags.cacheGetStreamMinMaxVolume; import static android.media.audio.Flags.cacheGetStreamVolume; @@ -6659,24 +6660,30 @@ public class AudioManager { * @hide * Volume behavior for an audio device where a software attenuation is applied * @see #setDeviceVolumeBehavior(AudioDeviceAttributes, int) + * @deprecated use {@link AudioDeviceVolumeManager#DEVICE_VOLUME_BEHAVIOR_VARIABLE} instead */ @SystemApi + @FlaggedApi(FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT) public static final int DEVICE_VOLUME_BEHAVIOR_VARIABLE = 0; /** * @hide * Volume behavior for an audio device where the volume is always set to provide no attenuation * nor gain (e.g. unit gain). * @see #setDeviceVolumeBehavior(AudioDeviceAttributes, int) + * @deprecated use {@link AudioDeviceVolumeManager#DEVICE_VOLUME_BEHAVIOR_FULL} instead */ @SystemApi + @FlaggedApi(FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT) public static final int DEVICE_VOLUME_BEHAVIOR_FULL = 1; /** * @hide * Volume behavior for an audio device where the volume is either set to muted, or to provide * no attenuation nor gain (e.g. unit gain). * @see #setDeviceVolumeBehavior(AudioDeviceAttributes, int) + * @deprecated use {@link AudioDeviceVolumeManager#DEVICE_VOLUME_BEHAVIOR_FIXED} instead */ @SystemApi + @FlaggedApi(FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT) public static final int DEVICE_VOLUME_BEHAVIOR_FIXED = 2; /** * @hide @@ -6684,8 +6691,10 @@ public class AudioManager { * the volume is kept synchronized between the host and the device itself through a * device-specific protocol such as BT AVRCP. * @see #setDeviceVolumeBehavior(AudioDeviceAttributes, int) + * @deprecated use {@link AudioDeviceVolumeManager#DEVICE_VOLUME_BEHAVIOR_ABSOLUTE} instead */ @SystemApi + @FlaggedApi(FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT) public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE = 3; /** * @hide @@ -6695,8 +6704,11 @@ public class AudioManager { * normal vs in phone call). * @see #setMode(int) * @see #setDeviceVolumeBehavior(AudioDeviceAttributes, int) + * @deprecated use {@link AudioDeviceVolumeManager#DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE} + * instead */ @SystemApi + @FlaggedApi(FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT) public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE = 4; /** @@ -6704,8 +6716,11 @@ public class AudioManager { * A variant of {@link #DEVICE_VOLUME_BEHAVIOR_ABSOLUTE} where the host cannot reliably set * the volume percentage of the audio device. Specifically, {@link #setStreamVolume} will have * no effect, or an unreliable effect. + * @deprecated use {@link AudioDeviceVolumeManager#DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY} + * instead */ @SystemApi + @FlaggedApi(FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT) public static final int DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY = 5; /** @hide */ @@ -6720,49 +6735,6 @@ public class AudioManager { @Retention(RetentionPolicy.SOURCE) public @interface DeviceVolumeBehavior {} - /** @hide */ - @IntDef({ - DEVICE_VOLUME_BEHAVIOR_UNSET, - DEVICE_VOLUME_BEHAVIOR_VARIABLE, - DEVICE_VOLUME_BEHAVIOR_FULL, - DEVICE_VOLUME_BEHAVIOR_FIXED, - DEVICE_VOLUME_BEHAVIOR_ABSOLUTE, - DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE, - DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface DeviceVolumeBehaviorState {} - - /** - * Variants of absolute volume behavior that are set in {@link AudioDeviceVolumeManager}. - * @hide - */ - @IntDef({ - DEVICE_VOLUME_BEHAVIOR_ABSOLUTE, - DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AbsoluteDeviceVolumeBehavior {} - - /** - * @hide - * Throws IAE on an invalid volume behavior value - * @param volumeBehavior behavior value to check - */ - public static void enforceValidVolumeBehavior(int volumeBehavior) { - switch (volumeBehavior) { - case DEVICE_VOLUME_BEHAVIOR_VARIABLE: - case DEVICE_VOLUME_BEHAVIOR_FULL: - case DEVICE_VOLUME_BEHAVIOR_FIXED: - case DEVICE_VOLUME_BEHAVIOR_ABSOLUTE: - case DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE: - case DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY: - return; - default: - throw new IllegalArgumentException("Illegal volume behavior " + volumeBehavior); - } - } - /** * @hide * Sets the volume behavior for an audio output device. @@ -6773,17 +6745,21 @@ public class AudioManager { * @see #DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE * @param device the device to be affected * @param deviceVolumeBehavior one of the device behaviors + * + * @deprecated use + * {@link AudioDeviceVolumeManager#setDeviceVolumeBehavior(AudioDeviceAttributes, int)} instead */ @SystemApi @RequiresPermission(anyOf = { Manifest.permission.MODIFY_AUDIO_ROUTING, Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED }) + @FlaggedApi(FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT) public void setDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device, @DeviceVolumeBehavior int deviceVolumeBehavior) { // verify arguments (validity of device type is enforced in server) Objects.requireNonNull(device); - enforceValidVolumeBehavior(deviceVolumeBehavior); + AudioDeviceVolumeManager.enforceValidVolumeBehavior(deviceVolumeBehavior); // communicate with service final IAudioService service = getService(); try { @@ -6810,6 +6786,8 @@ public class AudioManager { * Returns the volume device behavior for the given audio device * @param device the audio device * @return the volume behavior for the device + * @deprecated use + * {@link AudioDeviceVolumeManager#getDeviceVolumeBehavior(AudioDeviceAttributes)} instead */ @SystemApi @RequiresPermission(anyOf = { @@ -6817,6 +6795,7 @@ public class AudioManager { Manifest.permission.QUERY_AUDIO_STATE, Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED }) + @FlaggedApi(FLAG_UNIFY_ABSOLUTE_VOLUME_MANAGEMENT) public @DeviceVolumeBehavior int getDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device) { // verify arguments (validity of device type is enforced in server) @@ -6836,29 +6815,6 @@ public class AudioManager { } /** - * @hide - * Returns {@code true} if the volume device behavior is {@link #DEVICE_VOLUME_BEHAVIOR_FULL}. - */ - @TestApi - @RequiresPermission(anyOf = { - Manifest.permission.MODIFY_AUDIO_ROUTING, - Manifest.permission.QUERY_AUDIO_STATE, - Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED - }) - public boolean isFullVolumeDevice() { - final AudioAttributes attributes = new AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_MEDIA) - .build(); - final List<AudioDeviceAttributes> devices = getDevicesForAttributes(attributes); - for (AudioDeviceAttributes device : devices) { - if (getDeviceVolumeBehavior(device) == DEVICE_VOLUME_BEHAVIOR_FULL) { - return true; - } - } - return false; - } - - /** * Indicate wired accessory connection state change. * @param device type of device connected/disconnected (AudioManager.DEVICE_OUT_xxx) * @param state new connection state: 1 connected, 0 disconnected diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 01e3d670d12a..17c7b8ed07d4 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -930,7 +930,8 @@ public class AudioService extends IAudioService.Stub private final Object mAbsoluteVolumeDeviceInfoMapLock = new Object(); // Devices where the framework sends a full scale audio signal, and controls the volume of // the external audio system separately. - // For possible volume behaviors, see {@link AudioManager.AbsoluteDeviceVolumeBehavior}. + // For possible volume behaviors, see + // {@link AudioDeviceVolumeManager.AbsoluteDeviceVolumeBehavior}. @GuardedBy("mAbsoluteVolumeDeviceInfoMapLock") Map<Integer, AbsoluteVolumeDeviceInfo> mAbsoluteVolumeDeviceInfoMap = new ArrayMap<>(); @@ -943,7 +944,7 @@ public class AudioService extends IAudioService.Stub private final List<VolumeInfo> mVolumeInfos; private final IAudioDeviceVolumeDispatcher mCallback; private final boolean mHandlesVolumeAdjustment; - private @AudioManager.AbsoluteDeviceVolumeBehavior int mDeviceVolumeBehavior; + private @AudioDeviceVolumeManager.AbsoluteDeviceVolumeBehavior int mDeviceVolumeBehavior; private AbsoluteVolumeDeviceInfo( AudioService parent, @@ -951,7 +952,7 @@ public class AudioService extends IAudioService.Stub List<VolumeInfo> volumeInfos, IAudioDeviceVolumeDispatcher callback, boolean handlesVolumeAdjustment, - @AudioManager.AbsoluteDeviceVolumeBehavior int behavior) { + @AudioDeviceVolumeManager.AbsoluteDeviceVolumeBehavior int behavior) { this.mParent = parent; this.mDevice = device; this.mVolumeInfos = volumeInfos; @@ -8160,7 +8161,7 @@ public class AudioService extends IAudioService.Stub IAudioDeviceVolumeDispatcher cb, String packageName, AudioDeviceAttributes device, List<VolumeInfo> volumes, boolean handlesVolumeAdjustment, - @AudioManager.AbsoluteDeviceVolumeBehavior int deviceVolumeBehavior) { + @AudioDeviceVolumeManager.AbsoluteDeviceVolumeBehavior int deviceVolumeBehavior) { // verify permissions if (mContext.checkCallingOrSelfPermission(MODIFY_AUDIO_ROUTING) != PackageManager.PERMISSION_GRANTED @@ -8227,12 +8228,13 @@ public class AudioService extends IAudioService.Stub @android.annotation.EnforcePermission(anyOf = { MODIFY_AUDIO_ROUTING, MODIFY_AUDIO_SETTINGS_PRIVILEGED }) public void setDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device, - @AudioManager.DeviceVolumeBehavior int deviceVolumeBehavior, @Nullable String pkgName) { + @AudioDeviceVolumeManager.DeviceVolumeBehavior int deviceVolumeBehavior, + @Nullable String pkgName) { // verify permissions super.setDeviceVolumeBehavior_enforcePermission(); // verify arguments Objects.requireNonNull(device); - AudioManager.enforceValidVolumeBehavior(deviceVolumeBehavior); + AudioDeviceVolumeManager.enforceValidVolumeBehavior(deviceVolumeBehavior); device = retrieveBluetoothAddress(device); @@ -8255,7 +8257,8 @@ public class AudioService extends IAudioService.Stub } private void setDeviceVolumeBehaviorInternal(@NonNull AudioDeviceAttributes device, - @AudioManager.DeviceVolumeBehavior int deviceVolumeBehavior, @NonNull String caller) { + @AudioDeviceVolumeManager.DeviceVolumeBehavior int deviceVolumeBehavior, + @NonNull String caller) { int audioSystemDeviceOut = device.getInternalType(); boolean volumeBehaviorChanged = false; // update device masks based on volume behavior @@ -8310,7 +8313,7 @@ public class AudioService extends IAudioService.Stub @android.annotation.EnforcePermission(anyOf = { MODIFY_AUDIO_ROUTING, QUERY_AUDIO_STATE, MODIFY_AUDIO_SETTINGS_PRIVILEGED }) - public @AudioManager.DeviceVolumeBehavior + public @AudioDeviceVolumeManager.DeviceVolumeBehavior int getDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device) { // verify permissions super.getDeviceVolumeBehavior_enforcePermission(); @@ -8322,7 +8325,7 @@ public class AudioService extends IAudioService.Stub return getDeviceVolumeBehaviorInt(device); } - private @AudioManager.DeviceVolumeBehavior + private @AudioDeviceVolumeManager.DeviceVolumeBehavior int getDeviceVolumeBehaviorInt(@NonNull AudioDeviceAttributes device) { // Get the internal type set by the AudioDeviceAttributes constructor which is always more // exact (avoids double conversions) than a conversion from SDK type via @@ -15306,7 +15309,8 @@ public class AudioService extends IAudioService.Stub /** * Returns whether the input device uses absolute volume behavior, including its variants. - * For included volume behaviors, see {@link AudioManager.AbsoluteDeviceVolumeBehavior}. + * For included volume behaviors, see + * {@link AudioDeviceVolumeManager.AbsoluteDeviceVolumeBehavior}. * <p>This is distinct from Bluetooth A2DP absolute volume behavior * ({@link #isA2dpAbsoluteVolumeDevice}). */ @@ -15333,7 +15337,7 @@ public class AudioService extends IAudioService.Stub } private void persistDeviceVolumeBehavior(int deviceType, - @AudioManager.DeviceVolumeBehavior int deviceVolumeBehavior) { + @AudioDeviceVolumeManager.DeviceVolumeBehavior int deviceVolumeBehavior) { if (DEBUG_VOL) { Log.d(TAG, "Persisting Volume Behavior for DeviceType: " + deviceType); } @@ -15348,7 +15352,7 @@ public class AudioService extends IAudioService.Stub } } - @AudioManager.DeviceVolumeBehaviorState + @AudioDeviceVolumeManager.DeviceVolumeBehaviorState private int retrieveStoredDeviceVolumeBehavior(int deviceType) { return mSettings.getSystemIntForUser(mContentResolver, getSettingsNameForDeviceVolumeBehavior(deviceType), diff --git a/services/core/java/com/android/server/hdmi/AudioDeviceVolumeManagerWrapper.java b/services/core/java/com/android/server/hdmi/AudioDeviceVolumeManagerWrapper.java index ab86433ca50d..62c3dbd3df8c 100644 --- a/services/core/java/com/android/server/hdmi/AudioDeviceVolumeManagerWrapper.java +++ b/services/core/java/com/android/server/hdmi/AudioDeviceVolumeManagerWrapper.java @@ -23,6 +23,7 @@ import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.media.AudioDeviceAttributes; import android.media.AudioDeviceVolumeManager; +import android.media.AudioManager; import android.media.VolumeInfo; import java.util.concurrent.Executor; @@ -53,7 +54,7 @@ public interface AudioDeviceVolumeManagerWrapper { /** * Wrapper for {@link AudioDeviceVolumeManager#setDeviceAbsoluteVolumeBehavior( - * AudioDeviceAttributes, VolumeInfo, Executor, OnAudioDeviceVolumeChangedListener, boolean)} + * AudioDeviceAttributes, VolumeInfo, boolean, Executor, OnAudioDeviceVolumeChangedListener)} */ void setDeviceAbsoluteVolumeBehavior( @NonNull AudioDeviceAttributes device, @@ -64,7 +65,7 @@ public interface AudioDeviceVolumeManagerWrapper { /** * Wrapper for {@link AudioDeviceVolumeManager#setDeviceAbsoluteVolumeAdjustOnlyBehavior( - * AudioDeviceAttributes, VolumeInfo, Executor, OnAudioDeviceVolumeChangedListener, boolean)} + * AudioDeviceAttributes, VolumeInfo, boolean, Executor, OnAudioDeviceVolumeChangedListener)} */ void setDeviceAbsoluteVolumeAdjustOnlyBehavior( @NonNull AudioDeviceAttributes device, @@ -72,4 +73,16 @@ public interface AudioDeviceVolumeManagerWrapper { boolean handlesVolumeAdjustment, @NonNull @CallbackExecutor Executor executor, @NonNull AudioDeviceVolumeManager.OnAudioDeviceVolumeChangedListener vclistener); + + /** + * Wraps {@link AudioDeviceVolumeManager#getDeviceVolumeBehavior(AudioDeviceAttributes)} + */ + @AudioManager.DeviceVolumeBehavior + int getDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device); + + /** + * Wraps {@link AudioDeviceVolumeManager#setDeviceVolumeBehavior(AudioDeviceAttributes, int)} + */ + void setDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device, + @AudioDeviceVolumeManager.DeviceVolumeBehavior int deviceVolumeBehavior); } diff --git a/services/core/java/com/android/server/hdmi/AudioManagerWrapper.java b/services/core/java/com/android/server/hdmi/AudioManagerWrapper.java index fd4dd516fd51..6d01e2da3e9d 100644 --- a/services/core/java/com/android/server/hdmi/AudioManagerWrapper.java +++ b/services/core/java/com/android/server/hdmi/AudioManagerWrapper.java @@ -85,18 +85,6 @@ public interface AudioManagerWrapper { void setWiredDeviceConnectionState(int device, int state, String address, String name); /** - * Wraps {@link AudioManager#getDeviceVolumeBehavior(AudioDeviceAttributes)} - */ - @AudioManager.DeviceVolumeBehavior - int getDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device); - - /** - * Wraps {@link AudioManager#setDeviceVolumeBehavior(AudioDeviceAttributes, int)} - */ - void setDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device, - @AudioManager.DeviceVolumeBehavior int deviceVolumeBehavior); - - /** * Wraps {@link AudioManager#getDevicesForAttributes(AudioAttributes)} */ @NonNull diff --git a/services/core/java/com/android/server/hdmi/DefaultAudioDeviceVolumeManagerWrapper.java b/services/core/java/com/android/server/hdmi/DefaultAudioDeviceVolumeManagerWrapper.java index 10cbb00d2398..02d8579f738f 100644 --- a/services/core/java/com/android/server/hdmi/DefaultAudioDeviceVolumeManagerWrapper.java +++ b/services/core/java/com/android/server/hdmi/DefaultAudioDeviceVolumeManagerWrapper.java @@ -16,11 +16,14 @@ package com.android.server.hdmi; +import static android.media.audio.Flags.unifyAbsoluteVolumeManagement; + import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.content.Context; import android.media.AudioDeviceAttributes; import android.media.AudioDeviceVolumeManager; +import android.media.AudioManager; import android.media.VolumeInfo; import java.util.concurrent.Executor; @@ -38,9 +41,11 @@ public class DefaultAudioDeviceVolumeManagerWrapper private static final String TAG = "AudioDeviceVolumeManagerWrapper"; private final AudioDeviceVolumeManager mAudioDeviceVolumeManager; + private final AudioManager mAudioManager; public DefaultAudioDeviceVolumeManagerWrapper(Context context) { mAudioDeviceVolumeManager = new AudioDeviceVolumeManager(context); + mAudioManager = context.getSystemService(AudioManager.class); } @Override @@ -78,4 +83,24 @@ public class DefaultAudioDeviceVolumeManagerWrapper mAudioDeviceVolumeManager.setDeviceAbsoluteVolumeAdjustOnlyBehavior(device, volume, handlesVolumeAdjustment, executor, vclistener); } + + @Override + @AudioDeviceVolumeManager.DeviceVolumeBehavior + public int getDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device) { + if (!unifyAbsoluteVolumeManagement()) { + int deviceBehavior = mAudioManager.getDeviceVolumeBehavior(device); + return deviceBehavior; + } + return mAudioDeviceVolumeManager.getDeviceVolumeBehavior(device); + } + + @Override + public void setDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device, + @AudioDeviceVolumeManager.DeviceVolumeBehavior int deviceVolumeBehavior) { + if (!unifyAbsoluteVolumeManagement()) { + int deviceBehavior = deviceVolumeBehavior; + mAudioManager.setDeviceVolumeBehavior(device, deviceBehavior); + } + mAudioDeviceVolumeManager.setDeviceVolumeBehavior(device, deviceVolumeBehavior); + } } diff --git a/services/core/java/com/android/server/hdmi/DefaultAudioManagerWrapper.java b/services/core/java/com/android/server/hdmi/DefaultAudioManagerWrapper.java index 061e145c27f3..662715420ec6 100644 --- a/services/core/java/com/android/server/hdmi/DefaultAudioManagerWrapper.java +++ b/services/core/java/com/android/server/hdmi/DefaultAudioManagerWrapper.java @@ -94,18 +94,6 @@ public class DefaultAudioManagerWrapper implements AudioManagerWrapper { } @Override - @AudioManager.DeviceVolumeBehavior - public int getDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device) { - return mAudioManager.getDeviceVolumeBehavior(device); - } - - @Override - public void setDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device, - @AudioManager.DeviceVolumeBehavior int deviceVolumeBehavior) { - mAudioManager.setDeviceVolumeBehavior(device, deviceVolumeBehavior); - } - - @Override @NonNull public List<AudioDeviceAttributes> getDevicesForAttributes( @NonNull AudioAttributes attributes) { diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index fdd0ef2f90e1..41b0b4dc716a 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -4595,7 +4595,7 @@ public class HdmiControlService extends SystemService { * Wrapper for {@link AudioManager#getDeviceVolumeBehavior} that takes advantage of cached * results for the volume behaviors of HDMI audio devices. */ - @AudioManager.DeviceVolumeBehavior + @AudioDeviceVolumeManager.DeviceVolumeBehavior private int getDeviceVolumeBehavior(AudioDeviceAttributes device) { if (AVB_AUDIO_OUTPUT_DEVICES.contains(device)) { synchronized (mLock) { @@ -4604,7 +4604,7 @@ public class HdmiControlService extends SystemService { } } } - return getAudioManager().getDeviceVolumeBehavior(device); + return getAudioDeviceVolumeManager().getDeviceVolumeBehavior(device); } /** @@ -4695,7 +4695,7 @@ public class HdmiControlService extends SystemService { // Condition 3: All AVB-capable audio outputs already use full/absolute volume behavior // We only need to check the first AVB-capable audio output because only TV panels // have more than one of them, and they always have the same volume behavior. - @AudioManager.DeviceVolumeBehavior int currentVolumeBehavior = + @AudioDeviceVolumeManager.DeviceVolumeBehavior int currentVolumeBehavior = getDeviceVolumeBehavior(getAvbCapableAudioOutputDevices().get(0)); boolean alreadyUsingFullOrAbsoluteVolume = FULL_AND_ABSOLUTE_VOLUME_BEHAVIORS.contains(currentVolumeBehavior); @@ -4719,7 +4719,8 @@ public class HdmiControlService extends SystemService { // Condition 5: The System Audio device supports <Set Audio Volume Level> switch (systemAudioDeviceInfo.getDeviceFeatures().getSetAudioVolumeLevelSupport()) { case DeviceFeatures.FEATURE_SUPPORTED: - if (currentVolumeBehavior != AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE) { + if (currentVolumeBehavior + != AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE) { // Start an action that will call enableAbsoluteVolumeBehavior // once the System Audio device sends <Report Audio Status> localCecDevice.startNewAvbAudioStatusAction( @@ -4731,13 +4732,15 @@ public class HdmiControlService extends SystemService { // This allows the device to display numeric volume UI for the System Audio device. if (tv() != null && mNumericSoundbarVolumeUiOnTvFeatureFlagEnabled) { if (currentVolumeBehavior - != AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY) { + != AudioDeviceVolumeManager + .DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY) { // If we're currently using absolute volume behavior, switch to full volume // behavior until we successfully adopt adjust-only absolute volume behavior - if (currentVolumeBehavior == AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE) { + if (currentVolumeBehavior + == AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE) { for (AudioDeviceAttributes device : getAvbCapableAudioOutputDevices()) { - getAudioManager().setDeviceVolumeBehavior(device, - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + getAudioDeviceVolumeManager().setDeviceVolumeBehavior(device, + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); } } // Start an action that will call enableAbsoluteVolumeBehavior @@ -4750,7 +4753,8 @@ public class HdmiControlService extends SystemService { } return; case DeviceFeatures.FEATURE_SUPPORT_UNKNOWN: - if (currentVolumeBehavior == AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE) { + if (currentVolumeBehavior + == AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE) { switchToFullVolumeBehavior(); } localCecDevice.querySetAudioVolumeLevelSupport( @@ -4773,8 +4777,8 @@ public class HdmiControlService extends SystemService { for (AudioDeviceAttributes device : getAvbCapableAudioOutputDevices()) { if (ABSOLUTE_VOLUME_BEHAVIORS.contains(getDeviceVolumeBehavior(device))) { - getAudioManager().setDeviceVolumeBehavior(device, - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + getAudioDeviceVolumeManager().setDeviceVolumeBehavior(device, + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); } } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/BaseAbsoluteVolumeBehaviorTest.java b/services/tests/servicestests/src/com/android/server/hdmi/BaseAbsoluteVolumeBehaviorTest.java index b2d48a77386f..2349120f8e76 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/BaseAbsoluteVolumeBehaviorTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/BaseAbsoluteVolumeBehaviorTest.java @@ -226,13 +226,16 @@ public abstract class BaseAbsoluteVolumeBehaviorTest { */ protected void adoptFullVolumeBehaviorOnAvbCapableAudioOutputDevices() { if (getDeviceType() == HdmiDeviceInfo.DEVICE_PLAYBACK) { - mAudioManager.setDeviceVolumeBehavior(HdmiControlService.AUDIO_OUTPUT_DEVICE_HDMI, - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + mAudioDeviceVolumeManager.setDeviceVolumeBehavior( + HdmiControlService.AUDIO_OUTPUT_DEVICE_HDMI, + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); } else if (getDeviceType() == HdmiDeviceInfo.DEVICE_TV) { - mAudioManager.setDeviceVolumeBehavior(HdmiControlService.AUDIO_OUTPUT_DEVICE_HDMI_ARC, - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); - mAudioManager.setDeviceVolumeBehavior(HdmiControlService.AUDIO_OUTPUT_DEVICE_HDMI_EARC, - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + mAudioDeviceVolumeManager.setDeviceVolumeBehavior( + HdmiControlService.AUDIO_OUTPUT_DEVICE_HDMI_ARC, + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); + mAudioDeviceVolumeManager.setDeviceVolumeBehavior( + HdmiControlService.AUDIO_OUTPUT_DEVICE_HDMI_EARC, + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); } } @@ -307,8 +310,9 @@ public abstract class BaseAbsoluteVolumeBehaviorTest { INITIAL_SYSTEM_AUDIO_DEVICE_STATUS.getVolume(), INITIAL_SYSTEM_AUDIO_DEVICE_STATUS.getMute()); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE); } protected void enableAdjustOnlyAbsoluteVolumeBehavior() { @@ -320,8 +324,9 @@ public abstract class BaseAbsoluteVolumeBehaviorTest { INITIAL_SYSTEM_AUDIO_DEVICE_STATUS.getVolume(), INITIAL_SYSTEM_AUDIO_DEVICE_STATUS.getMute()); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY); } protected void verifyGiveAudioStatusNeverSent() { @@ -419,14 +424,16 @@ public abstract class BaseAbsoluteVolumeBehaviorTest { receiveSetAudioVolumeLevelSupport(DeviceFeatures.FEATURE_SUPPORTED); // AVB should not be enabled before receiving <Report Audio Status> - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); receiveReportAudioStatus(60, false); // Check that absolute volume behavior was the last one adopted - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE); // Check that the volume and mute status received were included when setting AVB verify(mAudioDeviceVolumeManager).setDeviceAbsoluteVolumeBehavior( @@ -447,19 +454,22 @@ public abstract class BaseAbsoluteVolumeBehaviorTest { enableSystemAudioModeIfNeeded(); receiveSetAudioVolumeLevelSupport(DeviceFeatures.FEATURE_SUPPORTED); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); receiveReportAudioStatus(127, false); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); } @Test public void avbEnabled_standby_avbDisabled() { enableAbsoluteVolumeBehavior(); mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); } @Test @@ -468,8 +478,9 @@ public abstract class BaseAbsoluteVolumeBehaviorTest { setCecVolumeControlSetting(HdmiControlManager.VOLUME_CONTROL_DISABLED); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); } @Test @@ -477,8 +488,9 @@ public abstract class BaseAbsoluteVolumeBehaviorTest { enableAbsoluteVolumeBehavior(); receiveSetAudioVolumeLevelSupport(DeviceFeatures.FEATURE_NOT_SUPPORTED); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); } @Test @@ -489,8 +501,9 @@ public abstract class BaseAbsoluteVolumeBehaviorTest { getSystemAudioDeviceLogicalAddress(), getLogicalAddress(), Constants.MESSAGE_SET_AUDIO_VOLUME_LEVEL, Constants.ABORT_UNRECOGNIZED_OPCODE)); mTestLooper.dispatchAll(); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); } @Test @@ -501,8 +514,9 @@ public abstract class BaseAbsoluteVolumeBehaviorTest { enableAbsoluteVolumeBehavior(); receiveSetSystemAudioMode(false); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); } @Test diff --git a/services/tests/servicestests/src/com/android/server/hdmi/BasePlaybackDeviceAvbTest.java b/services/tests/servicestests/src/com/android/server/hdmi/BasePlaybackDeviceAvbTest.java index 4c12e436542b..7c7e2207c59c 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/BasePlaybackDeviceAvbTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/BasePlaybackDeviceAvbTest.java @@ -20,7 +20,7 @@ import android.hardware.hdmi.DeviceFeatures; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; import android.media.AudioDeviceAttributes; -import android.media.AudioManager; +import android.media.AudioDeviceVolumeManager; import org.junit.Test; @@ -60,8 +60,8 @@ public abstract class BasePlaybackDeviceAvbTest extends BaseAbsoluteVolumeBehavi */ @Test public void savlNotSupported_allOtherConditionsMet_giveAudioStatusNotSent() { - mAudioManager.setDeviceVolumeBehavior(getAudioOutputDevice(), - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + mAudioDeviceVolumeManager.setDeviceVolumeBehavior(getAudioOutputDevice(), + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); setCecVolumeControlSetting(HdmiControlManager.VOLUME_CONTROL_ENABLED); enableSystemAudioModeIfNeeded(); diff --git a/services/tests/servicestests/src/com/android/server/hdmi/BaseTvToAudioSystemAvbTest.java b/services/tests/servicestests/src/com/android/server/hdmi/BaseTvToAudioSystemAvbTest.java index f44517a47f55..7a4359889994 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/BaseTvToAudioSystemAvbTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/BaseTvToAudioSystemAvbTest.java @@ -96,13 +96,15 @@ public abstract class BaseTvToAudioSystemAvbTest extends BaseAbsoluteVolumeBehav receiveSetAudioVolumeLevelSupport(DeviceFeatures.FEATURE_NOT_SUPPORTED); // Adjust-only AVB should not be enabled before receiving <Report Audio Status> - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); receiveReportAudioStatus(20, false); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY); verify(mAudioDeviceVolumeManager).setDeviceAbsoluteVolumeAdjustOnlyBehavior( eq(getAudioOutputDevice()), @@ -124,8 +126,9 @@ public abstract class BaseTvToAudioSystemAvbTest extends BaseAbsoluteVolumeBehav receiveReportAudioStatus(40, true); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY); verify(mAudioDeviceVolumeManager).setDeviceAbsoluteVolumeAdjustOnlyBehavior( eq(getAudioOutputDevice()), @@ -149,8 +152,9 @@ public abstract class BaseTvToAudioSystemAvbTest extends BaseAbsoluteVolumeBehav receiveReportAudioStatus(40, true); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY); verify(mAudioDeviceVolumeManager).setDeviceAbsoluteVolumeAdjustOnlyBehavior( eq(getAudioOutputDevice()), @@ -283,13 +287,15 @@ public abstract class BaseTvToAudioSystemAvbTest extends BaseAbsoluteVolumeBehav verifyGiveAudioStatusSent(); // The device should use adjust-only AVB while waiting for <Report Audio Status> - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY); // The device should switch to AVB upon receiving <Report Audio Status> receiveReportAudioStatus(60, false); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE); } @@ -321,8 +327,9 @@ public abstract class BaseTvToAudioSystemAvbTest extends BaseAbsoluteVolumeBehav mTestLooper.dispatchAll(); // The device should not switch away from adjust-only AVB - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY); // The device should query support for <Set Audio Volume Level> again assertThat(mNativeWrapper.getResultMessages()).contains( diff --git a/services/tests/servicestests/src/com/android/server/hdmi/FakeAudioFramework.java b/services/tests/servicestests/src/com/android/server/hdmi/FakeAudioFramework.java index 90f94cb4b596..e07f4f92084e 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/FakeAudioFramework.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/FakeAudioFramework.java @@ -23,6 +23,7 @@ import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.media.AudioAttributes; import android.media.AudioDeviceAttributes; +import android.media.AudioDeviceVolumeManager; import android.media.AudioManager; import android.media.AudioSystem; import android.media.VolumeInfo; @@ -137,18 +138,6 @@ public class FakeAudioFramework { // Do nothing } - - @Override - @AudioManager.DeviceVolumeBehavior - public int getDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device) { - return mDeviceVolumeBehaviors.getOrDefault(device, DEFAULT_DEVICE_VOLUME_BEHAVIOR); - } - - public void setDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device, - @AudioManager.DeviceVolumeBehavior int deviceVolumeBehavior) { - setVolumeBehaviorHelper(device, deviceVolumeBehavior); - } - @Override @NonNull public List<AudioDeviceAttributes> getDevicesForAttributes( @@ -186,7 +175,8 @@ public class FakeAudioFramework { boolean handlesVolumeAdjustment, @NonNull @CallbackExecutor Executor executor, @NonNull OnAudioDeviceVolumeChangedListener vclistener) { - setVolumeBehaviorHelper(device, AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE); + setVolumeBehaviorHelper(device, + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE); } @Override @@ -197,7 +187,19 @@ public class FakeAudioFramework { @NonNull @CallbackExecutor Executor executor, @NonNull OnAudioDeviceVolumeChangedListener vclistener) { setVolumeBehaviorHelper(device, - AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY); + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY); + } + + @Override + @AudioDeviceVolumeManager.DeviceVolumeBehavior + public int getDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device) { + return mDeviceVolumeBehaviors.getOrDefault(device, DEFAULT_DEVICE_VOLUME_BEHAVIOR); + } + + @Override + public void setDeviceVolumeBehavior(@NonNull AudioDeviceAttributes device, + @AudioDeviceVolumeManager.DeviceVolumeBehavior int deviceVolumeBehavior) { + setVolumeBehaviorHelper(device, deviceVolumeBehavior); } } @@ -222,7 +224,7 @@ public class FakeAudioFramework { * Helper method for changing an audio device's volume behavior. Notifies listeners. */ private void setVolumeBehaviorHelper(AudioDeviceAttributes device, - @AudioManager.DeviceVolumeBehavior int newVolumeBehavior) { + @AudioDeviceVolumeManager.DeviceVolumeBehavior int newVolumeBehavior) { int currentVolumeBehavior = mDeviceVolumeBehaviors.getOrDefault( device, DEFAULT_DEVICE_VOLUME_BEHAVIOR); diff --git a/services/tests/servicestests/src/com/android/server/hdmi/PlaybackDeviceToAudioSystemAvbTest.java b/services/tests/servicestests/src/com/android/server/hdmi/PlaybackDeviceToAudioSystemAvbTest.java index 43ab804e04be..ffc1c62f79b3 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/PlaybackDeviceToAudioSystemAvbTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/PlaybackDeviceToAudioSystemAvbTest.java @@ -21,7 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import android.hardware.hdmi.DeviceFeatures; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; -import android.media.AudioManager; +import android.media.AudioDeviceVolumeManager; import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; @@ -64,8 +64,9 @@ public class PlaybackDeviceToAudioSystemAvbTest extends BasePlaybackDeviceAvbTes // Audio System disables System Audio Mode. AVB should be disabled. receiveSetSystemAudioMode(false); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); // TV reports support for <Set Audio Volume Level> mNativeWrapper.onCecMessage(ReportFeaturesMessage.build( @@ -85,7 +86,8 @@ public class PlaybackDeviceToAudioSystemAvbTest extends BasePlaybackDeviceAvbTes false)); mTestLooper.dispatchAll(); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE); } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/PlaybackDeviceToTvAvbTest.java b/services/tests/servicestests/src/com/android/server/hdmi/PlaybackDeviceToTvAvbTest.java index 9b343e34706a..092618072744 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/PlaybackDeviceToTvAvbTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/PlaybackDeviceToTvAvbTest.java @@ -23,7 +23,7 @@ import static org.mockito.Mockito.clearInvocations; import android.hardware.hdmi.DeviceFeatures; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; -import android.media.AudioManager; +import android.media.AudioDeviceVolumeManager; import android.platform.test.annotations.Presubmit; import androidx.test.filters.SmallTest; @@ -65,8 +65,9 @@ public class PlaybackDeviceToTvAvbTest extends BasePlaybackDeviceAvbTest { // Audio System enables System Audio Mode. AVB should be disabled. receiveSetSystemAudioMode(true); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_FULL); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_FULL); clearInvocations(mAudioManager, mAudioDeviceVolumeManager); @@ -88,7 +89,8 @@ public class PlaybackDeviceToTvAvbTest extends BasePlaybackDeviceAvbTest { false)); mTestLooper.dispatchAll(); - assertThat(mAudioManager.getDeviceVolumeBehavior(getAudioOutputDevice())).isEqualTo( - AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE); + assertThat(mAudioDeviceVolumeManager.getDeviceVolumeBehavior( + getAudioOutputDevice())).isEqualTo( + AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE); } } |