Zen mode filtering should use new usage constants.
Refactor stream-based calls to usage-based calls.
Bug:15279516
Change-Id: I3f7757d8123c14670e2ad5f8e6aa4e9803efe7ec
diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java
index 14a462e..579c449 100644
--- a/services/core/java/com/android/server/AppOpsService.java
+++ b/services/core/java/com/android/server/AppOpsService.java
@@ -36,7 +36,7 @@
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
-import android.media.AudioService;
+import android.media.AudioAttributes;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.Bundle;
@@ -46,7 +46,6 @@
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
-import android.os.UserManager;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AtomicFile;
@@ -62,7 +61,6 @@
import com.android.internal.app.IAppOpsCallback;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.XmlUtils;
-import com.google.android.util.AbstractMessageParser.MusicTrack;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -577,9 +575,9 @@
}
@Override
- public int checkAudioOperation(int code, int stream, int uid, String packageName) {
+ public int checkAudioOperation(int code, int usage, int uid, String packageName) {
synchronized (this) {
- final int mode = checkRestrictionLocked(code, stream, uid, packageName);
+ final int mode = checkRestrictionLocked(code, usage, uid, packageName);
if (mode != AppOpsManager.MODE_ALLOWED) {
return mode;
}
@@ -587,10 +585,10 @@
return checkOperation(code, uid, packageName);
}
- private int checkRestrictionLocked(int code, int stream, int uid, String packageName) {
- final SparseArray<Restriction> streamRestrictions = mAudioRestrictions.get(code);
- if (streamRestrictions != null) {
- final Restriction r = streamRestrictions.get(stream);
+ private int checkRestrictionLocked(int code, int usage, int uid, String packageName) {
+ final SparseArray<Restriction> usageRestrictions = mAudioRestrictions.get(code);
+ if (usageRestrictions != null) {
+ final Restriction r = usageRestrictions.get(usage);
if (r != null && !r.exceptionPackages.contains(packageName)) {
return r.mode;
}
@@ -599,17 +597,17 @@
}
@Override
- public void setAudioRestriction(int code, int stream, int uid, int mode,
+ public void setAudioRestriction(int code, int usage, int uid, int mode,
String[] exceptionPackages) {
verifyIncomingUid(uid);
verifyIncomingOp(code);
synchronized (this) {
- SparseArray<Restriction> streamRestrictions = mAudioRestrictions.get(code);
- if (streamRestrictions == null) {
- streamRestrictions = new SparseArray<Restriction>();
- mAudioRestrictions.put(code, streamRestrictions);
+ SparseArray<Restriction> usageRestrictions = mAudioRestrictions.get(code);
+ if (usageRestrictions == null) {
+ usageRestrictions = new SparseArray<Restriction>();
+ mAudioRestrictions.put(code, usageRestrictions);
}
- streamRestrictions.remove(stream);
+ usageRestrictions.remove(usage);
if (mode != AppOpsManager.MODE_ALLOWED) {
final Restriction r = new Restriction();
r.mode = mode;
@@ -623,7 +621,7 @@
}
}
}
- streamRestrictions.put(stream, r);
+ usageRestrictions.put(usage, r);
}
}
}
@@ -1205,9 +1203,9 @@
printedHeader = true;
needSep = true;
}
- final int stream = restrictions.keyAt(i);
+ final int usage = restrictions.keyAt(i);
pw.print(" "); pw.print(op);
- pw.print(" stream="); pw.print(AudioService.streamToString(stream));
+ pw.print(" usage="); pw.print(AudioAttributes.usageToString(usage));
Restriction r = restrictions.valueAt(i);
pw.print(": mode="); pw.println(r.mode);
if (!r.exceptionPackages.isEmpty()) {
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index fdaf55e..51be98a 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -42,7 +42,7 @@
import android.provider.Settings.SettingNotFoundException;
import android.util.Slog;
import android.view.InputDevice;
-import android.media.AudioManager;
+import android.media.AudioAttributes;
import com.android.internal.app.IAppOpsService;
import com.android.internal.app.IBatteryStats;
@@ -90,27 +90,27 @@
private final long mStartTime;
private final long[] mPattern;
private final int mRepeat;
- private final int mStreamHint;
+ private final int mUsageHint;
private final int mUid;
private final String mOpPkg;
- Vibration(IBinder token, long millis, int streamHint, int uid, String opPkg) {
- this(token, millis, null, 0, streamHint, uid, opPkg);
+ Vibration(IBinder token, long millis, int usageHint, int uid, String opPkg) {
+ this(token, millis, null, 0, usageHint, uid, opPkg);
}
- Vibration(IBinder token, long[] pattern, int repeat, int streamHint, int uid,
+ Vibration(IBinder token, long[] pattern, int repeat, int usageHint, int uid,
String opPkg) {
- this(token, 0, pattern, repeat, streamHint, uid, opPkg);
+ this(token, 0, pattern, repeat, usageHint, uid, opPkg);
}
private Vibration(IBinder token, long millis, long[] pattern,
- int repeat, int streamHint, int uid, String opPkg) {
+ int repeat, int usageHint, int uid, String opPkg) {
mToken = token;
mTimeout = millis;
mStartTime = SystemClock.uptimeMillis();
mPattern = pattern;
mRepeat = repeat;
- mStreamHint = streamHint;
+ mUsageHint = usageHint;
mUid = uid;
mOpPkg = opPkg;
}
@@ -220,7 +220,7 @@
Binder.getCallingPid(), Binder.getCallingUid(), null);
}
- public void vibrate(int uid, String opPkg, long milliseconds, int streamHint,
+ public void vibrate(int uid, String opPkg, long milliseconds, int usageHint,
IBinder token) {
if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.VIBRATE)
!= PackageManager.PERMISSION_GRANTED) {
@@ -237,7 +237,7 @@
return;
}
- Vibration vib = new Vibration(token, milliseconds, streamHint, uid, opPkg);
+ Vibration vib = new Vibration(token, milliseconds, usageHint, uid, opPkg);
final long ident = Binder.clearCallingIdentity();
try {
@@ -263,7 +263,7 @@
}
public void vibratePattern(int uid, String packageName, long[] pattern, int repeat,
- int streamHint, IBinder token) {
+ int usageHint, IBinder token) {
if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.VIBRATE)
!= PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("Requires VIBRATE permission");
@@ -288,7 +288,7 @@
return;
}
- Vibration vib = new Vibration(token, pattern, repeat, streamHint, uid, packageName);
+ Vibration vib = new Vibration(token, pattern, repeat, usageHint, uid, packageName);
try {
token.linkToDeath(vib, 0);
} catch (RemoteException e) {
@@ -372,12 +372,13 @@
// Lock held on mVibrations
private void startVibrationLocked(final Vibration vib) {
try {
- if (mLowPowerMode && vib.mStreamHint != AudioManager.STREAM_RING) {
+ if (mLowPowerMode
+ && vib.mUsageHint != AudioAttributes.USAGE_NOTIFICATION_TELEPHONY_RINGTONE) {
return;
}
int mode = mAppOpsService.checkAudioOperation(AppOpsManager.OP_VIBRATE,
- vib.mStreamHint, vib.mUid, vib.mOpPkg);
+ vib.mUsageHint, vib.mUid, vib.mOpPkg);
if (mode == AppOpsManager.MODE_ALLOWED) {
mode = mAppOpsService.startOperation(AppOpsManager.getToken(mAppOpsService),
AppOpsManager.OP_VIBRATE, vib.mUid, vib.mOpPkg);
@@ -392,7 +393,7 @@
} catch (RemoteException e) {
}
if (vib.mTimeout != 0) {
- doVibratorOn(vib.mTimeout, vib.mUid, vib.mStreamHint);
+ doVibratorOn(vib.mTimeout, vib.mUid, vib.mUsageHint);
mH.postDelayed(mVibrationRunnable, vib.mTimeout);
} else {
// mThread better be null here. doCancelVibrate should always be
@@ -513,7 +514,7 @@
return vibratorExists();
}
- private void doVibratorOn(long millis, int uid, int streamHint) {
+ private void doVibratorOn(long millis, int uid, int usageHint) {
synchronized (mInputDeviceVibrators) {
try {
mBatteryStatsService.noteVibratorOn(uid, millis);
@@ -522,8 +523,10 @@
}
final int vibratorCount = mInputDeviceVibrators.size();
if (vibratorCount != 0) {
+ final AudioAttributes attributes = new AudioAttributes.Builder().setUsage(usageHint)
+ .build();
for (int i = 0; i < vibratorCount; i++) {
- mInputDeviceVibrators.get(i).vibrate(millis, streamHint);
+ mInputDeviceVibrators.get(i).vibrate(millis, attributes);
}
} else {
vibratorOn(millis);
@@ -586,7 +589,7 @@
final int len = pattern.length;
final int repeat = mVibration.mRepeat;
final int uid = mVibration.mUid;
- final int streamHint = mVibration.mStreamHint;
+ final int usageHint = mVibration.mUsageHint;
int index = 0;
long duration = 0;
@@ -607,7 +610,7 @@
// duration is saved for delay() at top of loop
duration = pattern[index++];
if (duration > 0) {
- VibratorService.this.doVibratorOn(duration, uid, streamHint);
+ VibratorService.this.doVibratorOn(duration, uid, usageHint);
}
} else {
if (repeat < 0) {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 0e18776..f7cb346 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -43,6 +43,7 @@
import android.content.pm.ParceledListSlice;
import android.content.res.Resources;
import android.database.ContentObserver;
+import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.IRingtonePlayer;
import android.net.Uri;
@@ -1716,7 +1717,7 @@
useDefaultVibrate ? mDefaultVibrationPattern
: mFallbackVibrationPattern,
((notification.flags & Notification.FLAG_INSISTENT) != 0)
- ? 0: -1, notification.audioStreamType);
+ ? 0: -1, audioAttributesForNotification(notification));
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -1726,7 +1727,7 @@
mVibrator.vibrate(record.sbn.getUid(), record.sbn.getOpPkg(),
notification.vibrate,
((notification.flags & Notification.FLAG_INSISTENT) != 0)
- ? 0: -1, notification.audioStreamType);
+ ? 0: -1, audioAttributesForNotification(notification));
}
}
}
@@ -1748,6 +1749,10 @@
}
}
+ private static AudioAttributes audioAttributesForNotification(Notification n) {
+ return new AudioAttributes.Builder().setLegacyStreamType(n.audioStreamType).build();
+ }
+
void showNextToastLocked() {
ToastRecord record = mToastQueue.get(0);
while (record != null) {
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index 118b9fc..7e82ce5 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -16,6 +16,10 @@
package com.android.server.notification;
+import static android.media.AudioAttributes.USAGE_ALARM;
+import static android.media.AudioAttributes.USAGE_NOTIFICATION_TELEPHONY_RINGTONE;
+import static android.media.AudioAttributes.USAGE_UNKNOWN;
+
import android.app.AlarmManager;
import android.app.AppOpsManager;
import android.app.Notification;
@@ -193,24 +197,24 @@
// call restrictions
final boolean muteCalls = zen && !mConfig.allowCalls;
- mAppOps.setRestriction(AppOpsManager.OP_VIBRATE, AudioManager.STREAM_RING,
+ mAppOps.setRestriction(AppOpsManager.OP_VIBRATE, USAGE_NOTIFICATION_TELEPHONY_RINGTONE,
muteCalls ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED,
exceptionPackages);
- mAppOps.setRestriction(AppOpsManager.OP_PLAY_AUDIO, AudioManager.STREAM_RING,
+ mAppOps.setRestriction(AppOpsManager.OP_PLAY_AUDIO, USAGE_NOTIFICATION_TELEPHONY_RINGTONE,
muteCalls ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED,
exceptionPackages);
// restrict vibrations with no hints
- mAppOps.setRestriction(AppOpsManager.OP_VIBRATE, AudioManager.USE_DEFAULT_STREAM_TYPE,
+ mAppOps.setRestriction(AppOpsManager.OP_VIBRATE, USAGE_UNKNOWN,
zen ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED,
exceptionPackages);
// alarm restrictions
final boolean muteAlarms = mZenMode == Global.ZEN_MODE_NO_INTERRUPTIONS;
- mAppOps.setRestriction(AppOpsManager.OP_VIBRATE, AudioManager.STREAM_ALARM,
+ mAppOps.setRestriction(AppOpsManager.OP_VIBRATE, USAGE_ALARM,
muteAlarms ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED,
exceptionPackages);
- mAppOps.setRestriction(AppOpsManager.OP_PLAY_AUDIO, AudioManager.STREAM_ALARM,
+ mAppOps.setRestriction(AppOpsManager.OP_PLAY_AUDIO, USAGE_ALARM,
muteAlarms ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED,
exceptionPackages);
diff --git a/services/core/java/com/android/server/power/ShutdownThread.java b/services/core/java/com/android/server/power/ShutdownThread.java
index 956e3e6..5f3da07 100644
--- a/services/core/java/com/android/server/power/ShutdownThread.java
+++ b/services/core/java/com/android/server/power/ShutdownThread.java
@@ -24,7 +24,7 @@
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.IBluetoothManager;
-import android.media.AudioManager;
+import android.media.AudioAttributes;
import android.nfc.NfcAdapter;
import android.nfc.INfcAdapter;
import android.content.BroadcastReceiver;
@@ -78,7 +78,12 @@
// static instance of this thread
private static final ShutdownThread sInstance = new ShutdownThread();
-
+
+ private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder()
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
+ .build();
+
private final Object mActionDoneSync = new Object();
private boolean mActionDone;
private Context mContext;
@@ -508,7 +513,7 @@
// vibrate before shutting down
Vibrator vibrator = new SystemVibrator();
try {
- vibrator.vibrate(SHUTDOWN_VIBRATE_MS, AudioManager.STREAM_SYSTEM);
+ vibrator.vibrate(SHUTDOWN_VIBRATE_MS, VIBRATION_ATTRIBUTES);
} catch (Exception e) {
// Failure to vibrate shouldn't interrupt shutdown. Just log it.
Log.w(TAG, "Failed to vibrate during shutdown.", e);