Merge "Pipe caller's identity through volume methods" into lmp-dev
This commit is contained in:
34
media/java/android/media/AudioManagerInternal.java
Normal file
34
media/java/android/media/AudioManagerInternal.java
Normal 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);
|
||||
}
|
||||
@@ -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
|
||||
//==========================================================================================
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user