diff options
| -rwxr-xr-x | api/system-current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/provider/Settings.java | 9 | ||||
| -rw-r--r-- | core/res/res/values/config.xml | 3 | ||||
| -rw-r--r-- | core/res/res/values/symbols.xml | 1 | ||||
| -rw-r--r-- | media/java/android/media/AudioManager.java | 4 | ||||
| -rw-r--r-- | media/java/android/media/AudioSystem.java | 8 | ||||
| -rw-r--r-- | packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java | 1 | ||||
| -rw-r--r-- | services/core/java/com/android/server/audio/AudioService.java | 39 |
8 files changed, 58 insertions, 8 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index b449b2e739e7..34aea9e9ddb3 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3970,6 +3970,7 @@ package android.media { field public static final int AUDIOFOCUS_FLAG_DELAY_OK = 1; // 0x1 field public static final int AUDIOFOCUS_FLAG_LOCK = 4; // 0x4 field public static final int AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS = 2; // 0x2 + field @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int STREAM_ASSISTANT = 11; // 0xb field public static final int SUCCESS = 0; // 0x0 } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 197d814e59d5..4d579a62dccf 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -3869,6 +3869,12 @@ public final class Settings { public static final String VOLUME_ACCESSIBILITY = "volume_a11y"; /** + * @hide + * Volume index for virtual assistant. + */ + public static final String VOLUME_ASSISTANT = "volume_assistant"; + + /** * Master volume (float in the range 0.0f to 1.0f). * * @hide @@ -3946,7 +3952,7 @@ public final class Settings { "" /*STREAM_SYSTEM_ENFORCED, no setting for this stream*/, "" /*STREAM_DTMF, no setting for this stream*/, "" /*STREAM_TTS, no setting for this stream*/, - VOLUME_ACCESSIBILITY + VOLUME_ACCESSIBILITY, VOLUME_ASSISTANT }; /** @@ -4493,6 +4499,7 @@ public final class Settings { PUBLIC_SETTINGS.add(VOLUME_ALARM); PUBLIC_SETTINGS.add(VOLUME_NOTIFICATION); PUBLIC_SETTINGS.add(VOLUME_BLUETOOTH_SCO); + PUBLIC_SETTINGS.add(VOLUME_ASSISTANT); PUBLIC_SETTINGS.add(RINGTONE); PUBLIC_SETTINGS.add(NOTIFICATION_SOUND); PUBLIC_SETTINGS.add(ALARM_ALERT); diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 89c913b8f580..bbaec91bcd8e 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4194,4 +4194,7 @@ value is left empty. When this is non-empty then config_rawContactsLocalAccountName should also be non-empty.--> <string name="config_rawContactsLocalAccountType" translatable="false"></string> + + <!-- Whether or not to use assistant stream volume separately from music volume --> + <bool name="config_useAssistantVolume">false</bool> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 6956c39375a2..d5a6f60f3c0a 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -458,6 +458,7 @@ <java-symbol type="string" name="config_deviceSpecificAudioService" /> <java-symbol type="integer" name="config_num_physical_slots" /> <java-symbol type="array" name="config_integrityRuleProviderPackages" /> + <java-symbol type="bool" name="config_useAssistantVolume" /> <java-symbol type="color" name="tab_indicator_text_v4" /> diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index fac276cfb5d1..061dac6306f8 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -374,6 +374,10 @@ public class AudioManager { public static final int STREAM_TTS = AudioSystem.STREAM_TTS; /** Used to identify the volume of audio streams for accessibility prompts */ public static final int STREAM_ACCESSIBILITY = AudioSystem.STREAM_ACCESSIBILITY; + /** @hide Used to identify the volume of audio streams for virtual assistant */ + @SystemApi + @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) + public static final int STREAM_ASSISTANT = AudioSystem.STREAM_ASSISTANT; /** Number of audio streams */ /** diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index df799fdf98b2..1f775b63df6d 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -80,6 +80,8 @@ public class AudioSystem public static final int STREAM_TTS = 9; /** Used to identify the volume of audio streams for accessibility prompts */ public static final int STREAM_ACCESSIBILITY = 10; + /** Used to identify the volume of audio streams for virtual assistant */ + public static final int STREAM_ASSISTANT = 11; /** * @deprecated Use {@link #numStreamTypes() instead} */ @@ -92,7 +94,7 @@ public class AudioSystem private static native int native_get_FCC_8(); // Expose only the getter method publicly so we can change it in the future - private static final int NUM_STREAM_TYPES = 11; + private static final int NUM_STREAM_TYPES = 12; @UnsupportedAppUsage public static final int getNumStreamTypes() { return NUM_STREAM_TYPES; } @@ -107,7 +109,8 @@ public class AudioSystem "STREAM_SYSTEM_ENFORCED", "STREAM_DTMF", "STREAM_TTS", - "STREAM_ACCESSIBILITY" + "STREAM_ACCESSIBILITY", + "STREAM_ASSISTANT" }; /* @@ -1265,6 +1268,7 @@ public class AudioSystem 5, // STREAM_DTMF 5, // STREAM_TTS 5, // STREAM_ACCESSIBILITY + 5, // STREAM_ASSISTANT }; public static String streamToString(int stream) { diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java index 4a10e85206d3..1ab28e89a26b 100644 --- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java +++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java @@ -87,6 +87,7 @@ public class SettingsBackupTest { Settings.System.VOLUME_ACCESSIBILITY, // used internally, changing value will // not change volume Settings.System.VOLUME_ALARM, // deprecated since API 2? + Settings.System.VOLUME_ASSISTANT, // candidate for backup? Settings.System.VOLUME_BLUETOOTH_SCO, // deprecated since API 2? Settings.System.VOLUME_MASTER, // candidate for backup? Settings.System.VOLUME_MUSIC, // deprecated since API 2? diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 335cac86b543..21cecc24117a 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -310,7 +310,8 @@ public class AudioService extends IAudioService.Stub 7, // STREAM_SYSTEM_ENFORCED 15, // STREAM_DTMF 15, // STREAM_TTS - 15 // STREAM_ACCESSIBILITY + 15, // STREAM_ACCESSIBILITY + 15 // STREAM_ASSISTANT }; /** Minimum volume index values for audio streams */ @@ -325,7 +326,8 @@ public class AudioService extends IAudioService.Stub 0, // STREAM_SYSTEM_ENFORCED 0, // STREAM_DTMF 0, // STREAM_TTS - 1 // STREAM_ACCESSIBILITY + 1, // STREAM_ACCESSIBILITY + 0 // STREAM_ASSISTANT }; /* mStreamVolumeAlias[] indicates for each stream if it uses the volume settings @@ -348,7 +350,8 @@ public class AudioService extends IAudioService.Stub AudioSystem.STREAM_RING, // STREAM_SYSTEM_ENFORCED AudioSystem.STREAM_RING, // STREAM_DTMF AudioSystem.STREAM_MUSIC, // STREAM_TTS - AudioSystem.STREAM_MUSIC // STREAM_ACCESSIBILITY + AudioSystem.STREAM_MUSIC, // STREAM_ACCESSIBILITY + AudioSystem.STREAM_MUSIC // STREAM_ASSISTANT }; private final int[] STREAM_VOLUME_ALIAS_TELEVISION = new int[] { AudioSystem.STREAM_MUSIC, // STREAM_VOICE_CALL @@ -361,7 +364,8 @@ public class AudioService extends IAudioService.Stub AudioSystem.STREAM_MUSIC, // STREAM_SYSTEM_ENFORCED AudioSystem.STREAM_MUSIC, // STREAM_DTMF AudioSystem.STREAM_MUSIC, // STREAM_TTS - AudioSystem.STREAM_MUSIC // STREAM_ACCESSIBILITY + AudioSystem.STREAM_MUSIC, // STREAM_ACCESSIBILITY + AudioSystem.STREAM_MUSIC // STREAM_ASSISTANT }; private final int[] STREAM_VOLUME_ALIAS_DEFAULT = new int[] { AudioSystem.STREAM_VOICE_CALL, // STREAM_VOICE_CALL @@ -374,7 +378,8 @@ public class AudioService extends IAudioService.Stub AudioSystem.STREAM_RING, // STREAM_SYSTEM_ENFORCED AudioSystem.STREAM_RING, // STREAM_DTMF AudioSystem.STREAM_MUSIC, // STREAM_TTS - AudioSystem.STREAM_MUSIC // STREAM_ACCESSIBILITY + AudioSystem.STREAM_MUSIC, // STREAM_ACCESSIBILITY + AudioSystem.STREAM_MUSIC // STREAM_ASSISTANT }; protected static int[] mStreamVolumeAlias; @@ -394,6 +399,7 @@ public class AudioService extends IAudioService.Stub AppOpsManager.OP_AUDIO_MEDIA_VOLUME, // STREAM_DTMF AppOpsManager.OP_AUDIO_MEDIA_VOLUME, // STREAM_TTS AppOpsManager.OP_AUDIO_ACCESSIBILITY_VOLUME, // STREAM_ACCESSIBILITY + AppOpsManager.OP_AUDIO_MEDIA_VOLUME // STREAM_ASSISTANT }; private final boolean mUseFixedVolume; @@ -1253,6 +1259,9 @@ public class AudioService extends IAudioService.Stub int dtmfStreamAlias; final int a11yStreamAlias = sIndependentA11yVolume ? AudioSystem.STREAM_ACCESSIBILITY : AudioSystem.STREAM_MUSIC; + final int assistantStreamAlias = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_useAssistantVolume) ? + AudioSystem.STREAM_ASSISTANT : AudioSystem.STREAM_MUSIC; if (mIsSingleVolume) { mStreamVolumeAlias = STREAM_VOLUME_ALIAS_TELEVISION; @@ -1282,6 +1291,7 @@ public class AudioService extends IAudioService.Stub mStreamVolumeAlias[AudioSystem.STREAM_DTMF] = dtmfStreamAlias; mStreamVolumeAlias[AudioSystem.STREAM_ACCESSIBILITY] = a11yStreamAlias; + mStreamVolumeAlias[AudioSystem.STREAM_ASSISTANT] = assistantStreamAlias; if (updateVolumes && mStreamStates != null) { updateDefaultVolumes(); @@ -1808,6 +1818,17 @@ public class AudioService extends IAudioService.Stub return; } + // If the stream is STREAM_ASSISTANT, + // make sure that the calling app have the MODIFY_AUDIO_ROUTING permission. + if (streamType == AudioSystem.STREAM_ASSISTANT && + mContext.checkCallingOrSelfPermission( + android.Manifest.permission.MODIFY_AUDIO_ROUTING) + != PackageManager.PERMISSION_GRANTED) { + Log.w(TAG, "MODIFY_AUDIO_ROUTING Permission Denial: adjustStreamVolume from pid=" + + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()); + return; + } + // use stream type alias here so that streams with same alias have the same behavior, // including with regard to silent mode control (e.g the use of STREAM_RING below and in // checkForRingerModeChange() in place of STREAM_RING or STREAM_NOTIFICATION) @@ -2244,6 +2265,14 @@ public class AudioService extends IAudioService.Stub + " MODIFY_PHONE_STATE callingPackage=" + callingPackage); return; } + if ((streamType == AudioManager.STREAM_ASSISTANT) + && (mContext.checkCallingOrSelfPermission( + android.Manifest.permission.MODIFY_AUDIO_ROUTING) + != PackageManager.PERMISSION_GRANTED)) { + Log.w(TAG, "Trying to call setStreamVolume() for STREAM_ASSISTANT without" + + " MODIFY_AUDIO_ROUTING callingPackage=" + callingPackage); + return; + } sVolumeLogger.log(new VolumeEvent(VolumeEvent.VOL_SET_STREAM_VOL, streamType, index/*val1*/, flags/*val2*/, callingPackage)); setStreamVolume(streamType, index, flags, callingPackage, callingPackage, |