Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1af30c7a authored by John Spurlock's avatar John Spurlock
Browse files

Add stream-level suppression to vibrate/audio services.

- Add new audio restriction layer to app-ops.  Restrictions add
additional constraints to audio operations at a stream-level.
Restrictions do not affect the persistable state, and are purely
additive: that is, they can only impose additional contstraints, not
enable something that has already been disabled.  Restrictions
also support a whitelisted set of exempt package names.

- Add new audio stream-level checks to app-ops.

- Implement a provisional OP_PLAY_AUDIO suppression to three
java entry points MediaPlayer, AudioTrack, & SoundPool.

- Enhance vibrator api to take stream information as an optional
hint - the constants correspond to AudioManager stream types.
OP_VIBRATE now supports the stream-level restriction check.

- Simplify Vibrator subclasses by adding default implementations
for two .vibrate calls.

- Migrate NoMan's zen-mode control to use the new app-ops
stream-level restriction mechanism.

Change-Id: Ifae8952647202f728cf1c73e881452660c704678
parent 31dc8f70
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -19546,8 +19546,10 @@ package android.os {
  public abstract class Vibrator {
    method public abstract void cancel();
    method public abstract boolean hasVibrator();
    method public abstract void vibrate(long);
    method public abstract void vibrate(long[], int);
    method public void vibrate(long);
    method public void vibrate(long, int);
    method public void vibrate(long[], int);
    method public void vibrate(long[], int, int);
  }
  public class WorkSource implements android.os.Parcelable {
+48 −0
Original line number Diff line number Diff line
@@ -780,6 +780,25 @@ public class AppOpsManager {
        }
    }

    /**
     * Set a non-persisted restriction on an audio operation at a stream-level.
     * Restrictions are temporary additional constraints imposed on top of the persisted rules
     * defined by {@link #setMode}.
     *
     * @param code The operation to restrict.
     * @param stream The {@link android.media.AudioManager} stream type.
     * @param mode The restriction mode (MODE_IGNORED,MODE_ERRORED) or MODE_ALLOWED to unrestrict.
     * @param exceptionPackages Optional list of packages to exclude from the restriction.
     * @hide
     */
    public void setRestriction(int code, int stream, int mode, String[] exceptionPackages) {
        try {
            final int uid = Binder.getCallingUid();
            mService.setAudioRestriction(code, stream, uid, mode, exceptionPackages);
        } catch (RemoteException e) {
        }
    }

    /** @hide */
    public void resetAllModes() {
        try {
@@ -1008,6 +1027,35 @@ public class AppOpsManager {
        }
    }

    /**
     * Like {@link #checkOp} but at a stream-level for audio operations.
     * @hide
     */
    public int checkAudioOp(int op, int stream, int uid, String packageName) {
        try {
            final int mode = mService.checkAudioOperation(op, stream, uid, packageName);
            if (mode == MODE_ERRORED) {
                throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName));
            }
            return mode;
        } catch (RemoteException e) {
        }
        return MODE_IGNORED;
    }

    /**
     * Like {@link #checkAudioOp} but instead of throwing a {@link SecurityException} it
     * returns {@link #MODE_ERRORED}.
     * @hide
     */
    public int checkAudioOpNoThrow(int op, int stream, int uid, String packageName) {
        try {
            return mService.checkAudioOperation(op, stream, uid, packageName);
        } catch (RemoteException e) {
        }
        return MODE_IGNORED;
    }

    /**
     * Make note of an application performing an operation.  Note that you must pass
     * in both the uid and name of the application to be checked; this function will verify
+10 −18
Original line number Diff line number Diff line
@@ -853,13 +853,21 @@ public final class InputManager {
            return true;
        }

        /**
         * @hide
         */
        @Override
        public void vibrate(long milliseconds) {
        public void vibrate(int owningUid, String owningPackage, long milliseconds,
                int streamHint) {
            vibrate(new long[] { 0, milliseconds}, -1);
        }

        /**
         * @hide
         */
        @Override
        public void vibrate(long[] pattern, int repeat) {
        public void vibrate(int owningUid, String owningPackage, long[] pattern, int repeat,
                int streamHint) {
            if (repeat >= pattern.length) {
                throw new ArrayIndexOutOfBoundsException();
            }
@@ -870,22 +878,6 @@ public final class InputManager {
            }
        }

        /**
         * @hide
         */
        @Override
        public void vibrate(int owningUid, String owningPackage, long milliseconds) {
            vibrate(milliseconds);
        }

        /**
         * @hide
         */
        @Override
        public void vibrate(int owningUid, String owningPackage, long[] pattern, int repeat) {
            vibrate(pattern, repeat);
        }

        @Override
        public void cancel() {
            try {
+2 −2
Original line number Diff line number Diff line
@@ -20,8 +20,8 @@ package android.os;
interface IVibratorService
{
    boolean hasVibrator();
    void vibrate(int uid, String packageName, long milliseconds, IBinder token);
    void vibratePattern(int uid, String packageName, in long[] pattern, int repeat, IBinder token);
    void vibrate(int uid, String packageName, long milliseconds, int streamHint, IBinder token);
    void vibratePattern(int uid, String packageName, in long[] pattern, int repeat, int streamHint, IBinder token);
    void cancelVibrate(IBinder token);
}
+6 −14
Original line number Diff line number Diff line
@@ -36,22 +36,11 @@ public class NullVibrator extends Vibrator {
        return false;
    }

    @Override
    public void vibrate(long milliseconds) {
    }

    @Override
    public void vibrate(long[] pattern, int repeat) {
        if (repeat >= pattern.length) {
            throw new ArrayIndexOutOfBoundsException();
        }
    }

    /**
     * @hide
     */
    @Override
    public void vibrate(int owningUid, String owningPackage, long milliseconds) {
    public void vibrate(int owningUid, String owningPackage, long milliseconds, int streamHint) {
        vibrate(milliseconds);
    }

@@ -59,8 +48,11 @@ public class NullVibrator extends Vibrator {
     * @hide
     */
    @Override
    public void vibrate(int owningUid, String owningPackage, long[] pattern, int repeat) {
        vibrate(pattern, repeat);
    public void vibrate(int owningUid, String owningPackage, long[] pattern, int repeat,
            int streamHint) {
        if (repeat >= pattern.length) {
            throw new ArrayIndexOutOfBoundsException();
        }
    }

    @Override
Loading