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
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 53fcf32..4a01c61 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 @@
         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 @@
                 boolean hasModifyAudioSettings) {
             boolean changed;
             int oldIndex;
+            final boolean isCurrentDevice;
             synchronized (mSettingsLock) {
                 synchronized (VolumeStreamState.class) {
                     oldIndex = getIndex(device);
@@ -7854,7 +7859,7 @@
                     // - 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 @@
                     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,