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

Commit ef89c909 authored by Felipe Leme's avatar Felipe Leme
Browse files

Data Saver Mode should automatically allow foreground services.

BUG: 27324964

Change-Id: I8f09b9c9673f3ed697daca14902123a81ce41085
parent a6f98afb
Loading
Loading
Loading
Loading
+21 −5
Original line number Diff line number Diff line
@@ -2301,7 +2301,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
                final int state = mUidState.get(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
                fout.print(" state=");
                fout.print(state);
                fout.print(state <= ActivityManager.PROCESS_STATE_TOP ? " (fg)" : " (bg)");
                if (state <= ActivityManager.PROCESS_STATE_TOP) {
                    fout.print(" (fg)");
                } else {
                    fout.print(state <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE
                            ? " (fg svc)" : " (bg)");
                }

                final int rule = mUidRules.get(uid, RULE_UNKNOWN);
                fout.print(" rule=");
@@ -2338,6 +2343,11 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
                mUidState.get(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY));
    }

    private boolean isUidForegroundOnRestrictBackgroundLocked(int uid) {
        final int procState = mUidState.get(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
        return isProcStateAllowedWhileOnRestrictBackgroundLocked(procState);
    }

    private boolean isUidStateForegroundLocked(int state) {
        // only really in foreground when screen is also on
        return mScreenOn && state <= ActivityManager.PROCESS_STATE_TOP;
@@ -2396,8 +2406,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {

    private void updateRestrictBackgroundRulesOnUidStatusChangedLocked(int uid, int oldUidState,
            int newUidState) {
        final boolean oldForeground = oldUidState <= ActivityManager.PROCESS_STATE_TOP;
        final boolean newForeground = newUidState <= ActivityManager.PROCESS_STATE_TOP;
        final boolean oldForeground =
                isProcStateAllowedWhileOnRestrictBackgroundLocked(oldUidState);
        final boolean newForeground =
                isProcStateAllowedWhileOnRestrictBackgroundLocked(newUidState);
        if (oldForeground != newForeground) {
            updateRuleForRestrictBackgroundLocked(uid);
        }
@@ -2421,7 +2433,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
        // only update rules for anyone with foreground activities
        final int size = mUidState.size();
        for (int i = 0; i < size; i++) {
            if (mUidState.valueAt(i) <= ActivityManager.PROCESS_STATE_TOP) {
            if (mUidState.valueAt(i) <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
                final int uid = mUidState.keyAt(i);
                updateRestrictionRulesForUidLocked(uid);
            }
@@ -2432,6 +2444,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
        return procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
    }

    static boolean isProcStateAllowedWhileOnRestrictBackgroundLocked(int procState) {
        return procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
    }

    void updateRulesForRestrictPowerLocked() {
        updateRulesForWhitelistedPowerSaveLocked(mRestrictPower, FIREWALL_CHAIN_POWERSAVE,
                mUidFirewallPowerSaveRules);
@@ -2715,7 +2731,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
        }

        final int uidPolicy = mUidPolicy.get(uid, POLICY_NONE);
        final boolean isForeground = isUidForegroundLocked(uid);
        final boolean isForeground = isUidForegroundOnRestrictBackgroundLocked(uid);
        final boolean isBlacklisted = (uidPolicy & POLICY_REJECT_METERED_BACKGROUND) != 0;
        final boolean isWhitelisted = mRestrictBackgroundWhitelistUids.get(uid);