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

Commit d5fe61d0 authored by Paul Wang's avatar Paul Wang Committed by Android (Google) Code Review
Browse files

Merge changes from topic "exclude_device"

* changes:
  Expose API to set audio device as non-default playback
  Refactor: use CallbackUtil for preferred device listeners
parents 1da9ed59 ee4774a4
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -6604,6 +6604,7 @@ package android.media {
  public class AudioManager {
    method @Deprecated public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addAssistantServicesUids(@NonNull int[]);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnNonDefaultDevicesForStrategyChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnNonDefaultDevicesForStrategyChangedListener) throws java.lang.SecurityException;
    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDeviceForStrategyChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener) throws java.lang.SecurityException;
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDevicesForCapturePresetChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDevicesForCapturePresetChangedListener) throws java.lang.SecurityException;
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDevicesForStrategyChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDevicesForStrategyChangedListener) throws java.lang.SecurityException;
@@ -6625,6 +6626,7 @@ package android.media {
    method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMaxVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
    method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMinVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
    method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.AudioDeviceAttributes getMutingExpectedDevice();
    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public java.util.List<android.media.AudioDeviceAttributes> getNonDefaultDevicesForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy);
    method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.AudioDeviceAttributes getPreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy);
    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public java.util.List<android.media.AudioDeviceAttributes> getPreferredDevicesForCapturePreset(int);
    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public java.util.List<android.media.AudioDeviceAttributes> getPreferredDevicesForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy);
@@ -6640,6 +6642,8 @@ package android.media {
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void registerMuteAwaitConnectionCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.MuteAwaitConnectionCallback);
    method public void registerVolumeGroupCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.VolumeGroupCallback);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeAssistantServicesUids(@NonNull int[]);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean removeDeviceAsNonDefaultForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull android.media.AudioDeviceAttributes);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnNonDefaultDevicesForStrategyChangedListener(@NonNull android.media.AudioManager.OnNonDefaultDevicesForStrategyChangedListener);
    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDeviceForStrategyChangedListener(@NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDevicesForCapturePresetChangedListener(@NonNull android.media.AudioManager.OnPreferredDevicesForCapturePresetChangedListener);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDevicesForStrategyChangedListener(@NonNull android.media.AudioManager.OnPreferredDevicesForStrategyChangedListener);
@@ -6651,6 +6655,7 @@ package android.media {
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo, @IntRange(from=0) long);
    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(android.Manifest.permission.MODIFY_AUDIO_ROUTING) 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);
@@ -6695,6 +6700,10 @@ package android.media {
    field public static final int EVENT_TIMEOUT = 2; // 0x2
  }
  public static interface AudioManager.OnNonDefaultDevicesForStrategyChangedListener {
    method public void onNonDefaultDevicesForStrategyChanged(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull java.util.List<android.media.AudioDeviceAttributes>);
  }
  @Deprecated public static interface AudioManager.OnPreferredDeviceForStrategyChangedListener {
    method @Deprecated public void onPreferredDeviceForStrategyChanged(@NonNull android.media.audiopolicy.AudioProductStrategy, @Nullable android.media.AudioDeviceAttributes);
  }
+22 −6
Original line number Diff line number Diff line
@@ -2739,12 +2739,26 @@ static jint android_media_AudioSystem_setDevicesRoleForStrategy(JNIEnv *env, job
}

static jint android_media_AudioSystem_removeDevicesRoleForStrategy(JNIEnv *env, jobject thiz,
                                                                   jint strategy, jint role,
                                                                   jintArray jDeviceTypes,
                                                                   jobjectArray jDeviceAddresses) {
    AudioDeviceTypeAddrVector nDevices;
    jint results = getVectorOfAudioDeviceTypeAddr(env, jDeviceTypes, jDeviceAddresses, nDevices);
    if (results != NO_ERROR) {
        return results;
    }
    int status = check_AudioSystem_Command(
            AudioSystem::removeDevicesRoleForStrategy((product_strategy_t)strategy,
                                                      (device_role_t)role, nDevices));
    return (jint)status;
}

