Implement OP_SYSTEM_EXEMPT_FROM_POWER_RESTRICTIONS exemption

OP_SYSTEM_EXEMPT_FROM_POWER_RESTRICTIONS details:
* An app with this appop will be made exempt from all
  power restrictions, including app standby and doze.
* In addition, the app will be able to start fgs from
  the bg, and the user will not be able to stop fgs
  run by the app.

Changes:
* Implement the OP_SYSTEM_EXEMPT_FROM_POWER_RESTRICTIONS

Bug: 246330879
Test: atest PowerAllowlistBackendTest

Manual testing:
- Give OP_SYSTEM_EXEMPT_FROM_POWER_RESTRICTIONS appop to TestDPC app
- Verify the app can start fg services from the bg
- Verify fgs started by the app cannot be stopped
- Verify the app cannot be put into background restricted via Settings

Change-Id: If9e76076c59195f1e6e5f3eee3c8e7a0c754d8de
This commit is contained in:
Alex Johnston
2023-02-06 18:21:55 +00:00
parent 02c3e876f4
commit 2747dc6e8c
13 changed files with 57 additions and 53 deletions

View File

@@ -96,7 +96,7 @@ public class AppStateAppBatteryUsageBridge extends AppStateBaseBridge {
// Unrestricted = AppOpsManager.MODE_ALLOWED + allowListed // Unrestricted = AppOpsManager.MODE_ALLOWED + allowListed
// Optimized = AppOpsManager.MODE_ALLOWED + !allowListed // Optimized = AppOpsManager.MODE_ALLOWED + !allowListed
boolean allowListed = mPowerAllowlistBackend.isAllowlisted(pkg); boolean allowListed = mPowerAllowlistBackend.isAllowlisted(pkg, uid);
int aomMode = int aomMode =
mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, pkg); mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, pkg);
@OptimizationMode int mode = MODE_UNKNOWN; @OptimizationMode int mode = MODE_UNKNOWN;

View File

@@ -43,14 +43,14 @@ public class AppStatePowerBridge extends AppStateBaseBridge {
final int N = apps.size(); final int N = apps.size();
for (int i = 0; i < N; i++) { for (int i = 0; i < N; i++) {
AppEntry app = apps.get(i); AppEntry app = apps.get(i);
app.extraInfo = mBackend.isAllowlisted(app.info.packageName) app.extraInfo = mBackend.isAllowlisted(app.info.packageName, app.info.uid)
? Boolean.TRUE : Boolean.FALSE; ? Boolean.TRUE : Boolean.FALSE;
} }
} }
@Override @Override
protected void updateExtraInfo(AppEntry app, String pkg, int uid) { protected void updateExtraInfo(AppEntry app, String pkg, int uid) {
app.extraInfo = mBackend.isAllowlisted(pkg) ? Boolean.TRUE : Boolean.FALSE; app.extraInfo = mBackend.isAllowlisted(pkg, uid) ? Boolean.TRUE : Boolean.FALSE;
} }
public static final AppFilter FILTER_POWER_ALLOWLISTED = new CompoundFilter( public static final AppFilter FILTER_POWER_ALLOWLISTED = new CompoundFilter(

View File

@@ -1722,7 +1722,7 @@ public class ManageApplications extends InstrumentedFragment
ApplicationsState.AppEntry entry = mEntries.get(applicationPosition); ApplicationsState.AppEntry entry = mEntries.get(applicationPosition);
return !mBackend.isSysAllowlisted(entry.info.packageName) return !mBackend.isSysAllowlisted(entry.info.packageName)
&& !mBackend.isDefaultActiveApp(entry.info.packageName); && !mBackend.isDefaultActiveApp(entry.info.packageName, entry.info.uid);
} }
@Override @Override

View File

