From cb77823b6537ba0ec20e6d7946e857f649fd3039 Mon Sep 17 00:00:00 2001 From: Lei Yu Date: Mon, 12 Mar 2018 14:42:54 -0700 Subject: [PATCH] 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 --- .../RestrictAppPreferenceController.java | 21 +++++++--- .../RestrictAppPreferenceControllerTest.java | 39 +++++++++++++++---- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java index e41a94b77d8..02a2cf6e16a 100644 --- a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java +++ b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java @@ -67,17 +67,26 @@ public class RestrictAppPreferenceController extends BasePreferenceController { final List 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 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 c9c82c24dc8..57eff56bad8 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 @@ package com.android.settings.fuelgauge; 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 @@ import java.util.List; @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 class RestrictAppPreferenceControllerTest { 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 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 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 @@ public class RestrictAppPreferenceControllerTest { @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 @@ public class RestrictAppPreferenceControllerTest { } @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 @@ public class RestrictAppPreferenceControllerTest { } @Test - public void testUpdateState_zeroApp_disabled() { + public void testUpdateState_zeroRestrictApp_disabled() { + mPackageOpsList.add(mAllowedPackageOps); doReturn(mPackageOpsList).when(mAppOpsManager).getPackagesForOps(any()); mRestrictAppPreferenceController.updateState(mPreference);