Merge "Pipe caller's identity through volume methods" into lmp-dev

This commit is contained in:
RoboErik
2014-08-14 18:05:19 +00:00
committed by Android (Google) Code Review
6 changed files with 90 additions and 17 deletions

View File

@@ -0,0 +1,34 @@
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.media;
import com.android.server.LocalServices;
/**
* Class for system services to access extra AudioManager functionality. The
* AudioService is responsible for registering an implementation with
* {@link LocalServices}.
*
* @hide
*/
public abstract class AudioManagerInternal {
public abstract void adjustStreamVolumeForUid(int streamType, int direction, int flags,
String callingPackage, int uid);
public abstract void setStreamVolumeForUid(int streamType, int direction, int flags,
String callingPackage, int uid);
}

View File

@@ -79,6 +79,7 @@ import android.view.WindowManager;
import com.android.internal.telephony.ITelephony;
import com.android.internal.util.XmlUtils;
import com.android.server.LocalServices;
import org.xmlpull.v1.XmlPullParserException;
@@ -630,6 +631,7 @@ public class AudioService extends IAudioService.Stub {
mMasterVolumeRamp = context.getResources().getIntArray(
com.android.internal.R.array.config_masterVolumeRamp);
LocalServices.addService(AudioManagerInternal.class, new AudioServiceInternal());
}
public void systemReady() {
@@ -924,6 +926,11 @@ public class AudioService extends IAudioService.Stub {
/** @see AudioManager#adjustStreamVolume(int, int, int) */
public void adjustStreamVolume(int streamType, int direction, int flags,
String callingPackage) {
adjustStreamVolume(streamType, direction, flags, callingPackage, Binder.getCallingUid());
}
private void adjustStreamVolume(int streamType, int direction, int flags,
String callingPackage, int uid) {
if (mUseFixedVolume) {
return;
}
@@ -952,8 +959,8 @@ public class AudioService extends IAudioService.Stub {
return;
}
if (mAppOps.noteOp(STEAM_VOLUME_OPS[streamTypeAlias], Binder.getCallingUid(),
callingPackage) != AppOpsManager.MODE_ALLOWED) {
if (mAppOps.noteOp(STEAM_VOLUME_OPS[streamTypeAlias], uid, callingPackage)
!= AppOpsManager.MODE_ALLOWED) {
return;
}
@@ -1129,6 +1136,11 @@ public class AudioService extends IAudioService.Stub {
/** @see AudioManager#setStreamVolume(int, int, int) */
public void setStreamVolume(int streamType, int index, int flags, String callingPackage) {
setStreamVolume(streamType, index, flags, callingPackage, Binder.getCallingUid());
}
private void setStreamVolume(int streamType, int index, int flags, String callingPackage,
int uid) {
if (mUseFixedVolume) {
return;
}
@@ -1147,8 +1159,8 @@ public class AudioService extends IAudioService.Stub {
return;
}
if (mAppOps.noteOp(STEAM_VOLUME_OPS[streamTypeAlias], Binder.getCallingUid(),
callingPackage) != AppOpsManager.MODE_ALLOWED) {
if (mAppOps.noteOp(STEAM_VOLUME_OPS[streamTypeAlias], uid, callingPackage)
!= AppOpsManager.MODE_ALLOWED) {
return;
}
@@ -5288,6 +5300,24 @@ public class AudioService extends IAudioService.Stub {
}
}
/**
* Interface for system components to get some extra functionality through
* LocalServices.
*/
final class AudioServiceInternal extends AudioManagerInternal {
@Override
public void adjustStreamVolumeForUid(int streamType, int direction, int flags,
String callingPackage, int uid) {
adjustStreamVolume(streamType, direction, flags, callingPackage, uid);
}
@Override
public void setStreamVolumeForUid(int streamType, int direction, int flags,
String callingPackage, int uid) {
setStreamVolume(streamType, direction, flags, callingPackage, uid);
}
}
//==========================================================================================
// Audio policy management
//==========================================================================================

View File

@@ -48,8 +48,8 @@ interface ISessionController {
PendingIntent getLaunchPendingIntent();
long getFlags();
ParcelableVolumeInfo getVolumeAttributes();
void adjustVolume(int direction, int flags);
void setVolumeTo(int value, int flags);
void adjustVolume(int direction, int flags, String packageName);
void setVolumeTo(int value, int flags, String packageName);
IMediaRouterDelegate createMediaRouterDelegate(IMediaRouterStateCallback callback);

View File

@@ -311,7 +311,7 @@ public final class MediaController {
*/
public void setVolumeTo(int value, int flags) {
try {
mSessionBinder.setVolumeTo(value, flags);
mSessionBinder.setVolumeTo(value, flags, mContext.getPackageName());
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling setVolumeTo.", e);
}
@@ -332,7 +332,7 @@ public final class MediaController {
*/
public void adjustVolume(int direction, int flags) {
try {
mSessionBinder.adjustVolume(direction, flags);
mSessionBinder.adjustVolume(direction, flags, mContext.getPackageName());
} catch (RemoteException e) {
Log.wtf(TAG, "Error calling adjustVolumeBy.", e);
}

View File

@@ -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.
@@ -1018,20 +1024,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);
}

View File

@@ -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 {