Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 283a4c71 authored by Jean-Michel Trivi's avatar Jean-Michel Trivi
Browse files

AudioDeviceVolumeManager and VolumeInfo API changes

Context service name for accessing AudioDeviceVolume manager.
Address API comments on VolumeInfo and AudioDeviceVolumeManager.
Add support in VolumeInfo to know whether it carries an explicit
  mute/unmute information (vs just default value of isMuted()).

Bug: 244326361
Test: atest android.media.audio.cts.AudioDeviceVolumeManagerTest
Test: atest android.media.audio.cts.VolumeInfoTest
Change-Id: Id718fbd7e0d5795ac480d9188faad4a70fba9808
parent 29c1eeed
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -3055,6 +3055,7 @@ package android.content {
    field public static final String APP_HIBERNATION_SERVICE = "app_hibernation";
    field public static final String APP_INTEGRITY_SERVICE = "app_integrity";
    field public static final String APP_PREDICTION_SERVICE = "app_prediction";
    field public static final String AUDIO_DEVICE_VOLUME_SERVICE = "audio_device_volume";
    field public static final String BACKUP_SERVICE = "backup";
    field public static final String BATTERY_STATS_SERVICE = "batterystats";
    field public static final int BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS = 1048576; // 0x100000
@@ -6251,7 +6252,7 @@ package android.media {
  }
  public class AudioDeviceVolumeManager {
    ctor public AudioDeviceVolumeManager(@NonNull android.content.Context);
    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.VolumeInfo getDeviceVolume(@NonNull android.media.VolumeInfo, @NonNull android.media.AudioDeviceAttributes);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setDeviceVolume(@NonNull android.media.VolumeInfo, @NonNull android.media.AudioDeviceAttributes);
  }
@@ -6589,8 +6590,9 @@ package android.media {
    method public int getMaxVolumeIndex();
    method public int getMinVolumeIndex();
    method public int getStreamType();
    method @Nullable public android.media.audiopolicy.AudioVolumeGroup getVolumeGroup();
    method @NonNull public android.media.audiopolicy.AudioVolumeGroup getVolumeGroup();
    method public int getVolumeIndex();
    method public boolean hasMuteCommand();
    method public boolean hasStreamType();
    method public boolean hasVolumeGroup();
    method public boolean isMuted();
+8 −0
Original line number Diff line number Diff line
@@ -119,6 +119,7 @@ import android.location.CountryDetector;
import android.location.ICountryDetector;
import android.location.ILocationManager;
import android.location.LocationManager;
import android.media.AudioDeviceVolumeManager;
import android.media.AudioManager;
import android.media.MediaFrameworkInitializer;
import android.media.MediaFrameworkPlatformInitializer;
@@ -344,6 +345,13 @@ public final class SystemServiceRegistry {
                return new AudioManager(ctx);
            }});

        registerService(Context.AUDIO_DEVICE_VOLUME_SERVICE, AudioDeviceVolumeManager.class,
                new CachedServiceFetcher<AudioDeviceVolumeManager>() {
            @Override
            public AudioDeviceVolumeManager createService(ContextImpl ctx) {
                return new AudioDeviceVolumeManager(ctx);
            }});

        registerService(Context.MEDIA_ROUTER_SERVICE, MediaRouter.class,
                new CachedServiceFetcher<MediaRouter>() {
            @Override
+13 −0
Original line number Diff line number Diff line
@@ -3851,6 +3851,7 @@ public abstract class Context {
            WIFI_RTT_RANGING_SERVICE,
            NSD_SERVICE,
            AUDIO_SERVICE,
            AUDIO_DEVICE_VOLUME_SERVICE,
            AUTH_SERVICE,
            FINGERPRINT_SERVICE,
            //@hide: FACE_SERVICE,
@@ -4693,6 +4694,18 @@ public abstract class Context {
     */
    public static final String AUDIO_SERVICE = "audio";

    /**
     * @hide
     * Use with {@link #getSystemService(String)} to retrieve a
     * {@link android.media.AudioDeviceVolumeManager} for handling management of audio device
     * (e.g. speaker, USB headset) volume.
     *
     * @see #getSystemService(String)
     * @see android.media.AudioDeviceVolumeManager
     */
    @SystemApi
    public static final String AUDIO_DEVICE_VOLUME_SERVICE = "audio_device_volume";

    /**
     * Use with {@link #getSystemService(String)} to retrieve a {@link
     * android.media.MediaTranscodingManager} for transcoding media.
+28 −10
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.content.Context;
import android.os.IBinder;
@@ -44,8 +43,7 @@ import java.util.concurrent.Executor;
@SystemApi
public class AudioDeviceVolumeManager {

    // define when using Log.*
    //private static final String TAG = "AudioDeviceVolumeManager";
    private static final String TAG = "AudioDeviceVolumeManager";

    /** @hide
     * Indicates no special treatment in the handling of the volume adjustment */
@@ -70,20 +68,15 @@ public class AudioDeviceVolumeManager {
    private static IAudioService sService;

    private final @NonNull String mPackageName;
    private final @Nullable String mAttributionTag;

    /**
     * @hide
     * Constructor
     * @param context the Context for the device volume operations
     */
    @SuppressLint("ManagerConstructor")
    // reason for suppression: even though the functionality handled by this class is implemented in
    // AudioService, we want to avoid bloating android.media.AudioManager
    // with @SystemApi functionality
    public AudioDeviceVolumeManager(@NonNull Context context) {
        Objects.requireNonNull(context);
        mPackageName = context.getApplicationContext().getOpPackageName();
        mAttributionTag = context.getApplicationContext().getAttributionTag();
    }

    /**
@@ -325,13 +318,38 @@ public class AudioDeviceVolumeManager {
     * @param ada the device for which volume is to be modified
     */
    @SystemApi
    // TODO alternatively require MODIFY_AUDIO_SYSTEM_SETTINGS when defined
    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
    public void setDeviceVolume(@NonNull VolumeInfo vi, @NonNull AudioDeviceAttributes ada) {
        try {
            getService().setDeviceVolume(vi, ada, mPackageName, mAttributionTag);
            getService().setDeviceVolume(vi, ada, mPackageName);
        } catch (RemoteException e) {
            e.rethrowFromSystemServer();
        }
    }

    /**
     * @hide
     * Returns the volume on the given audio device for the given volume information.
     * For instance if using a {@link VolumeInfo} configured for {@link AudioManager#STREAM_ALARM},
     * it will return the alarm volume. When no volume index has ever been set for the given
     * device, the default volume will be returned (the volume setting that would have been
     * applied if playback for that use case had started).
     * @param vi the volume information, only stream-based volumes are supported. Information
     *           other than the stream type is ignored.
     * @param ada the device for which volume is to be retrieved
     */
    @SystemApi
    // TODO alternatively require MODIFY_AUDIO_SYSTEM_SETTINGS when defined
    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
    public @NonNull VolumeInfo getDeviceVolume(@NonNull VolumeInfo vi,
            @NonNull AudioDeviceAttributes ada) {
        try {
            return getService().getDeviceVolume(vi, ada, mPackageName);
        } catch (RemoteException e) {
            e.rethrowFromSystemServer();
        }
        return VolumeInfo.getDefaultVolumeInfo();
    }

    /**
+7 −1
Original line number Diff line number Diff line
@@ -1212,7 +1212,13 @@ public class AudioManager {
        }
    }

    private static boolean isPublicStreamType(int streamType) {
    /**
     * @hide
     * Checks whether a stream type is part of the public SDK
     * @param streamType
     * @return true if the stream type is available in SDK
     */
    public static boolean isPublicStreamType(int streamType) {
        switch (streamType) {
            case STREAM_VOICE_CALL:
            case STREAM_SYSTEM:
Loading