Loading core/api/current.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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 media/java/android/media/AudioManager.java +14 −4 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. */ */ Loading Loading @@ -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, Loading @@ -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 {} Loading media/java/android/media/AudioSystem.java +4 −1 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading @@ -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 + ")"; } } } } Loading services/core/java/com/android/server/audio/AudioService.java +14 −2 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading
core/api/current.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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
media/java/android/media/AudioManager.java +14 −4 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. */ */ Loading Loading @@ -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, Loading @@ -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 {} Loading
media/java/android/media/AudioSystem.java +4 −1 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading @@ -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 + ")"; } } } } Loading
services/core/java/com/android/server/audio/AudioService.java +14 −2 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading