From 473f4861c5177783e464f23aa1279ce4a06bfc16 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Tue, 15 Nov 2022 04:00:50 +0000 Subject: [PATCH] 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 --- .../java/com/android/server/audio/AudioService.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 53fcf32935257..4a01c61830d01 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -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,