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

Commit be2794fe authored by Vlad Popa's avatar Vlad Popa
Browse files

Add new mode for assistant conversations

This is a new mode that will inform the audio framework that an active
assistant conversation is currently happening. This can have influence
on the volume management or routing.

Test: make
Bug: 416329698
Flag: android.media.audio.assistant_volume_control

Change-Id: I66589aad31cca208a26cabe2008c2feadacda15a
parent f70831e7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -22347,6 +22347,7 @@ package android.media {
    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_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_SCREENING = 4; // 0x4
    field public static final int MODE_COMMUNICATION_REDIRECT = 6; // 0x6
+14 −4
Original line number Diff line number Diff line
@@ -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_ASSISTANT_VOLUME_CONTROL;
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_FREEZE_TEST_API;
@@ -3486,14 +3487,16 @@ public class AudioManager {
    /**
     * Sets the audio mode.
     * <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
     * 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
     * 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
     *              it can route the audio appropriately.
     */
@@ -3677,6 +3680,12 @@ public class AudioManager {
     */
    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 */
    @IntDef(flag = false, prefix = "MODE_", value = {
            MODE_NORMAL,
@@ -3685,7 +3694,8 @@ public class AudioManager {
            MODE_IN_COMMUNICATION,
            MODE_CALL_SCREENING,
            MODE_CALL_REDIRECT,
            MODE_COMMUNICATION_REDIRECT}
            MODE_COMMUNICATION_REDIRECT,
            MODE_ASSISTANT_CONVERSATION}
    )
    @Retention(RetentionPolicy.SOURCE)
    public @interface AudioMode {}
+4 −1
Original line number Diff line number Diff line
@@ -211,7 +211,9 @@ public class AudioSystem
    /** @hide */
    public static final int MODE_COMMUNICATION_REDIRECT  = 6;
    /** @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 */
    public static String modeToString(int mode) {
@@ -225,6 +227,7 @@ public class AudioSystem
            case MODE_CALL_SCREENING: return "MODE_CALL_SCREENING";
            case MODE_CALL_REDIRECT: return "MODE_CALL_REDIRECT";
            case MODE_COMMUNICATION_REDIRECT: return "MODE_COMMUNICATION_REDIRECT";
            case MODE_ASSISTANT_CONVERSATION: return "MODE_ASSISTANT_CONVERSATION";
            default: return "unknown mode (" + mode + ")";
        }
    }
+14 −2
Original line number 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.AudioManager.AUDIO_DEVICE_CATEGORY_HEADPHONES;
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_SILENT;
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
                    + ", 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;
            } else if (!checkAudioSettingsPermission("setMode()")) {
                return;
            }
        }
        if (cb == null) {
            Log.e(TAG, "setMode() called with null binder");
            return;