Fix ACTION_VOLUME_CHANGED behavior
The AudioDeviceVolumeManager.setDeviceVolume() method enables changing the volume on a device that is not the current device for a given stream. But the ACTION_VOLUME_CHANGED intent was fired for any volume update, regardless of the device affected. Since the intent doesn't indicate for which device the volume changed, an application registering for this intent would receive volume updates that don't match the current volume settings. This change disables firing the intent when the device is not the current device for the stream type. Bug: 253118335 Test: atest android.media.audio.cts.AudioManagerTest#testVolumeChangedIntent Change-Id: I6abad542eaa60a1db5d008d4b141e8f03c8bb29c Merged-In: I31ca413666e9db94b1ed2db20c87effb46753e3e
This commit is contained in:
@@ -3710,6 +3710,10 @@ public class AudioService extends IAudioService.Stub
|
||||
Objects.requireNonNull(vi);
|
||||
Objects.requireNonNull(ada);
|
||||
Objects.requireNonNull(callingPackage);
|
||||
|
||||
AudioService.sVolumeLogger.loglogi("setDeviceVolume" + " from:" + callingPackage + " "
|
||||
+ vi + " " + ada, TAG);
|
||||
|
||||
if (!vi.hasStreamType()) {
|
||||
Log.e(TAG, "Unsupported non-stream type based VolumeInfo", new Exception());
|
||||
return;
|
||||
@@ -7839,6 +7843,7 @@ public class AudioService extends IAudioService.Stub
|
||||
boolean hasModifyAudioSettings) {
|
||||
boolean changed;
|
||||
int oldIndex;
|
||||
final boolean isCurrentDevice;
|
||||
synchronized (mSettingsLock) {
|
||||
synchronized (VolumeStreamState.class) {
|
||||
oldIndex = getIndex(device);
|
||||
@@ -7854,7 +7859,7 @@ public class AudioService extends IAudioService.Stub
|
||||
// - there is no volume index stored for this device on alias stream.
|
||||
// If changing volume of current device, also change volume of current
|
||||
// device on aliased stream
|
||||
final boolean isCurrentDevice = (device == getDeviceForStream(mStreamType));
|
||||
isCurrentDevice = (device == getDeviceForStream(mStreamType));
|
||||
final int numStreamTypes = AudioSystem.getNumStreamTypes();
|
||||
for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
|
||||
final VolumeStreamState aliasStreamState = mStreamStates[streamType];
|
||||
@@ -7894,8 +7899,9 @@ public class AudioService extends IAudioService.Stub
|
||||
EventLogTags.writeVolumeChanged(mStreamType, oldIndex, index, mIndexMax / 10,
|
||||
caller);
|
||||
}
|
||||
// fire changed intents for all streams
|
||||
if (index != oldIndex) {
|
||||
// fire changed intents for all streams, but only when the device it changed on
|
||||
// is the current device
|
||||
if ((index != oldIndex) && isCurrentDevice) {
|
||||
mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, index);
|
||||
mVolumeChanged.putExtra(AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, oldIndex);
|
||||
mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE_ALIAS,
|
||||
|
||||
Reference in New Issue
Block a user