Dump the DynamicDenylistManager stored data into bugreport

Bug: 306329984
Test: make -j64 RunSettingsRoboTests ROBOTEST_FILTER="com.android.settings.fuelgauge.datasaver"
Change-Id: If512f561b3b376ea56e0dc78c339bf254ff20060
diff --git a/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java b/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java
index e9e1218..3ac9987 100644
--- a/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java
+++ b/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java
@@ -23,12 +23,14 @@
 
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
 import android.net.NetworkPolicyManager;
 import android.util.ArraySet;
 import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
 
+import java.io.PrintWriter;
 import java.util.Set;
 
 /** A class to dynamically manage per apps {@link NetworkPolicyManager} POLICY_ flags. */
@@ -147,6 +149,15 @@
         clearSharedPreferences();
     }
 
+    /** Dump the data stored in the {@link SharedPreferences}. */
+    public void dump(PrintWriter writer) {
+        writer.println("Dump of DynamicDenylistManager:");
+        writer.println("\tManualDenylist: " + getPackageNames(mContext,
+                getDenylistAllUids(getManualDenylistPref())));
+        writer.println("\tDynamicDenylist: " + getPackageNames(mContext,
+                getDenylistAllUids(getDynamicDenylistPref())));
+    }
+
     private Set<Integer> getDenylistAllUids(SharedPreferences sharedPreferences) {
         final ArraySet<Integer> uids = new ArraySet<>();
         for (String key : sharedPreferences.getAll().keySet()) {
@@ -186,4 +197,14 @@
     SharedPreferences getDynamicDenylistPref() {
         return mContext.getSharedPreferences(PREF_KEY_DYNAMIC_DENY, Context.MODE_PRIVATE);
     }
+
+    private static String getPackageNames(Context context, Set<Integer> uids) {
+        if (uids == null || uids.isEmpty()) {
+            return null;
+        }
+        final PackageManager pm = context.getPackageManager();
+        final StringBuilder builder = new StringBuilder();
+        uids.forEach(uid -> builder.append(pm.getNameForUid(uid) + " "));
+        return builder.toString();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java
index 3202610..06790bf 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java
@@ -36,6 +36,7 @@
 
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
 import android.net.NetworkPolicyManager;
 import android.util.ArraySet;
 
@@ -48,6 +49,8 @@
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
@@ -67,6 +70,8 @@
 
     @Mock
     private NetworkPolicyManager mNetworkPolicyManager;
+    @Mock
+    private PackageManager mPackageManager;
 
     @Before
     public void setUp() {
@@ -357,12 +362,45 @@
         assertThat(mDynamicDenyListPref.getAll()).isEmpty();
     }
 
+    @Test
+    public void dump_dumpExpectedResult() {
+        initDynamicDenylistManager(EMPTY_ARRAY);
+        setupPreference(mManualDenyListPref, FAKE_UID_1);
+        setupPreference(mDynamicDenyListPref, FAKE_UID_2);
+        final StringWriter stringWriter = new StringWriter();
+        final PrintWriter printWriter = new PrintWriter(stringWriter);
+        when(mPackageManager.getNameForUid(FAKE_UID_1_INT)).thenReturn("app1");
+        when(mPackageManager.getNameForUid(FAKE_UID_2_INT)).thenReturn("app2");
+
+        mDynamicDenylistManager.dump(printWriter);
+
+        final String dumpResults = stringWriter.toString();
+        assertThat(dumpResults.contains("ManualDenylist: app1")).isTrue();
+        assertThat(dumpResults.contains("DynamicDenylist: app2")).isTrue();
+    }
+
+    @Test
+    public void dump_withEmptySharedPreferences_dumpExpectedResult() {
+        initDynamicDenylistManager(EMPTY_ARRAY, EMPTY_ARRAY);
+        mDynamicDenylistManager.clearSharedPreferences();
+        final StringWriter stringWriter = new StringWriter();
+        final PrintWriter printWriter = new PrintWriter(stringWriter);
+
+        mDynamicDenylistManager.dump(printWriter);
+
+        final String dumpResults = stringWriter.toString();
+        assertThat(dumpResults.contains("ManualDenylist: null")).isTrue();
+        assertThat(dumpResults.contains("DynamicDenylist: null")).isTrue();
+    }
+
     private void initDynamicDenylistManager(int[] preload) {
         initDynamicDenylistManager(preload, preload);
     }
 
     private void initDynamicDenylistManager(int[] preload1, int[] preload2) {
         final Context context = spy(RuntimeEnvironment.application.getApplicationContext());
+        when(context.getApplicationContext()).thenReturn(context);
+        when(context.getPackageManager()).thenReturn(mPackageManager);
         when(mNetworkPolicyManager.getUidsWithPolicy(anyInt()))
                 .thenReturn(preload1).thenReturn(preload2);
         mDynamicDenylistManager = new DynamicDenylistManager(context, mNetworkPolicyManager);