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

Commit 0b4592ce authored by Fabian Kozynski's avatar Fabian Kozynski
Browse files

Use raw op codes for the watch noted APIs.

Test: atest com.android.server.AppOpsServiceTests
Test: atest com.android.systemui.appops.AppOpsControllerTest

bug:121246606

Change-Id: Id99923c566fbf132914b15c676cb766d8793e875
parent b34e8528
Loading
Loading
Loading
Loading
+5 −9
Original line number Diff line number Diff line
@@ -2496,7 +2496,7 @@ public class AppOpsManager {
         * @param packageName The package performing the operation.
         * @param result The result of the note.
         */
        void onOpNoted(String code, int uid, String packageName, int result);
        void onOpNoted(int code, int uid, String packageName, int result);
    }

    /**
@@ -2953,7 +2953,7 @@ public class AppOpsManager {
     * @hide
     */
    @RequiresPermission(value=Manifest.permission.WATCH_APPOPS, conditional=true)
    public void startWatchingNoted(@NonNull String[] ops, @NonNull OnOpNotedListener callback) {
    public void startWatchingNoted(@NonNull int[] ops, @NonNull OnOpNotedListener callback) {
        IAppOpsNotedCallback cb;
        synchronized (mNotedWatchers) {
            cb = mNotedWatchers.get(callback);
@@ -2963,17 +2963,13 @@ public class AppOpsManager {
            cb = new IAppOpsNotedCallback.Stub() {
                @Override
                public void opNoted(int op, int uid, String packageName, int mode) {
                    callback.onOpNoted(sOpToString[op], uid, packageName, mode);
                    callback.onOpNoted(op, uid, packageName, mode);
                }
            };
            mNotedWatchers.put(callback, cb);
        }
        try {
            final int[] opCodes = new int[ops.length];
            for (int i = 0; i < opCodes.length; i++) {
                opCodes[i] = strOpToOp(ops[i]);
            }
            mService.startWatchingNoted(opCodes, cb);
            mService.startWatchingNoted(ops, cb);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -2983,7 +2979,7 @@ public class AppOpsManager {
     * Stop watching for noted app ops. An app op may be immediate or long running.
     * Unregistering a non-registered callback has no effect.
     *
     * @see #startWatchingNoted(String[], OnOpNotedListener)
     * @see #startWatchingNoted(int[], OnOpNotedListener)
     * @see #noteOp(String, int, String)
     *
     * @hide
+11 −20
Original line number Diff line number Diff line
@@ -57,21 +57,13 @@ public class AppOpsControllerImpl implements AppOpsController,
    @GuardedBy("mNotedItems")
    private final List<AppOpItem> mNotedItems = new ArrayList<>();

    protected static final int[] OPS;
    protected static final String[] OPS_STRING = new String[] {
            AppOpsManager.OPSTR_CAMERA,
            AppOpsManager.OPSTR_SYSTEM_ALERT_WINDOW,
            AppOpsManager.OPSTR_RECORD_AUDIO,
            AppOpsManager.OPSTR_COARSE_LOCATION,
            AppOpsManager.OPSTR_FINE_LOCATION};

    static {
        int numOps = OPS_STRING.length;
        OPS = new int[numOps];
        for (int i = 0; i < numOps; i++) {
            OPS[i] = AppOpsManager.strOpToOp(OPS_STRING[i]);
        }
    }
    protected static final int[] OPS = new int[] {
            AppOpsManager.OP_CAMERA,
            AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
            AppOpsManager.OP_RECORD_AUDIO,
            AppOpsManager.OP_COARSE_LOCATION,
            AppOpsManager.OP_FINE_LOCATION
    };

    public AppOpsControllerImpl(Context context, Looper bgLooper) {
        mContext = context;
@@ -92,7 +84,7 @@ public class AppOpsControllerImpl implements AppOpsController,
    protected void setListening(boolean listening) {
        if (listening) {
            mAppOps.startWatchingActive(OPS, this);
            mAppOps.startWatchingNoted(OPS_STRING, this);
            mAppOps.startWatchingNoted(OPS, this);
        } else {
            mAppOps.stopWatchingActive(this);
            mAppOps.stopWatchingNoted(this);
@@ -254,14 +246,13 @@ public class AppOpsControllerImpl implements AppOpsController,
    }

    @Override
    public void onOpNoted(String code, int uid, String packageName, int result) {
    public void onOpNoted(int code, int uid, String packageName, int result) {
        if (DEBUG) {
            Log.w(TAG, "Op: " + code + " with result " + AppOpsManager.MODE_NAMES[result]);
        }
        if (result != AppOpsManager.MODE_ALLOWED) return;
        int op_code = AppOpsManager.strOpToOp(code);
        addNoted(op_code, uid, packageName);
        notifySuscribers(op_code, uid, packageName, true);
        addNoted(code, uid, packageName);
        notifySuscribers(code, uid, packageName, true);
    }

    private void notifySuscribers(int code, int uid, String packageName, boolean active) {
+4 −4
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ public class AppOpsControllerTest extends SysuiTestCase {
                mCallback);
        mController.onOpActiveChanged(
                AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
        mController.onOpNoted(AppOpsManager.OPSTR_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
        mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
                AppOpsManager.MODE_ALLOWED);
        verify(mCallback).onActiveStateChanged(AppOpsManager.OP_RECORD_AUDIO,
                TEST_UID, TEST_PACKAGE_NAME, true);
@@ -136,7 +136,7 @@ public class AppOpsControllerTest extends SysuiTestCase {
                TEST_UID, TEST_PACKAGE_NAME, true);
        mController.onOpActiveChanged(AppOpsManager.OP_CAMERA,
                TEST_UID, TEST_PACKAGE_NAME, true);
        mController.onOpNoted(AppOpsManager.OPSTR_FINE_LOCATION,
        mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION,
                TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
        assertEquals(3, mController.getActiveAppOps().size());
    }
@@ -147,7 +147,7 @@ public class AppOpsControllerTest extends SysuiTestCase {
                TEST_UID, TEST_PACKAGE_NAME, true);
        mController.onOpActiveChanged(AppOpsManager.OP_CAMERA,
                TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
        mController.onOpNoted(AppOpsManager.OPSTR_FINE_LOCATION,
        mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION,
                TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
        assertEquals(2,
                mController.getActiveAppOpsForUser(UserHandle.getUserId(TEST_UID)).size());
@@ -158,7 +158,7 @@ public class AppOpsControllerTest extends SysuiTestCase {
    @Test
    public void opNotedScheduledForRemoval() {
        mController.setBGHandler(mMockHandler);
        mController.onOpNoted(AppOpsManager.OPSTR_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
        mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
                AppOpsManager.MODE_ALLOWED);
        verify(mMockHandler).scheduleRemoval(any(AppOpItem.class), anyLong());
    }
+8 −8
Original line number Diff line number Diff line
@@ -52,8 +52,8 @@ public class AppOpsNotedWatcherTest {
        // Try to start watching noted ops
        final AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class);
        try {
            appOpsManager.startWatchingNoted(new String[]{AppOpsManager.OPSTR_FINE_LOCATION,
                    AppOpsManager.OPSTR_RECORD_AUDIO}, listener);
            appOpsManager.startWatchingNoted(new int[]{AppOpsManager.OP_FINE_LOCATION,
                    AppOpsManager.OP_RECORD_AUDIO}, listener);
            fail("Watching noted ops shoudl require " + Manifest.permission.WATCH_APPOPS);
        } catch (SecurityException expected) {
            /*ignored*/
@@ -67,23 +67,23 @@ public class AppOpsNotedWatcherTest {

        // Start watching noted ops
        final AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class);
        appOpsManager.startWatchingNoted(new String[]{AppOpsManager.OPSTR_FINE_LOCATION,
                AppOpsManager.OPSTR_CAMERA}, listener);
        appOpsManager.startWatchingNoted(new int[]{AppOpsManager.OP_FINE_LOCATION,
                AppOpsManager.OP_CAMERA}, listener);

        // Note some ops
        appOpsManager.noteOp(AppOpsManager.OPSTR_FINE_LOCATION, Process.myUid(),
        appOpsManager.noteOp(AppOpsManager.OP_FINE_LOCATION, Process.myUid(),
                getContext().getPackageName());
        appOpsManager.noteOp(AppOpsManager.OPSTR_CAMERA, Process.myUid(),
        appOpsManager.noteOp(AppOpsManager.OP_CAMERA, Process.myUid(),
                getContext().getPackageName());

        // Verify that we got called for the ops being noted
        final InOrder inOrder = inOrder(listener);
        inOrder.verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS)
                .times(1)).onOpNoted(eq(AppOpsManager.OPSTR_FINE_LOCATION),
                .times(1)).onOpNoted(eq(AppOpsManager.OP_FINE_LOCATION),
                eq(Process.myUid()), eq(getContext().getPackageName()),
                eq(AppOpsManager.MODE_ALLOWED));
        inOrder.verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS)
                .times(1)).onOpNoted(eq(AppOpsManager.OPSTR_CAMERA),
                .times(1)).onOpNoted(eq(AppOpsManager.OP_CAMERA),
                eq(Process.myUid()), eq(getContext().getPackageName()),
                eq(AppOpsManager.MODE_ALLOWED));