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