Update the restrict app list

Before this cl, we use getPackagesForOps() to populate restrict app
list. However in that API not all the apps are currently restricted,
so in this cl we filter out all the allowed apps.

Bug: 73085780
Test: RunSettingsRoboTest
Change-Id: Ia7c1eb95b07a1a0d203b394eb64dcd98d25bd561
diff --git a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
index e41a94b..02a2cf6 100644
--- a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
@@ -67,17 +67,26 @@
 
         final List<AppOpsManager.PackageOps> packageOpsList = mAppOpsManager.getPackagesForOps(
                 new int[]{AppOpsManager.OP_RUN_ANY_IN_BACKGROUND});
-        final int num = CollectionUtils.size(packageOpsList);
         mAppInfos = new ArrayList<>();
 
-        for (int i = 0; i < num; i++) {
+        for (int i = 0, size = CollectionUtils.size(packageOpsList); i < size; i++) {
             final AppOpsManager.PackageOps packageOps = packageOpsList.get(i);
-            mAppInfos.add(new AppInfo.Builder()
-                    .setPackageName(packageOps.getPackageName())
-                    .setUid(packageOps.getUid())
-                    .build());
+            final List<AppOpsManager.OpEntry> entries = packageOps.getOps();
+            for (int j = 0; j < entries.size(); j++) {
+                AppOpsManager.OpEntry ent = entries.get(j);
+                if (ent.getOp() != AppOpsManager.OP_RUN_ANY_IN_BACKGROUND) {
+                    continue;
+                }
+                if (ent.getMode() != AppOpsManager.MODE_ALLOWED) {
+                    mAppInfos.add(new AppInfo.Builder()
+                            .setPackageName(packageOps.getPackageName())
+                            .setUid(packageOps.getUid())
+                            .build());
+                }
+            }
         }
 
+        final int num = mAppInfos.size();
         // Enable the preference if some apps already been restricted, otherwise disable it
         preference.setEnabled(num > 0);
         preference.setSummary(
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java
index c9c82c2..57eff56 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java
@@ -18,7 +18,9 @@
 
 import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT;
 import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID;
+
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
@@ -47,11 +49,17 @@
 
 @RunWith(RobolectricTestRunner.class)
 public class RestrictAppPreferenceControllerTest {
+    private static final int ALLOWED_UID = 111;
+    private static final String ALLOWED_PACKAGE_NAME = "com.android.allowed.package";
+    private static final int RESTRICTED_UID = 222;
+    private static final String RESTRICTED_PACKAGE_NAME = "com.android.restricted.package";
 
     @Mock
     private AppOpsManager mAppOpsManager;
     @Mock
-    private AppOpsManager.PackageOps mPackageOps;
+    private AppOpsManager.PackageOps mRestrictedPackageOps;
+    @Mock
+    private AppOpsManager.PackageOps mAllowedPackageOps;
     @Mock
     private SettingsActivity mSettingsActivity;
     @Mock
@@ -65,11 +73,26 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
+        final AppOpsManager.OpEntry allowOpEntry = new AppOpsManager.OpEntry(
+                AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, AppOpsManager.MODE_ALLOWED, 0, 0, 0, 0, "");
+        final List<AppOpsManager.OpEntry> allowOps = new ArrayList<>();
+        allowOps.add(allowOpEntry);
+        final AppOpsManager.OpEntry restrictedOpEntry = new AppOpsManager.OpEntry(
+                AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, AppOpsManager.MODE_IGNORED, 0, 0, 0, 0, "");
+        final List<AppOpsManager.OpEntry> restrictedOps = new ArrayList<>();
+        restrictedOps.add(restrictedOpEntry);
+        doReturn(ALLOWED_UID).when(mAllowedPackageOps).getUid();
+        doReturn(ALLOWED_PACKAGE_NAME).when(mAllowedPackageOps).getPackageName();
+        doReturn(allowOps).when(mAllowedPackageOps).getOps();
+        doReturn(RESTRICTED_UID).when(mRestrictedPackageOps).getUid();
+        doReturn(RESTRICTED_PACKAGE_NAME).when(mRestrictedPackageOps).getPackageName();
+        doReturn(restrictedOps).when(mRestrictedPackageOps).getOps();
+
         mContext = spy(RuntimeEnvironment.application);
         doReturn(mAppOpsManager).when(mContext).getSystemService(Context.APP_OPS_SERVICE);
         doReturn(mContext).when(mSettingsActivity).getApplicationContext();
         mRestrictAppPreferenceController =
-            new RestrictAppPreferenceController(mSettingsActivity, mFragment);
+                new RestrictAppPreferenceController(mSettingsActivity, mFragment);
         mPackageOpsList = new ArrayList<>();
         mPreference = new Preference(mContext);
         mPreference.setKey(mRestrictAppPreferenceController.getPreferenceKey());
@@ -77,7 +100,7 @@
 
     @Test
     public void testUpdateState_oneApp_showCorrectSummary() {
-        mPackageOpsList.add(mPackageOps);
+        mPackageOpsList.add(mRestrictedPackageOps);
         doReturn(mPackageOpsList).when(mAppOpsManager).getPackagesForOps(any());
 
         mRestrictAppPreferenceController.updateState(mPreference);
@@ -86,9 +109,10 @@
     }
 
     @Test
-    public void testUpdateState_twoApps_showCorrectSummary() {
-        mPackageOpsList.add(mPackageOps);
-        mPackageOpsList.add(mPackageOps);
+    public void testUpdateState_twoRestrictApps_showCorrectSummary() {
+        mPackageOpsList.add(mRestrictedPackageOps);
+        mPackageOpsList.add(mRestrictedPackageOps);
+        mPackageOpsList.add(mAllowedPackageOps);
         doReturn(mPackageOpsList).when(mAppOpsManager).getPackagesForOps(any());
 
         mRestrictAppPreferenceController.updateState(mPreference);
@@ -97,7 +121,8 @@
     }
 
     @Test
-    public void testUpdateState_zeroApp_disabled() {
+    public void testUpdateState_zeroRestrictApp_disabled() {
+        mPackageOpsList.add(mAllowedPackageOps);
         doReturn(mPackageOpsList).when(mAppOpsManager).getPackagesForOps(any());
 
         mRestrictAppPreferenceController.updateState(mPreference);