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

Commit af2f33e7 authored by Austin Borger's avatar Austin Borger Committed by Android (Google) Code Review
Browse files

Merge "Delay appop revocation when only capability is lost" into udc-dev

parents 22c95b1e c1b8ec5b
Loading
Loading
Loading
Loading
+6 −6
Original line number Original line Diff line number Diff line
@@ -231,20 +231,20 @@ class AppOpsUidStateTrackerImpl implements AppOpsUidStateTracker {
            mPendingUidStates.put(uid, uidState);
            mPendingUidStates.put(uid, uidState);
            mPendingCapability.put(uid, capability);
            mPendingCapability.put(uid, capability);


            boolean hasLostCapability = (prevCapability & ~capability) != 0;

            if (procState == PROCESS_STATE_NONEXISTENT) {
            if (procState == PROCESS_STATE_NONEXISTENT) {
                mPendingGone.put(uid, true);
                mPendingGone.put(uid, true);
                commitUidPendingState(uid);
                commitUidPendingState(uid);
            } else if (uidState < prevUidState
            } else if (uidState < prevUidState) {
                    || (uidState <= UID_STATE_MAX_LAST_NON_RESTRICTED
                    && prevUidState > UID_STATE_MAX_LAST_NON_RESTRICTED)) {
                // We are moving to a more important state, or the new state may be in the
                // We are moving to a more important state, or the new state may be in the
                // foreground and the old state is in the background, then always do it
                // foreground and the old state is in the background, then always do it
                // immediately.
                // immediately.
                commitUidPendingState(uid);
                commitUidPendingState(uid);
            } else if (uidState == prevUidState && capability != prevCapability) {
            } else if (uidState == prevUidState && !hasLostCapability) {
                // No change on process state, but process capability has changed.
                // No change on process state, but process capability has increased.
                commitUidPendingState(uid);
                commitUidPendingState(uid);
            } else if (uidState <= UID_STATE_MAX_LAST_NON_RESTRICTED) {
            } else if (uidState <= UID_STATE_MAX_LAST_NON_RESTRICTED && !hasLostCapability) {
                // We are moving to a less important state, but it doesn't cross the restriction
                // We are moving to a less important state, but it doesn't cross the restriction
                // threshold.
                // threshold.
                commitUidPendingState(uid);
                commitUidPendingState(uid);
+62 −0
Original line number Original line Diff line number Diff line
@@ -325,6 +325,10 @@ public class AppOpsUidStateTrackerTest {
                .backgroundState()
                .backgroundState()
                .update();
                .update();


        assertEquals(MODE_IGNORED, mIntf.evalMode(UID, OP_RECORD_AUDIO, MODE_FOREGROUND));
        assertEquals(MODE_IGNORED,
                mIntf.evalMode(UID, OP_RECEIVE_EXPLICIT_USER_INTERACTION_AUDIO, MODE_FOREGROUND));

        procStateBuilder(UID)
        procStateBuilder(UID)
                .backgroundState()
                .backgroundState()
                .microphoneCapability()
                .microphoneCapability()
@@ -342,10 +346,21 @@ public class AppOpsUidStateTrackerTest {
                .microphoneCapability()
                .microphoneCapability()
                .update();
                .update();


        assertEquals(MODE_ALLOWED, mIntf.evalMode(UID, OP_RECORD_AUDIO, MODE_FOREGROUND));
        assertEquals(MODE_ALLOWED,
                mIntf.evalMode(UID, OP_RECEIVE_EXPLICIT_USER_INTERACTION_AUDIO, MODE_FOREGROUND));

        procStateBuilder(UID)
        procStateBuilder(UID)
                .backgroundState()
                .backgroundState()
                .update();
                .update();


        mClock.advanceTime(mConstants.BG_STATE_SETTLE_TIME - 1);
        assertEquals(MODE_ALLOWED, mIntf.evalMode(UID, OP_RECORD_AUDIO, MODE_FOREGROUND));
        assertEquals(MODE_ALLOWED,
                mIntf.evalMode(UID, OP_RECEIVE_EXPLICIT_USER_INTERACTION_AUDIO,
                        MODE_FOREGROUND));

        mClock.advanceTime(1);
        assertEquals(MODE_IGNORED, mIntf.evalMode(UID, OP_RECORD_AUDIO, MODE_FOREGROUND));
        assertEquals(MODE_IGNORED, mIntf.evalMode(UID, OP_RECORD_AUDIO, MODE_FOREGROUND));
        assertEquals(MODE_IGNORED,
        assertEquals(MODE_IGNORED,
                mIntf.evalMode(UID, OP_RECEIVE_EXPLICIT_USER_INTERACTION_AUDIO, MODE_FOREGROUND));
                mIntf.evalMode(UID, OP_RECEIVE_EXPLICIT_USER_INTERACTION_AUDIO, MODE_FOREGROUND));
@@ -357,6 +372,8 @@ public class AppOpsUidStateTrackerTest {
                .backgroundState()
                .backgroundState()
                .update();
                .update();


        assertEquals(MODE_IGNORED, mIntf.evalMode(UID, OP_CAMERA, MODE_FOREGROUND));

        procStateBuilder(UID)
        procStateBuilder(UID)
                .backgroundState()
                .backgroundState()
                .cameraCapability()
                .cameraCapability()
@@ -372,10 +389,16 @@ public class AppOpsUidStateTrackerTest {
                .cameraCapability()
                .cameraCapability()
                .update();
                .update();


        assertEquals(MODE_ALLOWED, mIntf.evalMode(UID, OP_CAMERA, MODE_FOREGROUND));

        procStateBuilder(UID)
        procStateBuilder(UID)
                .backgroundState()
                .backgroundState()
                .update();
                .update();


        mClock.advanceTime(mConstants.BG_STATE_SETTLE_TIME - 1);
        assertEquals(MODE_ALLOWED, mIntf.evalMode(UID, OP_CAMERA, MODE_FOREGROUND));

        mClock.advanceTime(1);
        assertEquals(MODE_IGNORED, mIntf.evalMode(UID, OP_CAMERA, MODE_FOREGROUND));
        assertEquals(MODE_IGNORED, mIntf.evalMode(UID, OP_CAMERA, MODE_FOREGROUND));
    }
    }


@@ -385,6 +408,9 @@ public class AppOpsUidStateTrackerTest {
                .backgroundState()
                .backgroundState()
                .update();
                .update();


        assertEquals(MODE_IGNORED, mIntf.evalMode(UID, OP_COARSE_LOCATION, MODE_FOREGROUND));
        assertEquals(MODE_IGNORED, mIntf.evalMode(UID, OP_FINE_LOCATION, MODE_FOREGROUND));

        procStateBuilder(UID)
        procStateBuilder(UID)
                .backgroundState()
                .backgroundState()
                .locationCapability()
                .locationCapability()
@@ -401,14 +427,50 @@ public class AppOpsUidStateTrackerTest {
                .locationCapability()
                .locationCapability()
                .update();
                .update();


        assertEquals(MODE_ALLOWED, mIntf.evalMode(UID, OP_COARSE_LOCATION, MODE_FOREGROUND));
        assertEquals(MODE_ALLOWED, mIntf.evalMode(UID, OP_FINE_LOCATION, MODE_FOREGROUND));

        procStateBuilder(UID)
        procStateBuilder(UID)
                .backgroundState()
                .backgroundState()
                .update();
                .update();


        mClock.advanceTime(mConstants.BG_STATE_SETTLE_TIME - 1);
        assertEquals(MODE_ALLOWED, mIntf.evalMode(UID, OP_COARSE_LOCATION, MODE_FOREGROUND));
        assertEquals(MODE_ALLOWED, mIntf.evalMode(UID, OP_FINE_LOCATION, MODE_FOREGROUND));

        mClock.advanceTime(1);
        assertEquals(MODE_IGNORED, mIntf.evalMode(UID, OP_COARSE_LOCATION, MODE_FOREGROUND));
        assertEquals(MODE_IGNORED, mIntf.evalMode(UID, OP_COARSE_LOCATION, MODE_FOREGROUND));
        assertEquals(MODE_IGNORED, mIntf.evalMode(UID, OP_FINE_LOCATION, MODE_FOREGROUND));
        assertEquals(MODE_IGNORED, mIntf.evalMode(UID, OP_FINE_LOCATION, MODE_FOREGROUND));
    }
    }


    @Test
    public void testProcStateChangesAndStaysUnrestrictedAndCapabilityRemoved() {
        procStateBuilder(UID)
                .topState()
                .microphoneCapability()
                .cameraCapability()
                .locationCapability()
                .update();

        assertEquals(MODE_ALLOWED, mIntf.evalMode(UID, OP_RECORD_AUDIO, MODE_FOREGROUND));
        assertEquals(MODE_ALLOWED, mIntf.evalMode(UID, OP_CAMERA, MODE_FOREGROUND));
        assertEquals(MODE_ALLOWED, mIntf.evalMode(UID, OP_COARSE_LOCATION, MODE_FOREGROUND));

        procStateBuilder(UID)
                .foregroundState()
                .update();

        mClock.advanceTime(mConstants.TOP_STATE_SETTLE_TIME - 1);
        assertEquals(MODE_ALLOWED, mIntf.evalMode(UID, OP_RECORD_AUDIO, MODE_FOREGROUND));
        assertEquals(MODE_ALLOWED, mIntf.evalMode(UID, OP_CAMERA, MODE_FOREGROUND));
        assertEquals(MODE_ALLOWED, mIntf.evalMode(UID, OP_COARSE_LOCATION, MODE_FOREGROUND));

        mClock.advanceTime(1);
        assertEquals(MODE_IGNORED, mIntf.evalMode(UID, OP_RECORD_AUDIO, MODE_FOREGROUND));
        assertEquals(MODE_IGNORED, mIntf.evalMode(UID, OP_CAMERA, MODE_FOREGROUND));
        assertEquals(MODE_IGNORED, mIntf.evalMode(UID, OP_COARSE_LOCATION, MODE_FOREGROUND));
    }

    @Test
    @Test
    public void testVisibleAppWidget() {
    public void testVisibleAppWidget() {
        procStateBuilder(UID)
        procStateBuilder(UID)