summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorRoboErik <epastern@google.com>2014-08-12 15:48:49 -0700
committerRoboErik <epastern@google.com>2014-08-14 10:21:26 -0700
commit0dac35af2c6aa42bcd181981b041747cfd1afa5f (patch)
tree01b403f03c8727929a76faf98a28c059667c76a5 /services
parentb3cca876c2e11b865cb4f83abe2c48a60b95af5b (diff)
downloadframeworks_base-0dac35af2c6aa42bcd181981b041747cfd1afa5f.zip
frameworks_base-0dac35af2c6aa42bcd181981b041747cfd1afa5f.tar.gz
frameworks_base-0dac35af2c6aa42bcd181981b041747cfd1afa5f.tar.bz2
Pipe caller's identity through volume methods
setStreamVolume and adjustStreamVolume were always being called from the session service's uid/package. This adds the plumbing to allow the original app's info to be passed in to the audio service when volume is changed. Change-Id: Ib36639dab1e518b435161dc453c8ba9351df3e9b
Diffstat (limited to 'services')
-rw-r--r--services/core/java/com/android/server/media/MediaSessionRecord.java24
-rw-r--r--services/core/java/com/android/server/media/MediaSessionService.java3
2 files changed, 18 insertions, 9 deletions
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index e549ead..bb434c8 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -22,6 +22,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.ParceledListSlice;
import android.media.AudioManager;
+import android.media.AudioManagerInternal;
import android.media.MediaMetadata;
import android.media.Rating;
import android.media.VolumeProvider;
@@ -52,6 +53,8 @@ import android.util.Log;
import android.util.Slog;
import android.view.KeyEvent;
+import com.android.server.LocalServices;
+
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.UUID;
@@ -111,6 +114,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
// Volume handling fields
private AudioAttributes mAudioAttrs;
private AudioManager mAudioManager;
+ private AudioManagerInternal mAudioManagerInternal;
private int mVolumeType = MediaSession.PLAYBACK_TYPE_LOCAL;
private int mVolumeControlType = VolumeProvider.VOLUME_CONTROL_ABSOLUTE;
private int mMaxVolume = 0;
@@ -134,6 +138,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
mService = service;
mHandler = new MessageHandler(handler.getLooper());
mAudioManager = (AudioManager) service.getContext().getSystemService(Context.AUDIO_SERVICE);
+ mAudioManagerInternal = LocalServices.getService(AudioManagerInternal.class);
mAudioAttrs = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build();
}
@@ -227,7 +232,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
*
* @param direction The direction to adjust volume in.
*/
- public void adjustVolume(int direction, int flags) {
+ public void adjustVolume(int direction, int flags, String packageName, int uid) {
if (isPlaybackActive(false)) {
flags &= ~AudioManager.FLAG_PLAY_SOUND;
}
@@ -238,7 +243,8 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
if (mVolumeType == MediaSession.PLAYBACK_TYPE_LOCAL) {
int stream = AudioAttributes.toLegacyStreamType(mAudioAttrs);
- mAudioManager.adjustStreamVolume(stream, direction, flags);
+ mAudioManagerInternal.adjustStreamVolumeForUid(stream, direction, flags, packageName,
+ uid);
} else {
if (mVolumeControlType == VolumeProvider.VOLUME_CONTROL_FIXED) {
// Nothing to do, the volume cannot be changed
@@ -262,10 +268,10 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
}
- public void setVolumeTo(int value, int flags) {
+ public void setVolumeTo(int value, int flags, String packageName, int uid) {
if (mVolumeType == MediaSession.PLAYBACK_TYPE_LOCAL) {
int stream = AudioAttributes.toLegacyStreamType(mAudioAttrs);
- mAudioManager.setStreamVolume(stream, value, flags);
+ mAudioManagerInternal.setStreamVolumeForUid(stream, value, flags, packageName, uid);
} else {
if (mVolumeControlType != VolumeProvider.VOLUME_CONTROL_ABSOLUTE) {
// Nothing to do. The volume can't be set directly.
@@ -984,20 +990,22 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
@Override
- public void adjustVolume(int direction, int flags) {
+ public void adjustVolume(int direction, int flags, String packageName) {
+ int uid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
try {
- MediaSessionRecord.this.adjustVolume(direction, flags);
+ MediaSessionRecord.this.adjustVolume(direction, flags, packageName, uid);
} finally {
Binder.restoreCallingIdentity(token);
}
}
@Override
- public void setVolumeTo(int value, int flags) {
+ public void setVolumeTo(int value, int flags, String packageName) {
+ int uid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
try {
- MediaSessionRecord.this.setVolumeTo(value, flags);
+ MediaSessionRecord.this.setVolumeTo(value, flags, packageName, uid);
} 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 0514f48..1221aa4 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -812,7 +812,8 @@ public class MediaSessionService extends SystemService implements Monitor {
Log.e(TAG, "Error adjusting default volume.", e);
}
} else {
- session.adjustVolume(direction, flags);
+ session.adjustVolume(direction, flags, getContext().getPackageName(),
+ UserHandle.myUserId());
if (session.getPlaybackType() == MediaSession.PLAYBACK_TYPE_REMOTE
&& mRvc != null) {
try {