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:
@@ -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;
|
||||||
|
@@ -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(
|
||||||
|
@@ -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
|
||||||
|
@@ -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() {
|
||||||
|
@@ -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",
|
||||||
|
@@ -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));
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
@@ -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,
|
||||||
|
@@ -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();
|
||||||
|
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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,
|
||||||
|
@@ -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 =
|
||||||
|
Reference in New Issue
Block a user