Merge "Protect failed setUidPolicy() and avoid storing invalid UIDs" into main
diff --git a/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java b/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java
index 4a25238..15f2094 100644
--- a/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java
+++ b/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java
@@ -95,6 +95,9 @@
/** Suggest a list of package to set as POLICY_REJECT. */
public void setDenylist(Set<Integer> denylistTargetUids) {
+ if (denylistTargetUids == null) {
+ return;
+ }
final Set<Integer> manualDenylistUids = getDenylistAllUids(getManualDenylistPref());
denylistTargetUids.removeAll(manualDenylistUids);
@@ -105,27 +108,40 @@
return;
}
- // Store target denied uids into DynamicDenylistPref.
- final SharedPreferences.Editor editor = getDynamicDenylistPref().edit();
- editor.clear();
- denylistTargetUids.forEach(
- uid -> editor.putInt(String.valueOf(uid), POLICY_REJECT_METERED_BACKGROUND));
- editor.apply();
-
+ final ArraySet<Integer> failedUids = new ArraySet<>();
synchronized (mLock) {
// Set new added UIDs into REJECT policy.
for (int uid : denylistTargetUids) {
if (!lastDynamicDenylistUids.contains(uid)) {
- mNetworkPolicyManager.setUidPolicy(uid, POLICY_REJECT_METERED_BACKGROUND);
+ try {
+ mNetworkPolicyManager.setUidPolicy(uid, POLICY_REJECT_METERED_BACKGROUND);
+ } catch (Exception e) {
+ Log.e(TAG, "failed to setUidPolicy(REJECT) for " + uid, e);
+ failedUids.add(uid);
+ }
}
}
// Unset removed UIDs back to NONE policy.
for (int uid : lastDynamicDenylistUids) {
if (!denylistTargetUids.contains(uid)) {
- mNetworkPolicyManager.setUidPolicy(uid, POLICY_NONE);
+ try {
+ mNetworkPolicyManager.setUidPolicy(uid, POLICY_NONE);
+ } catch (Exception e) {
+ Log.e(TAG, "failed to setUidPolicy(NONE) for " + uid, e);
+ }
}
}
}
+
+ // Store target denied uids into DynamicDenylistPref.
+ final SharedPreferences.Editor editor = getDynamicDenylistPref().edit();
+ editor.clear();
+ denylistTargetUids.forEach(uid -> {
+ if (!failedUids.contains(uid)) {
+ editor.putInt(String.valueOf(uid), POLICY_REJECT_METERED_BACKGROUND);
+ }
+ });
+ editor.apply();
}
/** Return true if the target uid is in {@link #getManualDenylistPref()}. */