diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 39585a1f7e4b0..bd5a516b4e4cb 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -2879,17 +2879,11 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final List users = mUserManager.getUsers(); for (int ui = users.size() - 1; ui >= 0; ui--) { UserInfo user = users.get(ui); - for (int i = mPowerSaveTempWhitelistAppIds.size() - 1; i >= 0; i--) { - if (mPowerSaveTempWhitelistAppIds.valueAt(i)) { - int appId = mPowerSaveTempWhitelistAppIds.keyAt(i); - int uid = UserHandle.getUid(user.id, appId); - uidRules.put(uid, FIREWALL_RULE_ALLOW); - } - } - for (int i = mPowerSaveWhitelistAppIds.size() - 1; i >= 0; i--) { - int appId = mPowerSaveWhitelistAppIds.keyAt(i); - int uid = UserHandle.getUid(user.id, appId); - uidRules.put(uid, FIREWALL_RULE_ALLOW); + updateRulesForWhitelistedAppIds(uidRules, mPowerSaveTempWhitelistAppIds, user.id); + updateRulesForWhitelistedAppIds(uidRules, mPowerSaveWhitelistAppIds, user.id); + if (chain == FIREWALL_CHAIN_POWERSAVE) { + updateRulesForWhitelistedAppIds(uidRules, + mPowerSaveWhitelistExceptIdleAppIds, user.id); } } for (int i = mUidState.size() - 1; i >= 0; i--) { @@ -2903,16 +2897,39 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } } - private boolean isWhitelistedBatterySaverUL(int uid) { + private void updateRulesForWhitelistedAppIds(final SparseIntArray uidRules, + final SparseBooleanArray whitelistedAppIds, int userId) { + for (int i = whitelistedAppIds.size() - 1; i >= 0; --i) { + if (whitelistedAppIds.valueAt(i)) { + final int appId = whitelistedAppIds.keyAt(i); + final int uid = UserHandle.getUid(userId, appId); + uidRules.put(uid, FIREWALL_RULE_ALLOW); + } + } + } + + /** + * @param deviceIdleMode if true then we don't consider + * {@link #mPowerSaveWhitelistExceptIdleAppIds} for checking if the {@param uid} is + * whitelisted. + */ + private boolean isWhitelistedBatterySaverUL(int uid, boolean deviceIdleMode) { final int appId = UserHandle.getAppId(uid); - return mPowerSaveTempWhitelistAppIds.get(appId) || mPowerSaveWhitelistAppIds.get(appId); + boolean isWhitelisted = mPowerSaveTempWhitelistAppIds.get(appId) + || mPowerSaveWhitelistAppIds.get(appId); + if (!deviceIdleMode) { + isWhitelisted = isWhitelisted || mPowerSaveWhitelistExceptIdleAppIds.get(appId); + } + return isWhitelisted; } // NOTE: since both fw_dozable and fw_powersave uses the same map // (mPowerSaveTempWhitelistAppIds) for whitelisting, we can reuse their logic in this method. private void updateRulesForWhitelistedPowerSaveUL(int uid, boolean enabled, int chain) { if (enabled) { - if (isWhitelistedBatterySaverUL(uid) || isUidForegroundOnRestrictPowerUL(uid)) { + final boolean isWhitelisted = isWhitelistedBatterySaverUL(uid, + chain == FIREWALL_CHAIN_DOZABLE); + if (isWhitelisted || isUidForegroundOnRestrictPowerUL(uid)) { setUidFirewallRule(chain, uid, FIREWALL_RULE_ALLOW); } else { setUidFirewallRule(chain, uid, FIREWALL_RULE_DEFAULT); @@ -3430,7 +3447,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final boolean restrictMode = isIdle || mRestrictPower || mDeviceIdleMode; final boolean isForeground = isUidForegroundOnRestrictPowerUL(uid); - final boolean isWhitelisted = isWhitelistedBatterySaverUL(uid); + final boolean isWhitelisted = isWhitelistedBatterySaverUL(uid, mDeviceIdleMode); final int oldRule = oldUidRules & MASK_ALL_NETWORKS; int newRule = RULE_NONE;