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

Commit ddcc7f5c authored by Evan Severson's avatar Evan Severson
Browse files

Commit pending state after mutiple uid updates

If the proc state switches from fg to bg, then the uid state commit is
delayed, but if switched back to fg before the uid state had updated
then we need to fix the issue where the bg state update is still
committed.

Also use MIN_PRIORITY_UID_STATE instead of UID_STATE_CACHED in case the
min state changes.

Fixes: 247111208
Bug: 248207394
Test: Locally run the broken tests
      Add new unit test in following commit
Change-Id: I8a8a6477071f6f916152dc107c0b9fcf4dc1c7bf
parent cf457f82
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -22,11 +22,11 @@ import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_MICROPHO
import static android.app.ActivityManager.PROCESS_CAPABILITY_NONE;
import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
import static android.app.ActivityManager.ProcessCapability;
import static android.app.AppOpsManager.MIN_PRIORITY_UID_STATE;
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.MODE_IGNORED;
import static android.app.AppOpsManager.OP_CAMERA;
import static android.app.AppOpsManager.OP_RECORD_AUDIO;
import static android.app.AppOpsManager.UID_STATE_CACHED;
import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE;
import static android.app.AppOpsManager.UID_STATE_MAX_LAST_NON_RESTRICTED;
import static android.app.AppOpsManager.UID_STATE_TOP;
@@ -89,7 +89,7 @@ class AppOpsUidStateTrackerImpl implements AppOpsUidStateTracker {

    private int getUidStateLocked(int uid) {
        updateUidPendingStateIfNeeded(uid);
        return mUidStates.get(uid, UID_STATE_CACHED);
        return mUidStates.get(uid, MIN_PRIORITY_UID_STATE);
    }

    @Override
@@ -191,8 +191,13 @@ class AppOpsUidStateTrackerImpl implements AppOpsUidStateTracker {

        int prevUidState = mUidStates.get(uid, AppOpsManager.MIN_PRIORITY_UID_STATE);
        int prevCapability = mCapability.get(uid, PROCESS_CAPABILITY_NONE);
        int pendingUidState = mPendingUidStates.get(uid, MIN_PRIORITY_UID_STATE);
        int pendingCapability = mPendingCapability.get(uid, PROCESS_CAPABILITY_NONE);
        long pendingStateCommitTime = mPendingCommitTime.get(uid, 0);
        if (uidState != prevUidState || capability != prevCapability) {
        if ((pendingStateCommitTime == 0
                && (uidState != prevUidState || capability != prevCapability))
                || (pendingStateCommitTime != 0
                && (uidState != pendingUidState || capability != pendingCapability))) {
            mPendingUidStates.put(uid, uidState);
            mPendingCapability.put(uid, capability);

@@ -236,7 +241,7 @@ class AppOpsUidStateTrackerImpl implements AppOpsUidStateTracker {

    @Override
    public void dumpUidState(PrintWriter pw, int uid, long nowElapsed) {
        int state = mUidStates.get(uid, UID_STATE_CACHED);
        int state = mUidStates.get(uid, MIN_PRIORITY_UID_STATE);
        // if no pendingState set to state to suppress output
        int pendingState = mPendingUidStates.get(uid, state);
        pw.print("    state=");
@@ -294,11 +299,11 @@ class AppOpsUidStateTrackerImpl implements AppOpsUidStateTracker {
    }

    private void commitUidPendingState(int uid) {
        int pendingUidState = mPendingUidStates.get(uid, UID_STATE_CACHED);
        int pendingUidState = mPendingUidStates.get(uid, MIN_PRIORITY_UID_STATE);
        int pendingCapability = mPendingCapability.get(uid, PROCESS_CAPABILITY_NONE);
        boolean pendingVisibleAppWidget = mPendingVisibleAppWidget.get(uid, false);

        int uidState = mUidStates.get(uid, UID_STATE_CACHED);
        int uidState = mUidStates.get(uid, MIN_PRIORITY_UID_STATE);
        int capability = mCapability.get(uid, PROCESS_CAPABILITY_NONE);
        boolean visibleAppWidget = mVisibleAppWidget.get(uid, false);