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()}. */