@@ -153,7 +153,7 @@ public final class BatteryBackupHelper implements BackupHelper {
// Ignores default optimized/unknown state or system/default apps. // Ignores default optimized/unknown state or system/default apps.
if (optimizationMode == BatteryOptimizeUtils.MODE_OPTIMIZED if (optimizationMode == BatteryOptimizeUtils.MODE_OPTIMIZED
|| optimizationMode == BatteryOptimizeUtils.MODE_UNKNOWN || optimizationMode == BatteryOptimizeUtils.MODE_UNKNOWN
|| isSystemOrDefaultApp(info.packageName)) { || isSystemOrDefaultApp(info.packageName, info.uid)) {
continue; continue;
} }
final String packageOptimizeMode = final String packageOptimizeMode =
@@ -191,8 +191,9 @@ public final class BatteryBackupHelper implements BackupHelper {
continue; continue;
} }
final String packageName = results[0]; final String packageName = results[0];
final int uid = BatteryUtils.getInstance(mContext).getPackageUid(packageName);
// Ignores system/default apps. // Ignores system/default apps.
if (isSystemOrDefaultApp(packageName)) { if (isSystemOrDefaultApp(packageName, uid)) {
Log.w(TAG, "ignore from isSystemOrDefaultApp():" + packageName); Log.w(TAG, "ignore from isSystemOrDefaultApp():" + packageName);
continue; continue;
} }
@@ -253,10 +254,10 @@ public final class BatteryBackupHelper implements BackupHelper {
return mPowerAllowlistBackend; return mPowerAllowlistBackend;
} }
private boolean isSystemOrDefaultApp(String packageName) { private boolean isSystemOrDefaultApp(String packageName, int uid) {
final PowerAllowlistBackend powerAllowlistBackend = getPowerAllowlistBackend(); final PowerAllowlistBackend powerAllowlistBackend = getPowerAllowlistBackend();
return powerAllowlistBackend.isSysAllowlisted(packageName) return powerAllowlistBackend.isSysAllowlisted(packageName)
|| powerAllowlistBackend.isDefaultActiveApp(packageName); || powerAllowlistBackend.isDefaultActiveApp(packageName, uid);
} }
private ArraySet<ApplicationInfo> getInstalledApplications() { private ArraySet<ApplicationInfo> getInstalledApplications() {

View File

@@ -85,7 +85,7 @@ public class BatteryOptimizeUtils {
mPowerAllowListBackend = PowerAllowlistBackend.getInstance(context); mPowerAllowListBackend = PowerAllowlistBackend.getInstance(context);
mMode = mAppOpsManager mMode = mAppOpsManager
.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mPackageName); .checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mPackageName);
mAllowListed = mPowerAllowListBackend.isAllowlisted(mPackageName); mAllowListed = mPowerAllowListBackend.isAllowlisted(mPackageName, mUid);
} }
/** Gets the {@link OptimizationMode} based on mode and allowed list. */ /** Gets the {@link OptimizationMode} based on mode and allowed list. */
@@ -138,7 +138,7 @@ public class BatteryOptimizeUtils {
*/ */
public boolean isSystemOrDefaultApp() { public boolean isSystemOrDefaultApp() {
mPowerAllowListBackend.refreshList(); mPowerAllowListBackend.refreshList();
return isSystemOrDefaultApp(mPowerAllowListBackend, mPackageName); return isSystemOrDefaultApp(mPowerAllowListBackend, mPackageName, mUid);
} }
/** /**
@@ -186,11 +186,11 @@ public class BatteryOptimizeUtils {
AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, info.uid, info.packageName); AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, info.uid, info.packageName);
@OptimizationMode @OptimizationMode
final int optimizationMode = getAppOptimizationMode( final int optimizationMode = getAppOptimizationMode(
mode, allowlistBackend.isAllowlisted(info.packageName)); mode, allowlistBackend.isAllowlisted(info.packageName, info.uid));
// Ignores default optimized/unknown state or system/default apps. // Ignores default optimized/unknown state or system/default apps.
if (optimizationMode == MODE_OPTIMIZED if (optimizationMode == MODE_OPTIMIZED
|| optimizationMode == MODE_UNKNOWN || optimizationMode == MODE_UNKNOWN
|| isSystemOrDefaultApp(allowlistBackend, info.packageName)) { || isSystemOrDefaultApp(allowlistBackend, info.packageName, info.uid)) {
continue; continue;
} }
@@ -205,9 +205,9 @@ public class BatteryOptimizeUtils {
} }
private static boolean isSystemOrDefaultApp( private static boolean isSystemOrDefaultApp(
PowerAllowlistBackend powerAllowlistBackend, String packageName) { PowerAllowlistBackend powerAllowlistBackend, String packageName, int uid) {
return powerAllowlistBackend.isSysAllowlisted(packageName) return powerAllowlistBackend.isSysAllowlisted(packageName)
|| powerAllowlistBackend.isDefaultActiveApp(packageName); || powerAllowlistBackend.isDefaultActiveApp(packageName, uid);
} }
private static void setAppUsageStateInternal( private static void setAppUsageStateInternal(
@@ -257,7 +257,7 @@ public class BatteryOptimizeUtils {
private void refreshState() { private void refreshState() {
mPowerAllowListBackend.refreshList(); mPowerAllowListBackend.refreshList();
mAllowListed = mPowerAllowListBackend.isAllowlisted(mPackageName); mAllowListed = mPowerAllowListBackend.isAllowlisted(mPackageName, mUid);
mMode = mAppOpsManager mMode = mAppOpsManager
.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mPackageName); .checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mPackageName);
Log.d(TAG, String.format("refresh %s state, allowlisted = %s, mode = %d", Log.d(TAG, String.format("refresh %s state, allowlisted = %s, mode = %d",

View File

@@ -529,7 +529,7 @@ public class BatteryUtils {
return true; return true;
} }
return isSystemUid(uid) || powerAllowlistBackend.isAllowlisted(packageNames) return isSystemUid(uid) || powerAllowlistBackend.isAllowlisted(packageNames, uid)
|| (isSystemApp(mPackageManager, packageNames) && !hasLauncherEntry(packageNames)) || (isSystemApp(mPackageManager, packageNames) && !hasLauncherEntry(packageNames))
|| (isExcessiveBackgroundAnomaly(anomalyInfo) && !isPreOApp(packageNames)); || (isExcessiveBackgroundAnomaly(anomalyInfo) && !isPreOApp(packageNames));
} }

View File

@@ -81,7 +81,7 @@ public class HighPowerDetail extends InstrumentedDialogFragment implements OnCli
mLabel = mPackageName; mLabel = mPackageName;
} }
mDefaultOn = getArguments().getBoolean(ARG_DEFAULT_ON); mDefaultOn = getArguments().getBoolean(ARG_DEFAULT_ON);
mIsEnabled = mDefaultOn || mBackend.isAllowlisted(mPackageName); mIsEnabled = mDefaultOn || mBackend.isAllowlisted(mPackageName, mPackageUid);
} }
public Checkable setup(View view, boolean on) { public Checkable setup(View view, boolean on) {
@@ -137,7 +137,7 @@ public class HighPowerDetail extends InstrumentedDialogFragment implements OnCli
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) { if (which == DialogInterface.BUTTON_POSITIVE) {
boolean newValue = mIsEnabled; boolean newValue = mIsEnabled;
boolean oldValue = mBackend.isAllowlisted(mPackageName); boolean oldValue = mBackend.isAllowlisted(mPackageName, mPackageUid);
if (newValue != oldValue) { if (newValue != oldValue) {
logSpecialPermissionChange(newValue, mPackageName, getContext()); logSpecialPermissionChange(newValue, mPackageName, getContext());
if (newValue) { if (newValue) {
@@ -169,20 +169,20 @@ public class HighPowerDetail extends InstrumentedDialogFragment implements OnCli
} }
public static CharSequence getSummary(Context context, AppEntry entry) { public static CharSequence getSummary(Context context, AppEntry entry) {
return getSummary(context, entry.info.packageName); return getSummary(context, entry.info.packageName, entry.info.uid);
} }
public static CharSequence getSummary(Context context, String pkg) { public static CharSequence getSummary(Context context, String pkg, int uid) {
return getSummary(context, PowerAllowlistBackend.getInstance(context), pkg); return getSummary(context, PowerAllowlistBackend.getInstance(context), pkg, uid);
} }
@VisibleForTesting @VisibleForTesting
static CharSequence getSummary(Context context, PowerAllowlistBackend powerAllowlist, static CharSequence getSummary(Context context, PowerAllowlistBackend powerAllowlist,
String pkg) { String pkg, int uid) {
return context.getString( return context.getString(
powerAllowlist.isSysAllowlisted(pkg) || powerAllowlist.isDefaultActiveApp(pkg) powerAllowlist.isSysAllowlisted(pkg) || powerAllowlist.isDefaultActiveApp(pkg, uid)
? R.string.high_power_system ? R.string.high_power_system
: powerAllowlist.isAllowlisted(pkg) : powerAllowlist.isAllowlisted(pkg, uid)
? R.string.high_power_on ? R.string.high_power_on
: R.string.high_power_off); : R.string.high_power_off);
} }

View File

@@ -81,6 +81,7 @@ public final class BatteryBackupHelperTest {
private static final String PACKAGE_NAME1 = "com.android.testing.1"; private static final String PACKAGE_NAME1 = "com.android.testing.1";
private static final String PACKAGE_NAME2 = "com.android.testing.2"; private static final String PACKAGE_NAME2 = "com.android.testing.2";
private static final String PACKAGE_NAME3 = "com.android.testing.3"; private static final String PACKAGE_NAME3 = "com.android.testing.3";
private static final int UID1 = 1;
private Context mContext; private Context mContext;
private BatteryBackupHelper mBatteryBackupHelper; private BatteryBackupHelper mBatteryBackupHelper;
@@ -208,7 +209,7 @@ public final class BatteryBackupHelperTest {
@Test @Test
public void backupOptimizationMode_backupOptimizationMode() throws Exception { public void backupOptimizationMode_backupOptimizationMode() throws Exception {
final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1); final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1);
createTestingData(PACKAGE_NAME1, PACKAGE_NAME2, PACKAGE_NAME3); createTestingData(PACKAGE_NAME1, UID1, PACKAGE_NAME2, PACKAGE_NAME3);
mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps); mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps);
@@ -221,10 +222,10 @@ public final class BatteryBackupHelperTest {
public void backupOptimizationMode_backupOptimizationModeAndIgnoreSystemApp() public void backupOptimizationMode_backupOptimizationModeAndIgnoreSystemApp()
throws Exception { throws Exception {
final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1); final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1);
createTestingData(PACKAGE_NAME1, PACKAGE_NAME2, PACKAGE_NAME3); createTestingData(PACKAGE_NAME1, UID1, PACKAGE_NAME2, PACKAGE_NAME3);
// Sets "com.android.testing.1" as system app. // Sets "com.android.testing.1" as system app.
doReturn(true).when(mPowerAllowlistBackend).isSysAllowlisted(PACKAGE_NAME1); doReturn(true).when(mPowerAllowlistBackend).isSysAllowlisted(PACKAGE_NAME1);
doReturn(false).when(mPowerAllowlistBackend).isDefaultActiveApp(anyString()); doReturn(false).when(mPowerAllowlistBackend).isDefaultActiveApp(anyString(), anyInt());
mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps); mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps);
@@ -237,9 +238,9 @@ public final class BatteryBackupHelperTest {
public void backupOptimizationMode_backupOptimizationModeAndIgnoreDefaultApp() public void backupOptimizationMode_backupOptimizationModeAndIgnoreDefaultApp()
throws Exception { throws Exception {
final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1); final List<String> allowlistedApps = Arrays.asList(PACKAGE_NAME1);
createTestingData(PACKAGE_NAME1, PACKAGE_NAME2, PACKAGE_NAME3); createTestingData(PACKAGE_NAME1, UID1, PACKAGE_NAME2, PACKAGE_NAME3);
// Sets "com.android.testing.1" as device default app. // Sets "com.android.testing.1" as device default app.
doReturn(true).when(mPowerAllowlistBackend).isDefaultActiveApp(PACKAGE_NAME1); doReturn(true).when(mPowerAllowlistBackend).isDefaultActiveApp(PACKAGE_NAME1, UID1);
doReturn(false).when(mPowerAllowlistBackend).isSysAllowlisted(anyString()); doReturn(false).when(mPowerAllowlistBackend).isSysAllowlisted(anyString());
mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps); mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps);
@@ -371,15 +372,15 @@ public final class BatteryBackupHelperTest {
assertThat(actualResultSet).isEqualTo(expectedResultSet); assertThat(actualResultSet).isEqualTo(expectedResultSet);
} }
private void createTestingData( private void createTestingData(String packageName1, int uid1, String packageName2,
String packageName1, String packageName2, String packageName3) throws Exception { String packageName3) throws Exception {
// Sets the getInstalledApplications() method for testing. // Sets the getInstalledApplications() method for testing.
final UserInfo userInfo = final UserInfo userInfo =
new UserInfo(/*userId=*/ 0, /*userName=*/ "google", /*flag=*/ 0); new UserInfo(/*userId=*/ 0, /*userName=*/ "google", /*flag=*/ 0);
doReturn(Arrays.asList(userInfo)).when(mUserManager).getProfiles(anyInt()); doReturn(Arrays.asList(userInfo)).when(mUserManager).getProfiles(anyInt());
final ApplicationInfo applicationInfo1 = new ApplicationInfo(); final ApplicationInfo applicationInfo1 = new ApplicationInfo();
applicationInfo1.enabled = true; applicationInfo1.enabled = true;
applicationInfo1.uid = 1; applicationInfo1.uid = uid1;
applicationInfo1.packageName = packageName1; applicationInfo1.packageName = packageName1;
final ApplicationInfo applicationInfo2 = new ApplicationInfo(); final ApplicationInfo applicationInfo2 = new ApplicationInfo();
applicationInfo2.enabled = false; applicationInfo2.enabled = false;

