Merge "Handle volume events on master volume devices correctly" into lmp-mr1-dev
diff --git a/media/java/android/media/AudioManagerInternal.java b/media/java/android/media/AudioManagerInternal.java
index 7c0d758..a6cc493 100644
--- a/media/java/android/media/AudioManagerInternal.java
+++ b/media/java/android/media/AudioManagerInternal.java
@@ -35,4 +35,7 @@
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);
}
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 6e14aba..c70ac55 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -50,7 +50,6 @@
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.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.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.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.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 @@
/** @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 @@
}
//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 @@
}
}
+ @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 @@
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);
+ }
}
//==========================================================================================
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index 921b68b..9440697 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -90,6 +90,7 @@
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 @@
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 @@
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)) {
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index ba18f48..98a3970 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -86,6 +86,7 @@
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 @@
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 @@
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);
}