send volume button events to adjustSuggestedStream instead of adjustStream
This way the audio system can route the adjustments correctly when a bt
headset is connected.
bug:17281977
Change-Id: Ic41d038e47179baffc86e539562da285446148c7
diff --git a/media/java/android/media/AudioManagerInternal.java b/media/java/android/media/AudioManagerInternal.java
index 6f1bdef..7c0d758 100644
--- a/media/java/android/media/AudioManagerInternal.java
+++ b/media/java/android/media/AudioManagerInternal.java
@@ -26,6 +26,10 @@
*/
public abstract class AudioManagerInternal {
+ public abstract void adjustSuggestedStreamVolumeForUid(int streamType, int direction,
+ int flags,
+ String callingPackage, int uid);
+
public abstract void adjustStreamVolumeForUid(int streamType, int direction, int flags,
String callingPackage, int uid);
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 329033c..166c7af 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -904,6 +904,12 @@
/** @see AudioManager#adjustVolume(int, int) */
public void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags,
String callingPackage) {
+ adjustSuggestedStreamVolume(direction, suggestedStreamType, flags, callingPackage,
+ Binder.getCallingUid());
+ }
+
+ private void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags,
+ String callingPackage, int uid) {
if (DEBUG_VOL) Log.d(TAG, "adjustSuggestedStreamVolume() stream="+suggestedStreamType
+ ", flags=" + flags);
int streamType;
@@ -928,7 +934,7 @@
if (DEBUG_VOL) Log.d(TAG, "Volume controller suppressed adjustment");
}
- adjustStreamVolume(streamType, direction, flags, callingPackage);
+ adjustStreamVolume(streamType, direction, flags, callingPackage, uid);
}
/** @see AudioManager#adjustStreamVolume(int, int, int) */
@@ -5339,6 +5345,15 @@
* LocalServices.
*/
final class AudioServiceInternal extends AudioManagerInternal {
+
+ @Override
+ public void adjustSuggestedStreamVolumeForUid(int streamType, int direction, int flags,
+ String callingPackage, int uid) {
+ // direction and stream type swap here because the public
+ // adjustSuggested has a different order than the other methods.
+ adjustSuggestedStreamVolume(direction, streamType, flags, callingPackage, uid);
+ }
+
@Override
public void adjustStreamVolumeForUid(int streamType, int direction, int flags,
String callingPackage, int uid) {
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index b936130d..5097927 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -229,8 +229,14 @@
* {@link AudioManager#ADJUST_SAME}.
*
* @param direction The direction to adjust volume in.
+ * @param flags Any of the flags from {@link AudioManager}.
+ * @param packageName The package that made the original volume request.
+ * @param uid The uid that made the original volume request.
+ * @param useSuggested True to use adjustSuggestedStreamVolume instead of
+ * adjustStreamVolume.
*/
- public void adjustVolume(int direction, int flags, String packageName, int uid) {
+ public void adjustVolume(int direction, int flags, String packageName, int uid,
+ boolean useSuggested) {
if (isPlaybackActive(false) || hasFlag(MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY)) {
flags &= ~AudioManager.FLAG_PLAY_SOUND;
}
@@ -241,8 +247,13 @@
}
if (mVolumeType == PlaybackInfo.PLAYBACK_TYPE_LOCAL) {
int stream = AudioAttributes.toLegacyStreamType(mAudioAttrs);
- mAudioManagerInternal.adjustStreamVolumeForUid(stream, direction, flags, packageName,
- uid);
+ if (useSuggested) {
+ mAudioManagerInternal.adjustSuggestedStreamVolumeForUid(stream, direction, flags,
+ packageName, uid);
+ } else {
+ mAudioManagerInternal.adjustStreamVolumeForUid(stream, direction, flags,
+ packageName, uid);
+ }
} else {
if (mVolumeControlType == VolumeProvider.VOLUME_CONTROL_FIXED) {
// Nothing to do, the volume cannot be changed
@@ -1020,7 +1031,7 @@
int uid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
try {
- MediaSessionRecord.this.adjustVolume(direction, flags, packageName, uid);
+ MediaSessionRecord.this.adjustVolume(direction, flags, packageName, uid, false);
} finally {
Binder.restoreCallingIdentity(token);
}
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 0c6d46c..a12dd1c 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -814,7 +814,7 @@
}
} else {
session.adjustVolume(direction, flags, getContext().getPackageName(),
- UserHandle.myUserId());
+ UserHandle.myUserId(), true);
if (session.getPlaybackType() == PlaybackInfo.PLAYBACK_TYPE_REMOTE
&& mRvc != null) {
try {