From a110eec77f226965cf14d2a2385dae6b22565ec4 Mon Sep 17 00:00:00 2001 From: Felipe Leme Date: Fri, 29 Apr 2016 09:58:06 -0700 Subject: [PATCH] Multi-user Data Saver fixes: - When adding a new user, adds its default whitelist apps. - When removing an user, clears its revoked default whitelist apps. BUG: 28451218 Change-Id: Ic30a3d6d30c7575620edd3ad32c3221203626f8d --- .../net/NetworkPolicyManagerService.java | 61 +++++++++++++------ 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 50d936853fed2..7ed75ca2cd6c2 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -442,42 +442,51 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { * * @return whether any uid has been added to {@link #mRestrictBackgroundWhitelistUids}. */ - boolean addDefaultRestrictBackgroundWhitelistUids() { - final SystemConfig sysConfig = SystemConfig.getInstance(); - final PackageManager pm = mContext.getPackageManager(); + boolean addDefaultRestrictBackgroundWhitelistUidsLocked() { final List users = mUserManager.getUsers(); final int numberUsers = users.size(); + boolean changed = false; + for (int i = 0; i < numberUsers; i++) { + final UserInfo user = users.get(i); + changed = addDefaultRestrictBackgroundWhitelistUidsLocked(user.id) || changed; + } + return changed; + } + + private boolean addDefaultRestrictBackgroundWhitelistUidsLocked(int userId) { + final SystemConfig sysConfig = SystemConfig.getInstance(); + final PackageManager pm = mContext.getPackageManager(); final ArraySet allowDataUsage = sysConfig.getAllowInDataUsageSave(); boolean changed = false; for (int i = 0; i < allowDataUsage.size(); i++) { final String pkg = allowDataUsage.valueAt(i); if (LOGD) - Slog.d(TAG, "checking restricted background whitelisting for package " + pkg); + Slog.d(TAG, "checking restricted background whitelisting for package " + pkg + + " and user " + userId); final ApplicationInfo app; try { - app = pm.getApplicationInfo(pkg, PackageManager.MATCH_SYSTEM_ONLY); + app = pm.getApplicationInfoAsUser(pkg, PackageManager.MATCH_SYSTEM_ONLY, userId); } catch (PackageManager.NameNotFoundException e) { // Should not happen Slog.wtf(TAG, "No ApplicationInfo for package " + pkg); continue; } if (!app.isPrivilegedApp()) { - Slog.w(TAG, "getAllowInDataUsageSave() returned non-privileged app: " + pkg); + Slog.wtf(TAG, "pm.getApplicationInfoAsUser() returned non-privileged app: " + pkg); continue; } - for (int j = 0; j < numberUsers; j++) { - final UserInfo user = users.get(j); - final int uid = UserHandle.getUid(user.id, app.uid); - mDefaultRestrictBackgroundWhitelistUids.append(uid, true); - if (LOGD) Slog.d(TAG, "revoked whistelist status for uid " + uid + ": " + final int uid = UserHandle.getUid(userId, app.uid); + mDefaultRestrictBackgroundWhitelistUids.append(uid, true); + if (LOGD) + Slog.d(TAG, "Adding uid " + uid + " (user " + userId + ") to default restricted " + + "background whitelist. Revoked status: " + mRestrictBackgroundWhitelistRevokedUids.get(uid)); - if (!mRestrictBackgroundWhitelistRevokedUids.get(uid)) { - Slog.i(TAG, "adding default package " + pkg + " (uid " + uid + " for user " - + user.id + ") to restrict background whitelist"); - mRestrictBackgroundWhitelistUids.append(uid, true); - changed = true; - } + if (!mRestrictBackgroundWhitelistRevokedUids.get(uid)) { + Slog.i(TAG, "adding default package " + pkg + " (uid " + uid + " for user " + + userId + ") to restrict background whitelist"); + mRestrictBackgroundWhitelistUids.append(uid, true); + changed = true; } } return changed; @@ -546,7 +555,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // read policy from disk readPolicyLocked(); - if (addDefaultRestrictBackgroundWhitelistUids()) { + if (addDefaultRestrictBackgroundWhitelistUidsLocked()) { writePolicyLocked(); } @@ -734,7 +743,11 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // Remove any persistable state for the given user; both cleaning up after a // USER_REMOVED, and one last sanity check during USER_ADDED removeUserStateLocked(userId); - // Update global restrict for new user + if (action == ACTION_USER_ADDED) { + // Add apps that are whitelisted by default. + addDefaultRestrictBackgroundWhitelistUidsLocked(userId); + } + // Update global restrict for that user updateRulesForGlobalChangeLocked(true); } break; @@ -1751,6 +1764,16 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } writePolicy = true; } + + // Remove entries from revoked default restricted background UID whitelist + for (int i = mRestrictBackgroundWhitelistRevokedUids.size() - 1; i >= 0; i--) { + final int uid = mRestrictBackgroundWhitelistRevokedUids.keyAt(i); + if (UserHandle.getUserId(uid) == userId) { + mRestrictBackgroundWhitelistRevokedUids.removeAt(i); + writePolicy = true; + } + } + // Remove associated UID policies int[] uids = new int[0]; for (int i = 0; i < mUidPolicy.size(); i++) {