diff --git a/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java b/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java index e9e1218d46f..3ac99878900 100644 --- a/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java +++ b/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java @@ -23,12 +23,14 @@ import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME; 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 @@ public final class DynamicDenylistManager { 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 getDenylistAllUids(SharedPreferences sharedPreferences) { final ArraySet uids = new ArraySet<>(); for (String key : sharedPreferences.getAll().keySet()) { @@ -186,4 +197,14 @@ public final class DynamicDenylistManager { SharedPreferences getDynamicDenylistPref() { return mContext.getSharedPreferences(PREF_KEY_DYNAMIC_DENY, Context.MODE_PRIVATE); } + + private static String getPackageNames(Context context, Set 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 320261054f2..06790bf07ff 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 static org.mockito.Mockito.when; 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.mockito.MockitoAnnotations; 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 @@ public class DynamicDenylistManagerTest { @Mock private NetworkPolicyManager mNetworkPolicyManager; + @Mock + private PackageManager mPackageManager; @Before public void setUp() { @@ -357,12 +362,45 @@ public class DynamicDenylistManagerTest { 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);