From ddcc7f5c68d85a83fb4123cce6207608ce65c6a6 Mon Sep 17 00:00:00 2001 From: Evan Severson Date: Wed, 21 Sep 2022 12:50:49 -0700 Subject: [PATCH] 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 --- .../server/appop/AppOpsUidStateTrackerImpl.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/appop/AppOpsUidStateTrackerImpl.java b/services/core/java/com/android/server/appop/AppOpsUidStateTrackerImpl.java index ca5bfb36723cd..52b67b530c19f 100644 --- a/services/core/java/com/android/server/appop/AppOpsUidStateTrackerImpl.java +++ b/services/core/java/com/android/server/appop/AppOpsUidStateTrackerImpl.java @@ -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);