Merge "Handle volume events on master volume devices correctly" into lmp-mr1-dev

This commit is contained in:
RoboErik
2014-11-20 17:59:12 +00:00
committed by Android (Google) Code Review
4 changed files with 43 additions and 11 deletions

View File

@ -35,4 +35,7 @@ public abstract class AudioManagerInternal {
public abstract void setStreamVolumeForUid(int streamType, int direction, int flags,
String callingPackage, int uid);
public abstract void adjustMasterVolumeForUid(int steps, int flags, String callingPackage,
int uid);
}

View File

@ -50,7 +50,6 @@ import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.audiopolicy.AudioMix;
import android.media.audiopolicy.AudioPolicyConfig;
import android.media.session.MediaSessionLegacyHelper;
import android.os.Binder;
import android.os.Build;
import android.os.Environment;
@ -61,7 +60,6 @@ import android.os.Message;
import android.os.PowerManager;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
@ -75,12 +73,11 @@ import android.util.Log;
import android.util.MathUtils;
import android.util.Slog;
import android.view.KeyEvent;
import android.view.OrientationEventListener;
import android.view.Surface;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityManager;
import android.view.OrientationEventListener;
import com.android.internal.telephony.ITelephony;
import com.android.internal.util.XmlUtils;
import com.android.server.LocalServices;
@ -91,8 +88,6 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.concurrent.ConcurrentHashMap;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@ -100,6 +95,7 @@ import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* The implementation of the volume manager service.
@ -1152,6 +1148,10 @@ public class AudioService extends IAudioService.Stub {
/** @see AudioManager#adjustMasterVolume(int, int) */
public void adjustMasterVolume(int steps, int flags, String callingPackage) {
adjustMasterVolume(steps, flags, callingPackage, Binder.getCallingUid());
}
public void adjustMasterVolume(int steps, int flags, String callingPackage, int uid) {
if (mUseFixedVolume) {
return;
}
@ -1166,7 +1166,7 @@ public class AudioService extends IAudioService.Stub {
}
//Log.d(TAG, "adjustMasterVolume volume: " + volume + " steps: " + steps);
setMasterVolume(volume, flags, callingPackage);
setMasterVolume(volume, flags, callingPackage, uid);
}
// StreamVolumeCommand contains the information needed to defer the process of
@ -1679,18 +1679,24 @@ public class AudioService extends IAudioService.Stub {
}
}
@Override
public int getMasterVolume() {
if (isMasterMute()) return 0;
return getLastAudibleMasterVolume();
}
@Override
public void setMasterVolume(int volume, int flags, String callingPackage) {
setMasterVolume(volume, flags, callingPackage, Binder.getCallingUid());
}
public void setMasterVolume(int volume, int flags, String callingPackage, int uid) {
if (mUseFixedVolume) {
return;
}
if (mAppOps.noteOp(AppOpsManager.OP_AUDIO_MASTER_VOLUME, Binder.getCallingUid(),
callingPackage) != AppOpsManager.MODE_ALLOWED) {
if (mAppOps.noteOp(AppOpsManager.OP_AUDIO_MASTER_VOLUME, uid, callingPackage)
!= AppOpsManager.MODE_ALLOWED) {
return;
}
@ -5667,6 +5673,12 @@ public class AudioService extends IAudioService.Stub {
String callingPackage, int uid) {
setStreamVolume(streamType, direction, flags, callingPackage, uid);
}
@Override
public void adjustMasterVolumeForUid(int steps, int flags, String callingPackage,
int uid) {
adjustMasterVolume(steps, flags, callingPackage, uid);
}
}
//==========================================================================================

View File

@ -90,6 +90,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
private final SessionStub mSession;
private final SessionCb mSessionCb;
private final MediaSessionService mService;
private final boolean mUseMasterVolume;
private final Object mLock = new Object();
private final ArrayList<ISessionControllerCallback> mControllerCallbacks =
@ -139,6 +140,8 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
mAudioManager = (AudioManager) service.getContext().getSystemService(Context.AUDIO_SERVICE);
mAudioManagerInternal = LocalServices.getService(AudioManagerInternal.class);
mAudioAttrs = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build();
mUseMasterVolume = service.getContext().getResources().getBoolean(
com.android.internal.R.bool.config_useMasterVolume);
}
/**
@ -248,6 +251,12 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
direction = -1;
}
if (mVolumeType == PlaybackInfo.PLAYBACK_TYPE_LOCAL) {
if (mUseMasterVolume) {
// If this device only uses master volume and playback is local
// just adjust the master volume and return.
mAudioManagerInternal.adjustMasterVolumeForUid(direction, flags, packageName, uid);
return;
}
int stream = AudioAttributes.toLegacyStreamType(mAudioAttrs);
if (useSuggested) {
if (AudioSystem.isStreamActive(stream, 0)) {

View File

@ -86,6 +86,7 @@ public class MediaSessionService extends SystemService implements Monitor {
private final Object mLock = new Object();
private final MessageHandler mHandler = new MessageHandler();
private final PowerManager.WakeLock mMediaEventWakeLock;
private final boolean mUseMasterVolume;
private KeyguardManager mKeyguardManager;
private IAudioService mAudioService;
@ -104,6 +105,8 @@ public class MediaSessionService extends SystemService implements Monitor {
mPriorityStack = new MediaSessionStack();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mMediaEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleMediaEvent");
mUseMasterVolume = context.getResources().getBoolean(
com.android.internal.R.bool.config_useMasterVolume);
}
@Override
@ -819,8 +822,13 @@ public class MediaSessionService extends SystemService implements Monitor {
return;
}
try {
mAudioService.adjustSuggestedStreamVolume(direction, suggestedStream, flags,
getContext().getOpPackageName());
if (mUseMasterVolume) {
mAudioService.adjustMasterVolume(direction, flags,
getContext().getOpPackageName());
} else {
mAudioService.adjustSuggestedStreamVolume(direction, suggestedStream, flags,
getContext().getOpPackageName());
}
} catch (RemoteException e) {
Log.e(TAG, "Error adjusting default volume.", e);
}