Fix CTS AudioAttributesTest#testGetVolumeControlStreamVsLegacyStream
Volume group definition and stream control aliases definition may not match on a platform using volume groups to control volumes. This CL prevents from using hard coded alias table in order to rely only on volume groups definition. Also, UiSounds are used to allow volume change on stream previously affected by Dnd. Waiting for better configurability, this CL allows non aliased config to fallback on phone configuration to define stream (and so groups) allowed to be volume adjusted while Dnd. This CL provides a quick default index implementation based on properties for music, call, alarm and system. Other streams would use music default index (may be rescaled if out of range), as per volume group default implementation. BUG: 178032665 Test: cts/AudioManagerTest Signed-off-by: Francois Gaffie <francois.gaffie@renault.com> Change-Id: I4c3191e6189f206c482a3e35080383924cfa8f83
This commit is contained in:
committed by
Eric Laurent
parent
9b60ca5d02
commit
df1ea2236c
@@ -3936,6 +3936,9 @@
|
||||
<!-- Handle volume keys directly in Window Manager without passing them to the foreground app -->
|
||||
<bool name="config_handleVolumeKeysInWindowManager">false</bool>
|
||||
|
||||
<!-- Rely or not on hardcoded aliased streams table within AudioService -->
|
||||
<bool name="config_handleVolumeAliasesUsingVolumeGroups">false</bool>
|
||||
|
||||
<!-- Volume level of in-call notification tone playback [0..1] -->
|
||||
<item name="config_inCallNotificationVolume" format="float" type="dimen">.10</item>
|
||||
|
||||
|
||||
@@ -3632,6 +3632,7 @@
|
||||
<java-symbol type="array" name="config_allowedSecureInstantAppSettings" />
|
||||
|
||||
<java-symbol type="bool" name="config_handleVolumeKeysInWindowManager" />
|
||||
<java-symbol type="bool" name="config_handleVolumeAliasesUsingVolumeGroups" />
|
||||
<java-symbol type="dimen" name="config_inCallNotificationVolume" />
|
||||
<java-symbol type="string" name="config_inCallNotificationSound" />
|
||||
<java-symbol type="integer" name="config_autoGroupAtCount" />
|
||||
|
||||
@@ -413,6 +413,26 @@ public class AudioService extends IAudioService.Stub
|
||||
AudioSystem.STREAM_MUSIC, // STREAM_ACCESSIBILITY
|
||||
AudioSystem.STREAM_MUSIC // STREAM_ASSISTANT
|
||||
};
|
||||
/**
|
||||
* Using Volume groups configuration allows to control volume per attributes
|
||||
* and group definition may differ from stream aliases.
|
||||
* So, do not alias any stream on one another when using volume groups.
|
||||
* TODO(b/181140246): volume group definition hosting alias definition.
|
||||
*/
|
||||
private final int[] STREAM_VOLUME_ALIAS_NONE = new int[] {
|
||||
AudioSystem.STREAM_VOICE_CALL, // STREAM_VOICE_CALL
|
||||
AudioSystem.STREAM_SYSTEM, // STREAM_SYSTEM
|
||||
AudioSystem.STREAM_RING, // STREAM_RING
|
||||
AudioSystem.STREAM_MUSIC, // STREAM_MUSIC
|
||||
AudioSystem.STREAM_ALARM, // STREAM_ALARM
|
||||
AudioSystem.STREAM_NOTIFICATION, // STREAM_NOTIFICATION
|
||||
AudioSystem.STREAM_BLUETOOTH_SCO, // STREAM_BLUETOOTH_SCO
|
||||
AudioSystem.STREAM_SYSTEM_ENFORCED, // STREAM_SYSTEM_ENFORCED
|
||||
AudioSystem.STREAM_DTMF, // STREAM_DTMF
|
||||
AudioSystem.STREAM_TTS, // STREAM_TTS
|
||||
AudioSystem.STREAM_ACCESSIBILITY, // STREAM_ACCESSIBILITY
|
||||
AudioSystem.STREAM_ASSISTANT // STREAM_ASSISTANT
|
||||
};
|
||||
private final int[] STREAM_VOLUME_ALIAS_DEFAULT = new int[] {
|
||||
AudioSystem.STREAM_VOICE_CALL, // STREAM_VOICE_CALL
|
||||
AudioSystem.STREAM_RING, // STREAM_SYSTEM
|
||||
@@ -428,6 +448,7 @@ public class AudioService extends IAudioService.Stub
|
||||
AudioSystem.STREAM_MUSIC // STREAM_ASSISTANT
|
||||
};
|
||||
protected static int[] mStreamVolumeAlias;
|
||||
private static final int UNSET_INDEX = -1;
|
||||
|
||||
/**
|
||||
* Map AudioSystem.STREAM_* constants to app ops. This should be used
|
||||
@@ -449,6 +470,7 @@ public class AudioService extends IAudioService.Stub
|
||||
};
|
||||
|
||||
private final boolean mUseFixedVolume;
|
||||
private final boolean mUseVolumeGroupAliases;
|
||||
|
||||
// If absolute volume is supported in AVRCP device
|
||||
private volatile boolean mAvrcpAbsVolSupported = false;
|
||||
@@ -849,6 +871,9 @@ public class AudioService extends IAudioService.Stub
|
||||
mSupportsMicPrivacyToggle = context.getSystemService(SensorPrivacyManager.class)
|
||||
.supportsSensorToggle(SensorPrivacyManager.Sensors.MICROPHONE);
|
||||
|
||||
mUseVolumeGroupAliases = mContext.getResources().getBoolean(
|
||||
com.android.internal.R.bool.config_handleVolumeAliasesUsingVolumeGroups);
|
||||
|
||||
// Initialize volume
|
||||
// Priority 1 - Android Property
|
||||
// Priority 2 - Audio Policy Service
|
||||
@@ -869,6 +894,12 @@ public class AudioService extends IAudioService.Stub
|
||||
MIN_STREAM_VOLUME[streamType] = minVolume;
|
||||
}
|
||||
}
|
||||
if (mUseVolumeGroupAliases) {
|
||||
// Set all default to uninitialized.
|
||||
for (int stream = 0; stream < AudioSystem.DEFAULT_STREAM_VOLUME.length; stream++) {
|
||||
AudioSystem.DEFAULT_STREAM_VOLUME[stream] = UNSET_INDEX;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int maxCallVolume = SystemProperties.getInt("ro.config.vc_call_vol_steps", -1);
|
||||
@@ -1705,18 +1736,42 @@ public class AudioService extends IAudioService.Stub
|
||||
updateDefaultVolumes();
|
||||
}
|
||||
|
||||
// Update default indexes from aliased streams. Must be called after mStreamStates is created
|
||||
/**
|
||||
* Update default indexes from aliased streams. Must be called after mStreamStates is created
|
||||
* TODO(b/181140246): when using VolumeGroup alias, we are lacking configurability for default
|
||||
* index. Need to make default index configurable and independent of streams.
|
||||
* Fallback on music stream for default initialization to take benefit of property based default
|
||||
* initialization.
|
||||
* For other volume groups not linked to any streams, default music stream index is considered.
|
||||
*/
|
||||
private void updateDefaultVolumes() {
|
||||
for (int stream = 0; stream < mStreamStates.length; stream++) {
|
||||
if (stream != mStreamVolumeAlias[stream]) {
|
||||
AudioSystem.DEFAULT_STREAM_VOLUME[stream] = (rescaleIndex(
|
||||
AudioSystem.DEFAULT_STREAM_VOLUME[mStreamVolumeAlias[stream]] * 10,
|
||||
mStreamVolumeAlias[stream],
|
||||
stream) + 5) / 10;
|
||||
int streamVolumeAlias = mStreamVolumeAlias[stream];
|
||||
if (mUseVolumeGroupAliases) {
|
||||
if (AudioSystem.DEFAULT_STREAM_VOLUME[stream] != UNSET_INDEX) {
|
||||
// Already initialized through default property based mecanism.
|
||||
continue;
|
||||
}
|
||||
streamVolumeAlias = AudioSystem.STREAM_MUSIC;
|
||||
int defaultAliasVolume = getUiDefaultRescaledIndex(streamVolumeAlias, stream);
|
||||
if ((defaultAliasVolume >= MIN_STREAM_VOLUME[stream])
|
||||
&& (defaultAliasVolume <= MAX_STREAM_VOLUME[stream])) {
|
||||
AudioSystem.DEFAULT_STREAM_VOLUME[stream] = defaultAliasVolume;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (stream != streamVolumeAlias) {
|
||||
AudioSystem.DEFAULT_STREAM_VOLUME[stream] =
|
||||
getUiDefaultRescaledIndex(streamVolumeAlias, stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int getUiDefaultRescaledIndex(int srcStream, int dstStream) {
|
||||
return (rescaleIndex(AudioSystem.DEFAULT_STREAM_VOLUME[srcStream] * 10,
|
||||
srcStream, dstStream) + 5) / 10;
|
||||
}
|
||||
|
||||
private void dumpStreamStates(PrintWriter pw) {
|
||||
pw.println("\nStream volumes (device: index)");
|
||||
int numStreamTypes = AudioSystem.getNumStreamTypes();
|
||||
@@ -1740,6 +1795,9 @@ public class AudioService extends IAudioService.Stub
|
||||
if (mIsSingleVolume) {
|
||||
mStreamVolumeAlias = STREAM_VOLUME_ALIAS_TELEVISION;
|
||||
dtmfStreamAlias = AudioSystem.STREAM_MUSIC;
|
||||
} else if (mUseVolumeGroupAliases) {
|
||||
mStreamVolumeAlias = STREAM_VOLUME_ALIAS_NONE;
|
||||
dtmfStreamAlias = AudioSystem.STREAM_DTMF;
|
||||
} else {
|
||||
switch (mPlatformType) {
|
||||
case AudioSystem.PLATFORM_VOICE:
|
||||
@@ -2768,7 +2826,7 @@ public class AudioService extends IAudioService.Stub
|
||||
// If either the client forces allowing ringer modes for this adjustment,
|
||||
// or the stream type is one that is affected by ringer modes
|
||||
if (((flags & AudioManager.FLAG_ALLOW_RINGER_MODES) != 0) ||
|
||||
(streamTypeAlias == getUiSoundsStreamType())) {
|
||||
(isUiSoundsStreamType(streamTypeAlias))) {
|
||||
int ringerMode = getRingerModeInternal();
|
||||
// do not vibrate if already in vibrate mode
|
||||
if (ringerMode == AudioManager.RINGER_MODE_VIBRATE) {
|
||||
@@ -3570,7 +3628,7 @@ public class AudioService extends IAudioService.Stub
|
||||
case Settings.Global.ZEN_MODE_ALARMS:
|
||||
case Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS:
|
||||
return !isStreamMutedByRingerOrZenMode(streamTypeAlias)
|
||||
|| streamTypeAlias == getUiSoundsStreamType()
|
||||
|| isUiSoundsStreamType(streamTypeAlias)
|
||||
|| (flags & AudioManager.FLAG_ALLOW_RINGER_MODES) != 0;
|
||||
}
|
||||
|
||||
@@ -3987,9 +4045,26 @@ public class AudioService extends IAudioService.Stub
|
||||
return (mStreamStates[streamType].getIndex(device) + 5) / 10;
|
||||
}
|
||||
|
||||
/** @see AudioManager#getUiSoundsStreamType() */
|
||||
/** @see AudioManager#getUiSoundsStreamType()
|
||||
* TODO(b/181140246): when using VolumeGroup alias, we are lacking configurability for
|
||||
* UI Sounds identification.
|
||||
* Fallback on Voice configuration to ensure correct behavior of DnD feature.
|
||||
*/
|
||||
public int getUiSoundsStreamType() {
|
||||
return mStreamVolumeAlias[AudioSystem.STREAM_SYSTEM];
|
||||
return mUseVolumeGroupAliases ? STREAM_VOLUME_ALIAS_VOICE[AudioSystem.STREAM_SYSTEM]
|
||||
: mStreamVolumeAlias[AudioSystem.STREAM_SYSTEM];
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO(b/181140246): when using VolumeGroup alias, we are lacking configurability for
|
||||
* UI Sounds identification.
|
||||
* Fallback on Voice configuration to ensure correct behavior of DnD feature.
|
||||
*/
|
||||
private boolean isUiSoundsStreamType(int aliasStreamType) {
|
||||
return mUseVolumeGroupAliases
|
||||
? STREAM_VOLUME_ALIAS_VOICE[aliasStreamType]
|
||||
== STREAM_VOLUME_ALIAS_VOICE[AudioSystem.STREAM_SYSTEM]
|
||||
: aliasStreamType == mStreamVolumeAlias[AudioSystem.STREAM_SYSTEM];
|
||||
}
|
||||
|
||||
/** @see AudioManager#setMicrophoneMute(boolean) */
|
||||
|
||||
Reference in New Issue
Block a user