View File

@@ -94,7 +94,7 @@ public class BatteryOptimizeUtilsTest {
@Test @Test
public void testGetAppOptimizationMode_returnRestricted() { public void testGetAppOptimizationMode_returnRestricted() {
when(mMockBackend.isAllowlisted(anyString())).thenReturn(false); when(mMockBackend.isAllowlisted(anyString(), anyInt())).thenReturn(false);
when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString())) when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_IGNORED); .thenReturn(AppOpsManager.MODE_IGNORED);
@@ -104,7 +104,7 @@ public class BatteryOptimizeUtilsTest {
@Test @Test
public void testGetAppOptimizationMode_returnUnrestricted() { public void testGetAppOptimizationMode_returnUnrestricted() {
when(mMockBackend.isAllowlisted(anyString())).thenReturn(true); when(mMockBackend.isAllowlisted(anyString(), anyInt())).thenReturn(true);
when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString())) when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_ALLOWED); .thenReturn(AppOpsManager.MODE_ALLOWED);
@@ -114,7 +114,7 @@ public class BatteryOptimizeUtilsTest {
@Test @Test
public void testGetAppOptimizationMode_returnOptimized() { public void testGetAppOptimizationMode_returnOptimized() {
when(mMockBackend.isAllowlisted(anyString())).thenReturn(false); when(mMockBackend.isAllowlisted(anyString(), anyInt())).thenReturn(false);
when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString())) when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_ALLOWED); .thenReturn(AppOpsManager.MODE_ALLOWED);
@@ -124,8 +124,8 @@ public class BatteryOptimizeUtilsTest {
@Test @Test
public void testIsSystemOrDefaultApp_isSystemOrDefaultApp_returnTrue() { public void testIsSystemOrDefaultApp_isSystemOrDefaultApp_returnTrue() {
when(mMockBackend.isAllowlisted(anyString())).thenReturn(true); when(mMockBackend.isAllowlisted(anyString(), anyInt())).thenReturn(true);
when(mMockBackend.isDefaultActiveApp(anyString())).thenReturn(true); when(mMockBackend.isDefaultActiveApp(anyString(), anyInt())).thenReturn(true);
assertThat(mBatteryOptimizeUtils.isSystemOrDefaultApp()).isTrue(); assertThat(mBatteryOptimizeUtils.isSystemOrDefaultApp()).isTrue();
} }
@@ -151,7 +151,7 @@ public class BatteryOptimizeUtilsTest {
@Test @Test
public void testSetAppUsageState_Restricted_verifyAction() throws Exception { public void testSetAppUsageState_Restricted_verifyAction() throws Exception {
// Sets the current mode as MODE_UNRESTRICTED. // Sets the current mode as MODE_UNRESTRICTED.
when(mMockBackend.isAllowlisted(anyString())).thenReturn(true); when(mMockBackend.isAllowlisted(anyString(), anyInt())).thenReturn(true);
when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString())) when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_ALLOWED); .thenReturn(AppOpsManager.MODE_ALLOWED);
@@ -164,7 +164,7 @@ public class BatteryOptimizeUtilsTest {
@Test @Test
public void testSetAppUsageState_Unrestricted_verifyAction() throws Exception { public void testSetAppUsageState_Unrestricted_verifyAction() throws Exception {
// Sets the current mode as MODE_RESTRICTED. // Sets the current mode as MODE_RESTRICTED.
when(mMockBackend.isAllowlisted(anyString())).thenReturn(false); when(mMockBackend.isAllowlisted(anyString(), anyInt())).thenReturn(false);
when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString())) when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_IGNORED); .thenReturn(AppOpsManager.MODE_IGNORED);
@@ -178,7 +178,7 @@ public class BatteryOptimizeUtilsTest {
@Test @Test
public void testSetAppUsageState_Optimized_verifyAction() throws Exception { public void testSetAppUsageState_Optimized_verifyAction() throws Exception {
// Sets the current mode as MODE_UNRESTRICTED. // Sets the current mode as MODE_UNRESTRICTED.
when(mMockBackend.isAllowlisted(anyString())).thenReturn(true); when(mMockBackend.isAllowlisted(anyString(), anyInt())).thenReturn(true);
when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString())) when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_ALLOWED); .thenReturn(AppOpsManager.MODE_ALLOWED);
@@ -191,7 +191,7 @@ public class BatteryOptimizeUtilsTest {
@Test @Test
public void testSetAppUsageState_sameUnrestrictedMode_verifyNoAction() throws Exception { public void testSetAppUsageState_sameUnrestrictedMode_verifyNoAction() throws Exception {
// Sets the current mode as MODE_UNRESTRICTED. // Sets the current mode as MODE_UNRESTRICTED.
when(mMockBackend.isAllowlisted(anyString())).thenReturn(true); when(mMockBackend.isAllowlisted(anyString(), anyInt())).thenReturn(true);
when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString())) when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
.thenReturn(AppOpsManager.MODE_ALLOWED); .thenReturn(AppOpsManager.MODE_ALLOWED);
@@ -267,7 +267,7 @@ public class BatteryOptimizeUtilsTest {
final InOrder inOrder = inOrder(mMockBackend); final InOrder inOrder = inOrder(mMockBackend);
inOrder.verify(mMockBackend).refreshList(); inOrder.verify(mMockBackend).refreshList();
inOrder.verify(mMockBackend).isAllowlisted(PACKAGE_NAME); inOrder.verify(mMockBackend).isAllowlisted(PACKAGE_NAME, UID);
verifyNoMoreInteractions(mMockBackend); verifyNoMoreInteractions(mMockBackend);
} }
@@ -281,7 +281,7 @@ public class BatteryOptimizeUtilsTest {
final InOrder inOrder = inOrder(mMockBackend); final InOrder inOrder = inOrder(mMockBackend);
inOrder.verify(mMockBackend).refreshList(); inOrder.verify(mMockBackend).refreshList();
inOrder.verify(mMockBackend).isAllowlisted(PACKAGE_NAME); inOrder.verify(mMockBackend).isAllowlisted(PACKAGE_NAME, UID);
inOrder.verify(mMockBackend).isSysAllowlisted(PACKAGE_NAME); inOrder.verify(mMockBackend).isSysAllowlisted(PACKAGE_NAME);
verifyNoMoreInteractions(mMockBackend); verifyNoMoreInteractions(mMockBackend);
} }
@@ -324,13 +324,13 @@ public class BatteryOptimizeUtilsTest {
.checkOpNoThrow(anyInt(), anyInt(), anyString()); .checkOpNoThrow(anyInt(), anyInt(), anyString());
doReturn(allowListed) doReturn(allowListed)
.when(mMockBackend) .when(mMockBackend)
.isAllowlisted(anyString()); .isAllowlisted(anyString(), anyInt());
doReturn(isSystemOrDefaultApp) doReturn(isSystemOrDefaultApp)
.when(mMockBackend) .when(mMockBackend)
.isSysAllowlisted(anyString()); .isSysAllowlisted(anyString());
doReturn(isSystemOrDefaultApp) doReturn(isSystemOrDefaultApp)
.when(mMockBackend) .when(mMockBackend)
.isDefaultActiveApp(anyString()); .isDefaultActiveApp(anyString(), anyInt());
BatteryOptimizeUtils.resetAppOptimizationMode( BatteryOptimizeUtils.resetAppOptimizationMode(
mContext, mMockIPackageManager, mMockAppOpsManager, mMockBackend, mContext, mMockIPackageManager, mMockAppOpsManager, mMockBackend,

View File

@@ -398,7 +398,8 @@ public class BatteryUtilsTest {
@Test @Test
public void testShouldHideAnomaly_AppInDozeList_returnTrue() { public void testShouldHideAnomaly_AppInDozeList_returnTrue() {
doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID); doReturn(new String[]{HIGH_SDK_PACKAGE}).when(mPackageManager).getPackagesForUid(UID);
doReturn(true).when(mPowerAllowlistBackend).isAllowlisted(new String[]{HIGH_SDK_PACKAGE}); doReturn(true).when(mPowerAllowlistBackend)
.isAllowlisted(new String[]{HIGH_SDK_PACKAGE}, UID);
assertThat(mBatteryUtils.shouldHideAnomaly(mPowerAllowlistBackend, UID, assertThat(mBatteryUtils.shouldHideAnomaly(mPowerAllowlistBackend, UID,
mAnomalyInfo)).isTrue(); mAnomalyInfo)).isTrue();

View File

@@ -85,7 +85,7 @@ public class HighPowerDetailTest {
@Test @Test
public void onClick_appAddedToDozeAllowlist_getsUnrestricted() { public void onClick_appAddedToDozeAllowlist_getsUnrestricted() {
mFragment.mIsEnabled = true; mFragment.mIsEnabled = true;
when(mPowerAllowlistBackend.isAllowlisted(TEST_PACKAGE)).thenReturn(false); when(mPowerAllowlistBackend.isAllowlisted(TEST_PACKAGE, TEST_UID)).thenReturn(false);
mFragment.onClick(null, DialogInterface.BUTTON_POSITIVE); mFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
verify(mBatteryUtils).setForceAppStandby(TEST_UID, TEST_PACKAGE, verify(mBatteryUtils).setForceAppStandby(TEST_UID, TEST_PACKAGE,
AppOpsManager.MODE_ALLOWED); AppOpsManager.MODE_ALLOWED);
@@ -93,9 +93,9 @@ public class HighPowerDetailTest {
@Test @Test
public void getSummary_defaultActivePackage_returnUnavailable() { public void getSummary_defaultActivePackage_returnUnavailable() {
doReturn(true).when(mPowerAllowlistBackend).isDefaultActiveApp(TEST_PACKAGE); doReturn(true).when(mPowerAllowlistBackend).isDefaultActiveApp(TEST_PACKAGE, TEST_UID);
assertThat(HighPowerDetail.getSummary(mContext, mPowerAllowlistBackend, TEST_PACKAGE)) assertThat(HighPowerDetail.getSummary(mContext, mPowerAllowlistBackend, TEST_PACKAGE,
.isEqualTo(mContext.getString(R.string.high_power_system)); TEST_UID)).isEqualTo(mContext.getString(R.string.high_power_system));
} }
} }

View File

@@ -146,7 +146,8 @@ public class AnomalyDetectionJobServiceTest {
@Test @Test
public void saveAnomalyToDatabase_systemAllowlisted_doNotSave() { public void saveAnomalyToDatabase_systemAllowlisted_doNotSave() {
doReturn(UID).when(mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any()); doReturn(UID).when(mAnomalyDetectionJobService).extractUidFromStatsDimensionsValue(any());
doReturn(true).when(mPowerAllowlistBackend).isAllowlisted(any(String[].class)); doReturn(true).when(mPowerAllowlistBackend)
.isAllowlisted(any(String[].class), any(Integer.class));
mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext, mAnomalyDetectionJobService.saveAnomalyToDatabase(mContext,
mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy, mUserManager, mBatteryDatabaseManager, mBatteryUtils, mPolicy,

View File

@@ -40,7 +40,7 @@ public final class AppStateAppBatteryUsageBridgeTest {
@Test @Test
public void updateExtraInfo_updatesRestricted() { public void updateExtraInfo_updatesRestricted() {
when(mPowerAllowlistBackend.isAllowlisted(TEST_PACKAGE_1)).thenReturn(false); when(mPowerAllowlistBackend.isAllowlisted(TEST_PACKAGE_1, UID_1)).thenReturn(false);
when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
UID_1, TEST_PACKAGE_1)).thenReturn(AppOpsManager.MODE_IGNORED); UID_1, TEST_PACKAGE_1)).thenReturn(AppOpsManager.MODE_IGNORED);
AppStateAppBatteryUsageBridge bridge = AppStateAppBatteryUsageBridge bridge =
@@ -59,7 +59,7 @@ public final class AppStateAppBatteryUsageBridgeTest {
@Test @Test
public void updateExtraInfo_updatesUnrestricted() { public void updateExtraInfo_updatesUnrestricted() {
when(mPowerAllowlistBackend.isAllowlisted(TEST_PACKAGE_1)).thenReturn(true); when(mPowerAllowlistBackend.isAllowlisted(TEST_PACKAGE_1, UID_1)).thenReturn(true);
when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
UID_2, TEST_PACKAGE_2)).thenReturn(AppOpsManager.MODE_ALLOWED); UID_2, TEST_PACKAGE_2)).thenReturn(AppOpsManager.MODE_ALLOWED);
AppStateAppBatteryUsageBridge bridge = AppStateAppBatteryUsageBridge bridge =