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

Commit cf3ce3b9 authored by Vlad Popa's avatar Vlad Popa Committed by Android (Google) Code Review
Browse files

Merge "Add new mode for assistant conversations" into main

parents 9c1a92d5 be2794fe
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -22348,6 +22348,7 @@ package android.media {
    field public static final int GET_DEVICES_ALL = 3; // 0x3
    field public static final int GET_DEVICES_ALL = 3; // 0x3
    field public static final int GET_DEVICES_INPUTS = 1; // 0x1
    field public static final int GET_DEVICES_INPUTS = 1; // 0x1
    field public static final int GET_DEVICES_OUTPUTS = 2; // 0x2
    field public static final int GET_DEVICES_OUTPUTS = 2; // 0x2
    field @FlaggedApi("android.media.audio.assistant_volume_control") public static final int MODE_ASSISTANT_CONVERSATION = 7; // 0x7
    field public static final int MODE_CALL_REDIRECT = 5; // 0x5
    field public static final int MODE_CALL_REDIRECT = 5; // 0x5
    field public static final int MODE_CALL_SCREENING = 4; // 0x4
    field public static final int MODE_CALL_SCREENING = 4; // 0x4
    field public static final int MODE_COMMUNICATION_REDIRECT = 6; // 0x6
    field public static final int MODE_COMMUNICATION_REDIRECT = 6; // 0x6
+14 −4
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ package android.media;
import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_CUSTOM;
import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_CUSTOM;
import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_AUDIO;
import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_AUDIO;
import static android.content.Context.DEVICE_ID_DEFAULT;
import static android.content.Context.DEVICE_ID_DEFAULT;
import static android.media.audio.Flags.FLAG_ASSISTANT_VOLUME_CONTROL;
import static android.media.audio.Flags.FLAG_DEPRECATE_STREAM_BT_SCO;
import static android.media.audio.Flags.FLAG_DEPRECATE_STREAM_BT_SCO;
import static android.media.audio.Flags.FLAG_FOCUS_EXCLUSIVE_WITH_RECORDING;
import static android.media.audio.Flags.FLAG_FOCUS_EXCLUSIVE_WITH_RECORDING;
import static android.media.audio.Flags.FLAG_FOCUS_FREEZE_TEST_API;
import static android.media.audio.Flags.FLAG_FOCUS_FREEZE_TEST_API;
@@ -3486,14 +3487,16 @@ public class AudioManager {
    /**
    /**
     * Sets the audio mode.
     * Sets the audio mode.
     * <p>
     * <p>
     * The audio mode encompasses audio routing AND the behavior of
     * The audio mode encompasses audio routing, volume management AND the behavior of
     * the telephony layer. Therefore this method should only be used by applications that
     * the telephony layer. Therefore this method should only be used by applications that
     * replace the platform-wide management of audio settings or the main telephony application.
     * replace the platform-wide management of audio settings or the main telephony application.
     * In particular, the {@link #MODE_IN_CALL} mode should only be used by the telephony
     * In particular, the {@link #MODE_IN_CALL} mode should only be used by the telephony
     * application when it places a phone call, as it will cause signals from the radio layer
     * application when it places a phone call, as it will cause signals from the radio layer
     * to feed the platform mixer.
     * to feed the platform mixer. The {@link #MODE_ASSISTANT_CONVERSATION} should only be used
     * by applications that introduce an interactive assistant communication which would
     * prioritize the audio management around streams with {@link AudioAttributes#USAGE_ASSISTANT}.
     *
     *
     * @param mode  the requested audio mode.
     * @param mode  the requested audio mode. (see {@link AudioManager.AudioMode})
     *              Informs the HAL about the current audio state so that
     *              Informs the HAL about the current audio state so that
     *              it can route the audio appropriately.
     *              it can route the audio appropriately.
     */
     */
@@ -3677,6 +3680,12 @@ public class AudioManager {
     */
     */
    public static final int MODE_COMMUNICATION_REDIRECT = AudioSystem.MODE_COMMUNICATION_REDIRECT;
    public static final int MODE_COMMUNICATION_REDIRECT = AudioSystem.MODE_COMMUNICATION_REDIRECT;


    /**
     * Use this mode whenever an assistant conversation mode is started.
     */
    @FlaggedApi(FLAG_ASSISTANT_VOLUME_CONTROL)
    public static final int MODE_ASSISTANT_CONVERSATION = AudioSystem.MODE_ASSISTANT_CONVERSATION;

    /** @hide */
    /** @hide */
    @IntDef(flag = false, prefix = "MODE_", value = {
    @IntDef(flag = false, prefix = "MODE_", value = {
            MODE_NORMAL,
            MODE_NORMAL,
@@ -3685,7 +3694,8 @@ public class AudioManager {
            MODE_IN_COMMUNICATION,
            MODE_IN_COMMUNICATION,
            MODE_CALL_SCREENING,
            MODE_CALL_SCREENING,
            MODE_CALL_REDIRECT,
            MODE_CALL_REDIRECT,
            MODE_COMMUNICATION_REDIRECT}
            MODE_COMMUNICATION_REDIRECT,
            MODE_ASSISTANT_CONVERSATION}
    )
    )
    @Retention(RetentionPolicy.SOURCE)
    @Retention(RetentionPolicy.SOURCE)
    public @interface AudioMode {}
    public @interface AudioMode {}
+4 −1
Original line number Original line Diff line number Diff line
@@ -211,7 +211,9 @@ public class AudioSystem
    /** @hide */
    /** @hide */
    public static final int MODE_COMMUNICATION_REDIRECT  = 6;
    public static final int MODE_COMMUNICATION_REDIRECT  = 6;
    /** @hide */
    /** @hide */
    public static final int NUM_MODES               = 7;
    public static final int MODE_ASSISTANT_CONVERSATION  = 7;
    /** @hide */
    public static final int NUM_MODES               = 8;


    /** @hide */
    /** @hide */
    public static String modeToString(int mode) {
    public static String modeToString(int mode) {
@@ -225,6 +227,7 @@ public class AudioSystem
            case MODE_CALL_SCREENING: return "MODE_CALL_SCREENING";
            case MODE_CALL_SCREENING: return "MODE_CALL_SCREENING";
            case MODE_CALL_REDIRECT: return "MODE_CALL_REDIRECT";
            case MODE_CALL_REDIRECT: return "MODE_CALL_REDIRECT";
            case MODE_COMMUNICATION_REDIRECT: return "MODE_COMMUNICATION_REDIRECT";
            case MODE_COMMUNICATION_REDIRECT: return "MODE_COMMUNICATION_REDIRECT";
            case MODE_ASSISTANT_CONVERSATION: return "MODE_ASSISTANT_CONVERSATION";
            default: return "unknown mode (" + mode + ")";
            default: return "unknown mode (" + mode + ")";
        }
        }
    }
    }
+14 −2
Original line number Original line Diff line number Diff line
@@ -44,6 +44,7 @@ import static android.media.AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_UNSE
import static android.media.AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_VARIABLE;
import static android.media.AudioDeviceVolumeManager.DEVICE_VOLUME_BEHAVIOR_VARIABLE;
import static android.media.AudioManager.AUDIO_DEVICE_CATEGORY_HEADPHONES;
import static android.media.AudioManager.AUDIO_DEVICE_CATEGORY_HEADPHONES;
import static android.media.AudioManager.FLAG_ABSOLUTE_VOLUME;
import static android.media.AudioManager.FLAG_ABSOLUTE_VOLUME;
import static android.media.AudioManager.MODE_ASSISTANT_CONVERSATION;
import static android.media.AudioManager.RINGER_MODE_NORMAL;
import static android.media.AudioManager.RINGER_MODE_NORMAL;
import static android.media.AudioManager.RINGER_MODE_SILENT;
import static android.media.AudioManager.RINGER_MODE_SILENT;
import static android.media.AudioManager.RINGER_MODE_VIBRATE;
import static android.media.AudioManager.RINGER_MODE_VIBRATE;
@@ -7032,9 +7033,20 @@ public class AudioService extends IAudioService.Stub
            Log.v(TAG, "setMode(mode=" + mode + ", pid=" + pid
            Log.v(TAG, "setMode(mode=" + mode + ", pid=" + pid
                    + ", uid=" + uid + ", caller=" + callingPackage + ")");
                    + ", uid=" + uid + ", caller=" + callingPackage + ")");
        }
        }
        if (!checkAudioSettingsPermission("setMode()")) {
        if (mContext.checkCallingPermission(
                MODIFY_AUDIO_SETTINGS_PRIVILEGED) != PackageManager.PERMISSION_GRANTED) {
            if (mode == MODE_ASSISTANT_CONVERSATION) {
                Log.w(TAG,
                        "MODIFY_AUDIO_SETTINGS_PRIVILEGED Permission Denial for "
                                + "MODE_ASSISTANT_CONVERSATION: setMode() from pid="
                                + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid());
                return;
                return;
            } else if (!checkAudioSettingsPermission("setMode()")) {
                return;
            }
        }
        }
        if (cb == null) {
        if (cb == null) {
            Log.e(TAG, "setMode() called with null binder");
            Log.e(TAG, "setMode() called with null binder");
            return;
            return;