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

Commit 356e0e16 authored by Suprabh Shukla's avatar Suprabh Shukla Committed by Gerrit Code Review
Browse files

Merge "Always process state changes below TOP_THRESHOLD" into main

parents 44f56eb3 2db4d2ef
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -19423,7 +19423,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                record.procStateSeqWaitingForNetwork = 0;
                final long totalTime = SystemClock.uptimeMillis() - startTime;
                if (totalTime >= mConstants.mNetworkAccessTimeoutMs || DEBUG_NETWORK) {
                    Slog.w(TAG_NETWORK, "Total time waited for network rules to get updated: "
                    Slog.wtf(TAG_NETWORK, "Total time waited for network rules to get updated: "
                            + totalTime + ". Uid: " + callingUid + " procStateSeq: "
                            + procStateSeq + " UidRec: " + record
                            + " validateUidRec: "
+13 −9
Original line number Diff line number Diff line
@@ -1214,16 +1214,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
                return false;
            }
            final int previousProcState = previousInfo.procState;
            if (mBackgroundNetworkRestricted && (previousProcState >= BACKGROUND_THRESHOLD_STATE)
                    != (newProcState >= BACKGROUND_THRESHOLD_STATE)) {
                // Proc-state change crossed BACKGROUND_THRESHOLD_STATE: Network rules for the
                // BACKGROUND chain may change.
                return true;
            }
            if ((previousProcState <= TOP_THRESHOLD_STATE)
                    != (newProcState <= TOP_THRESHOLD_STATE)) {
                // Proc-state change crossed TOP_THRESHOLD_STATE: Network rules for the
                // LOW_POWER_STANDBY chain may change.
                    || (newProcState <= TOP_THRESHOLD_STATE)) {
                // If the proc-state change crossed TOP_THRESHOLD_STATE, network rules for the
                // LOW_POWER_STANDBY chain may change, so we need to evaluate the transition.
                // In addition, we always process changes when the new process state is
                // TOP_THRESHOLD_STATE or below, to avoid situations where the TOP app ends up
                // waiting for NPMS to finish processing newProcStateSeq, even when it was
                // redundant (b/327303931).
                return true;
            }
            if ((previousProcState <= FOREGROUND_THRESHOLD_STATE)
@@ -1232,6 +1230,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
                // different chains may change.
                return true;
            }
            if (mBackgroundNetworkRestricted && (previousProcState >= BACKGROUND_THRESHOLD_STATE)
                    != (newProcState >= BACKGROUND_THRESHOLD_STATE)) {
                // Proc-state change crossed BACKGROUND_THRESHOLD_STATE: Network rules for the
                // BACKGROUND chain may change.
                return true;
            }
            final int networkCapabilities = PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK
                    | PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK;
            if ((previousInfo.capability & networkCapabilities)
+17 −6
Original line number Diff line number Diff line
@@ -2315,10 +2315,11 @@ public class NetworkPolicyManagerServiceTest {
        }
        waitForUidEventHandlerIdle();
        try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) {
            // Doesn't cross any other threshold.
            // Doesn't cross any threshold, but changes below TOP_THRESHOLD_STATE should always
            // be processed
            callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE - 1, testProcStateSeq++,
                    PROCESS_CAPABILITY_NONE);
            assertFalse(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED));
            assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED));
        }
        waitForUidEventHandlerIdle();
    }
@@ -2349,21 +2350,21 @@ public class NetworkPolicyManagerServiceTest {
        int testProcStateSeq = 0;
        try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) {
            // First callback for uid.
            callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++,
            callOnUidStatechanged(UID_A, FOREGROUND_THRESHOLD_STATE, testProcStateSeq++,
                    PROCESS_CAPABILITY_NONE);
            assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED));
        }
        waitForUidEventHandlerIdle();
        try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) {
            // The same process-state with one network capability added.
            callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++,
            callOnUidStatechanged(UID_A, FOREGROUND_THRESHOLD_STATE, testProcStateSeq++,
                    PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK);
            assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED));
        }
        waitForUidEventHandlerIdle();
        try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) {
            // The same process-state with another network capability added.
            callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++,
            callOnUidStatechanged(UID_A, FOREGROUND_THRESHOLD_STATE, testProcStateSeq++,
                    PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK
                            | PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK);
            assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED));
@@ -2371,11 +2372,21 @@ public class NetworkPolicyManagerServiceTest {
        waitForUidEventHandlerIdle();
        try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) {
            // The same process-state with all capabilities, but no change in network capabilities.
            callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++,
            callOnUidStatechanged(UID_A, FOREGROUND_THRESHOLD_STATE, testProcStateSeq++,
                    PROCESS_CAPABILITY_ALL);
            assertFalse(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED));
        }
        waitForUidEventHandlerIdle();

        callAndWaitOnUidStateChanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++,
                PROCESS_CAPABILITY_ALL);
        try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) {
            // No change in capabilities, but TOP_THRESHOLD_STATE change should always be processed.
            callOnUidStatechanged(UID_A, TOP_THRESHOLD_STATE, testProcStateSeq++,
                    PROCESS_CAPABILITY_ALL);
            assertTrue(mService.mUidEventHandler.hasMessages(UID_MSG_STATE_CHANGED));
        }
        waitForUidEventHandlerIdle();
    }

    @Test