From ffa1d57daea016348617beebafc6a045d2ff2f81 Mon Sep 17 00:00:00 2001 From: Sudheer Shanka Date: Tue, 5 Apr 2022 18:17:35 +0000 Subject: [PATCH] Inform Application thread to block for network rules to be updated. Bug: 226299593 Test: atest tests/cts/hostside/src/com/android/cts/net/HostsideRestrictBackgroundNetworkTests.java Change-Id: Ie37173d0d3f4034a74b834550920530166cd4201 --- .../android/app/ActivityManagerInternal.java | 2 +- .../server/am/ActivityManagerService.java | 24 +++++++++++++++---- .../server/wm/WindowProcessController.java | 4 ++-- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index 7255a13b4c83e..49a5c9f78230b 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -631,7 +631,7 @@ public abstract class ActivityManagerInternal { * @param uid uid * @param pid pid of the ProcessRecord that is pending top. */ - public abstract void addPendingTopUid(int uid, int pid); + public abstract void addPendingTopUid(int uid, int pid, @Nullable IApplicationThread thread); /** * Delete uid from the ActivityManagerService PendingStartActivityUids list. diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 2fd198ba9e7a4..efde2a52f4dc5 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -17268,7 +17268,7 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override - public void addPendingTopUid(int uid, int pid) { + public void addPendingTopUid(int uid, int pid, @Nullable IApplicationThread thread) { final boolean isNewPending = mPendingStartActivityUids.add(uid, pid); // If the next top activity is in cached and frozen mode, WM should raise its priority // to unfreeze it. This is done by calling AMS.updateOomAdj that will lower its oom adj. @@ -17285,16 +17285,32 @@ public class ActivityManagerService extends IActivityManager.Stub // (e.g. battery/data saver) but since waiting for updateOomAdj to complete and then // informing NetworkPolicyManager might get delayed, informing the state change as soon // as we know app is going to come to the top state. - if (mNetworkPolicyUidObserver != null) { + if (isNewPending && mNetworkPolicyUidObserver != null) { try { + final long procStateSeq = mProcessList.getNextProcStateSeq(); mNetworkPolicyUidObserver.onUidStateChanged(uid, PROCESS_STATE_TOP, - mProcessList.getNextProcStateSeq(), PROCESS_CAPABILITY_ALL); + procStateSeq, PROCESS_CAPABILITY_ALL); + if (thread != null && isNetworkingBlockedForUid(uid)) { + thread.setNetworkBlockSeq(procStateSeq); + } } catch (RemoteException e) { - // Should not happen; call is within the same process + Slog.d(TAG, "Error calling setNetworkBlockSeq", e); } } } + private boolean isNetworkingBlockedForUid(int uid) { + synchronized (mUidNetworkBlockedReasons) { + // TODO: We can consider only those blocked reasons that will be overridden + // by the TOP state. For other ones, there is no point in waiting. + // TODO: We can reuse this data in + // ProcessList#incrementProcStateSeqAndNotifyAppsLOSP instead of calling into + // NetworkManagementService. + return mUidNetworkBlockedReasons.get(uid, BLOCKED_REASON_NONE) + != BLOCKED_REASON_NONE; + } + } + @Override public void deletePendingTopUid(int uid, long nowElapsed) { mPendingStartActivityUids.delete(uid, nowElapsed); diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index ac9fbdedf43ea..40417a4857d3d 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -1128,7 +1128,7 @@ public class WindowProcessController extends ConfigurationContainer