Loading services/core/java/com/android/server/appop/AppOpsUidStateTrackerImpl.java +6 −6 Original line number Original line Diff line number Diff line Loading @@ -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); Loading services/tests/mockingservicestests/src/com/android/server/appop/AppOpsUidStateTrackerTest.java +62 −0 Original line number Original line Diff line number Diff line Loading @@ -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() Loading @@ -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)); Loading @@ -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() Loading @@ -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)); } } Loading @@ -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() Loading @@ -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) Loading Loading
services/core/java/com/android/server/appop/AppOpsUidStateTrackerImpl.java +6 −6 Original line number Original line Diff line number Diff line Loading @@ -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); Loading
services/tests/mockingservicestests/src/com/android/server/appop/AppOpsUidStateTrackerTest.java +62 −0 Original line number Original line Diff line number Diff line Loading @@ -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() Loading @@ -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)); Loading @@ -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() Loading @@ -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)); } } Loading @@ -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() Loading @@ -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) Loading