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);