static jint android_media_AudioSystem_clearDevicesRoleForStrategy(JNIEnv *env, jobject thiz,
                                                                  jint strategy, jint role) {
    return (jint)
            check_AudioSystem_Command(AudioSystem::removeDevicesRoleForStrategy((product_strategy_t)
            check_AudioSystem_Command(AudioSystem::clearDevicesRoleForStrategy((product_strategy_t)
                                                                                       strategy,
                                                                                (device_role_t)
                                                                                        role),
                                                                               (device_role_t)role),
                                      {NAME_NOT_FOUND});
}

@@ -3341,8 +3355,10 @@ static const JNINativeMethod gMethods[] =
          (void *)android_media_AudioSystem_isCallScreeningModeSupported},
         {"setDevicesRoleForStrategy", "(II[I[Ljava/lang/String;)I",
          (void *)android_media_AudioSystem_setDevicesRoleForStrategy},
         {"removeDevicesRoleForStrategy", "(II)I",
         {"removeDevicesRoleForStrategy", "(II[I[Ljava/lang/String;)I",
          (void *)android_media_AudioSystem_removeDevicesRoleForStrategy},
         {"clearDevicesRoleForStrategy", "(II)I",
          (void *)android_media_AudioSystem_clearDevicesRoleForStrategy},
         {"getDevicesForRoleAndStrategy", "(IILjava/util/List;)I",
          (void *)android_media_AudioSystem_getDevicesForRoleAndStrategy},
         {"setDevicesRoleForCapturePreset", "(II[I[Ljava/lang/String;)I",
+193 −105

File changed.

Preview size limit exceeded, changes collapsed.

+35 −1
Original line number Diff line number Diff line
@@ -2061,14 +2061,48 @@ public class AudioSystem
    private static native int setDevicesRoleForStrategy(
            int strategy, int role, @NonNull int[] types, @NonNull String[] addresses);

    /**
     * @hide
     * Remove device as role for product strategy.
     * @param strategy the id of the strategy to configure
     * @param role the role of the devices
     * @param devices the list of devices to be removed as role for the given strategy
     * @return {@link #SUCCESS} if successfully set
     */
    public static int removeDevicesRoleForStrategy(
            int strategy, int role, @NonNull List<AudioDeviceAttributes> devices) {
        if (devices.isEmpty()) {
            return BAD_VALUE;
        }
        int[] types = new int[devices.size()];
        String[] addresses = new String[devices.size()];
        for (int i = 0; i < devices.size(); ++i) {
            types[i] = devices.get(i).getInternalType();
            addresses[i] = devices.get(i).getAddress();
        }
        return removeDevicesRoleForStrategy(strategy, role, types, addresses);
    }

    /**
     * @hide
     * Remove devices as role for the strategy
     * @param strategy the id of the strategy to configure
     * @param role the role of the devices
     * @param types all device types
     * @param addresses all device addresses
     * @return {@link #SUCCESS} if successfully removed
     */
    public static native int removeDevicesRoleForStrategy(
            int strategy, int role, @NonNull int[] types, @NonNull String[] addresses);

    /**
     * @hide
     * Remove all devices as role for the strategy
     * @param strategy the id of the strategy to configure
     * @param role the role of the devices
     * @return {@link #SUCCESS} if successfully removed
     */
    public static native int removeDevicesRoleForStrategy(int strategy, int role);
    public static native int clearDevicesRoleForStrategy(int strategy, int role);

    /**
     * @hide
+18 −1
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import android.media.IPreferredMixerAttributesDispatcher;
import android.media.IRecordingConfigDispatcher;
import android.media.IRingtonePlayer;
import android.media.IStrategyPreferredDevicesDispatcher;
import android.media.IStrategyNonDefaultDevicesDispatcher;
import android.media.ISpatializerCallback;
import android.media.ISpatializerHeadTrackerAvailableCallback;
import android.media.ISpatializerHeadTrackingModeCallback;
@@ -330,7 +331,8 @@ interface IAudioService {

    boolean isCallScreeningModeSupported();

    int setPreferredDevicesForStrategy(in int strategy, in List<AudioDeviceAttributes> device);
    @EnforcePermission("MODIFY_AUDIO_ROUTING")
    int setPreferredDevicesForStrategy(in int strategy, in List<AudioDeviceAttributes> devices);

    @EnforcePermission("MODIFY_AUDIO_ROUTING")
    int removePreferredDevicesForStrategy(in int strategy);
@@ -338,6 +340,15 @@ interface IAudioService {
    @EnforcePermission("MODIFY_AUDIO_ROUTING")
    List<AudioDeviceAttributes> getPreferredDevicesForStrategy(in int strategy);

    @EnforcePermission("MODIFY_AUDIO_ROUTING")
    int setDeviceAsNonDefaultForStrategy(in int strategy, in AudioDeviceAttributes device);

    @EnforcePermission("MODIFY_AUDIO_ROUTING")
    int removeDeviceAsNonDefaultForStrategy(in int strategy, in AudioDeviceAttributes device);

    @EnforcePermission("MODIFY_AUDIO_ROUTING")
    List<AudioDeviceAttributes> getNonDefaultDevicesForStrategy(in int strategy);

    List<AudioDeviceAttributes> getDevicesForAttributes(in AudioAttributes attributes);

    List<AudioDeviceAttributes> getDevicesForAttributesUnprotected(in AudioAttributes attributes);
@@ -351,6 +362,12 @@ interface IAudioService {
    oneway void unregisterStrategyPreferredDevicesDispatcher(
            IStrategyPreferredDevicesDispatcher dispatcher);

    void registerStrategyNonDefaultDevicesDispatcher(
            IStrategyNonDefaultDevicesDispatcher dispatcher);

    oneway void unregisterStrategyNonDefaultDevicesDispatcher(
            IStrategyNonDefaultDevicesDispatcher dispatcher);

    oneway void setRttEnabled(in boolean rttEnabled);

    @EnforcePermission("MODIFY_AUDIO_ROUTING")
Loading