Take as Unrestricted Mode in the UI if current Mode is Unknown.
- Battery usage mode MODE_UNKNOWN is (1) apps in allowlist and (2) app's OP_RUN_ANY_IN_BACKGROUND = MODE_IGNORED. For this case, mode should be displayed as Unrestricted on UI since it is in allowlist; and should be logged as unknown mode for the potential compatibility issues. - After Backup & Restore, the MODE_UNKNOWN will be reset to Optimized(Default) Mode on target device. Bug: 372831500 Test: manual Test: atest BatteryOptimizeUtilsTest Test: atest AppOptModeSharedPreferencesUtilsTest Flag: EXEMPT for simple fix Change-Id: Ic18e026f71a4a50ffa1711e2ca0782aeb8b33076
This commit is contained in:
@@ -196,7 +196,9 @@ public final class BatteryBackupHelper implements BackupHelper {
|
|||||||
appOptModeMap.containsKey(info.uid)
|
appOptModeMap.containsKey(info.uid)
|
||||||
? (int) appOptModeMap.get(info.uid).getResetOptimizationMode()
|
? (int) appOptModeMap.get(info.uid).getResetOptimizationMode()
|
||||||
: BatteryOptimizeUtils.getAppOptimizationMode(
|
: BatteryOptimizeUtils.getAppOptimizationMode(
|
||||||
mode, allowlistedApps.contains(info.packageName));
|
mode,
|
||||||
|
allowlistedApps.contains(info.packageName),
|
||||||
|
/* ignoreUnknownMode= */ false);
|
||||||
// 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
|
||||||
|
@@ -100,7 +100,8 @@ public class BatteryOptimizeUtils {
|
|||||||
|
|
||||||
/** Gets the {@link OptimizationMode} based on mode and allowed list. */
|
/** Gets the {@link OptimizationMode} based on mode and allowed list. */
|
||||||
@OptimizationMode
|
@OptimizationMode
|
||||||
public static int getAppOptimizationMode(int mode, boolean isAllowListed) {
|
public static int getAppOptimizationMode(
|
||||||
|
int mode, boolean isAllowListed, boolean ignoreUnknownMode) {
|
||||||
if (!isAllowListed && mode == AppOpsManager.MODE_IGNORED) {
|
if (!isAllowListed && mode == AppOpsManager.MODE_IGNORED) {
|
||||||
return MODE_RESTRICTED;
|
return MODE_RESTRICTED;
|
||||||
} else if (isAllowListed && mode == AppOpsManager.MODE_ALLOWED) {
|
} else if (isAllowListed && mode == AppOpsManager.MODE_ALLOWED) {
|
||||||
@@ -108,13 +109,15 @@ public class BatteryOptimizeUtils {
|
|||||||
} else if (!isAllowListed && mode == AppOpsManager.MODE_ALLOWED) {
|
} else if (!isAllowListed && mode == AppOpsManager.MODE_ALLOWED) {
|
||||||
return MODE_OPTIMIZED;
|
return MODE_OPTIMIZED;
|
||||||
} else {
|
} else {
|
||||||
return MODE_UNKNOWN;
|
// MODE_UNKNOWN = isAllowListed + AppOpsManager.MODE_IGNORED
|
||||||
|
// Return Unrestricted mode for Unknown mode since it is in allowlist.
|
||||||
|
return ignoreUnknownMode ? MODE_UNRESTRICTED : MODE_UNKNOWN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Gets the {@link OptimizationMode} for associated app. */
|
/** Gets the {@link OptimizationMode} for associated app. */
|
||||||
@OptimizationMode
|
@OptimizationMode
|
||||||
public int getAppOptimizationMode(boolean refreshList) {
|
public int getAppOptimizationMode(boolean refreshList, boolean ignoreUnknownMode) {
|
||||||
if (refreshList) {
|
if (refreshList) {
|
||||||
mPowerAllowListBackend.refreshList();
|
mPowerAllowListBackend.refreshList();
|
||||||
}
|
}
|
||||||
@@ -127,13 +130,13 @@ public class BatteryOptimizeUtils {
|
|||||||
String.format(
|
String.format(
|
||||||
"refresh %s state, allowlisted = %s, mode = %d",
|
"refresh %s state, allowlisted = %s, mode = %d",
|
||||||
mPackageName, mAllowListed, mMode));
|
mPackageName, mAllowListed, mMode));
|
||||||
return getAppOptimizationMode(mMode, mAllowListed);
|
return getAppOptimizationMode(mMode, mAllowListed, ignoreUnknownMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Gets the {@link OptimizationMode} for associated app. */
|
/** Gets the {@link OptimizationMode} for associated app. */
|
||||||
@OptimizationMode
|
@OptimizationMode
|
||||||
public int getAppOptimizationMode() {
|
public int getAppOptimizationMode() {
|
||||||
return getAppOptimizationMode(true);
|
return getAppOptimizationMode(/* refreshList= */ true, /* ignoreUnknownMode= */ true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Resets optimization mode for all applications. */
|
/** Resets optimization mode for all applications. */
|
||||||
@@ -246,10 +249,11 @@ public class BatteryOptimizeUtils {
|
|||||||
@OptimizationMode
|
@OptimizationMode
|
||||||
final int optimizationMode =
|
final int optimizationMode =
|
||||||
getAppOptimizationMode(
|
getAppOptimizationMode(
|
||||||
mode, allowlistBackend.isAllowlisted(info.packageName, info.uid));
|
mode,
|
||||||
// Ignores default optimized/unknown state or system/default apps.
|
allowlistBackend.isAllowlisted(info.packageName, info.uid),
|
||||||
|
/* ignoreUnknownMode= */ false);
|
||||||
|
// Ignores default optimized state or system/default apps.
|
||||||
if (optimizationMode == MODE_OPTIMIZED
|
if (optimizationMode == MODE_OPTIMIZED
|
||||||
|| optimizationMode == MODE_UNKNOWN
|
|
||||||
|| isSystemOrDefaultApp(
|
|| isSystemOrDefaultApp(
|
||||||
context, allowlistBackend, info.packageName, info.uid)) {
|
context, allowlistBackend, info.packageName, info.uid)) {
|
||||||
continue;
|
continue;
|
||||||
@@ -374,7 +378,8 @@ public class BatteryOptimizeUtils {
|
|||||||
"\tStandbyMode: %s, allowListed: %s, mode: %s",
|
"\tStandbyMode: %s, allowListed: %s, mode: %s",
|
||||||
appStandbyMode,
|
appStandbyMode,
|
||||||
allowListed,
|
allowListed,
|
||||||
getAppOptimizationMode(appStandbyMode, allowListed));
|
getAppOptimizationMode(
|
||||||
|
appStandbyMode, allowListed, /* ignoreUnknownMode= */ false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static @DataChangeReason int toChangeReason(Action action) {
|
private static @DataChangeReason int toChangeReason(Action action) {
|
||||||
|
@@ -347,7 +347,9 @@ public final class BatterySettingsStorage extends ObservableBackupRestoreStorage
|
|||||||
appOptModeMap.containsKey(info.uid)
|
appOptModeMap.containsKey(info.uid)
|
||||||
? (int) appOptModeMap.get(info.uid).getResetOptimizationMode()
|
? (int) appOptModeMap.get(info.uid).getResetOptimizationMode()
|
||||||
: BatteryOptimizeUtils.getAppOptimizationMode(
|
: BatteryOptimizeUtils.getAppOptimizationMode(
|
||||||
mode, mAllowlistedApps.contains(info.packageName));
|
mode,
|
||||||
|
mAllowlistedApps.contains(info.packageName),
|
||||||
|
/* ignoreUnknownMode= */ false);
|
||||||
// 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
|
||||||
|
@@ -51,7 +51,8 @@ final class BatteryOptimizationModeCache {
|
|||||||
Pair.create(
|
Pair.create(
|
||||||
BatteryOptimizationMode.forNumber(
|
BatteryOptimizationMode.forNumber(
|
||||||
batteryOptimizeUtils.getAppOptimizationMode(
|
batteryOptimizeUtils.getAppOptimizationMode(
|
||||||
/* refreshList= */ false)),
|
/* refreshList= */ false,
|
||||||
|
/* ignoreUnknownMode= */ false)),
|
||||||
batteryOptimizeUtils.isOptimizeModeMutable()));
|
batteryOptimizeUtils.isOptimizeModeMutable()));
|
||||||
}
|
}
|
||||||
final Pair<BatteryOptimizationMode, Boolean> batteryOptimizeModeInfo =
|
final Pair<BatteryOptimizationMode, Boolean> batteryOptimizeModeInfo =
|
||||||
|
@@ -107,7 +107,7 @@ class BatteryOptimizationModeAppListModel(
|
|||||||
PowerAllowlistBackend.getInstance(context).refreshList()
|
PowerAllowlistBackend.getInstance(context).refreshList()
|
||||||
return recordListFlow.filterItem {
|
return recordListFlow.filterItem {
|
||||||
val appOptimizationMode = BatteryOptimizeUtils(context, it.app.uid, it.app.packageName)
|
val appOptimizationMode = BatteryOptimizeUtils(context, it.app.uid, it.app.packageName)
|
||||||
.getAppOptimizationMode(/* refreshList */ false);
|
.getAppOptimizationMode(/* refreshList */ false, /* ignoreUnknownMode */ true);
|
||||||
when (OptimizationModeSpinnerItem.entries.getOrNull(option)) {
|
when (OptimizationModeSpinnerItem.entries.getOrNull(option)) {
|
||||||
OptimizationModeSpinnerItem.Restricted ->
|
OptimizationModeSpinnerItem.Restricted ->
|
||||||
appOptimizationMode == BatteryOptimizeUtils.MODE_RESTRICTED
|
appOptimizationMode == BatteryOptimizeUtils.MODE_RESTRICTED
|
||||||
|
@@ -127,6 +127,15 @@ public class BatteryOptimizeUtilsTest {
|
|||||||
assertThat(mBatteryOptimizeUtils.getAppOptimizationMode()).isEqualTo(MODE_OPTIMIZED);
|
assertThat(mBatteryOptimizeUtils.getAppOptimizationMode()).isEqualTo(MODE_OPTIMIZED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAppOptimizationMode_unknownMode_returnOptimized() throws Exception {
|
||||||
|
when(mMockBackend.isAllowlisted(anyString(), anyInt())).thenReturn(true);
|
||||||
|
when(mMockAppOpsManager.checkOpNoThrow(anyInt(), anyInt(), anyString()))
|
||||||
|
.thenReturn(AppOpsManager.MODE_IGNORED);
|
||||||
|
|
||||||
|
assertThat(mBatteryOptimizeUtils.getAppOptimizationMode()).isEqualTo(MODE_UNRESTRICTED);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testIsSystemOrDefaultApp_isSystemOrDefaultApp_returnTrue() {
|
public void testIsSystemOrDefaultApp_isSystemOrDefaultApp_returnTrue() {
|
||||||
when(mMockBackend.isAllowlisted(anyString(), anyInt())).thenReturn(true);
|
when(mMockBackend.isAllowlisted(anyString(), anyInt())).thenReturn(true);
|
||||||
|
@@ -228,7 +228,7 @@ class AppOptModeSharedPreferencesUtilsTest {
|
|||||||
@Test
|
@Test
|
||||||
fun updateBatteryOptimizationMode_updateToOptimizedMode_verifyAction() {
|
fun updateBatteryOptimizationMode_updateToOptimizedMode_verifyAction() {
|
||||||
whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(true)
|
whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(true)
|
||||||
whenever(testBatteryOptimizeUtils?.getAppOptimizationMode(true))
|
whenever(testBatteryOptimizeUtils?.getAppOptimizationMode())
|
||||||
.thenReturn(MODE_UNRESTRICTED)
|
.thenReturn(MODE_UNRESTRICTED)
|
||||||
|
|
||||||
val currentOptMode =
|
val currentOptMode =
|
||||||
@@ -246,9 +246,9 @@ class AppOptModeSharedPreferencesUtilsTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun updateBatteryOptimizationMode_optimizationModeNotChanged_verifyAction() {
|
fun updateBatteryOptimizationMode_optimizationModeImmutable_verifyAction() {
|
||||||
whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(false)
|
whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(false)
|
||||||
whenever(testBatteryOptimizeUtils?.getAppOptimizationMode(true))
|
whenever(testBatteryOptimizeUtils?.appOptimizationMode)
|
||||||
.thenReturn(MODE_UNRESTRICTED)
|
.thenReturn(MODE_UNRESTRICTED)
|
||||||
|
|
||||||
val currentOptMode =
|
val currentOptMode =
|
||||||
@@ -268,7 +268,7 @@ class AppOptModeSharedPreferencesUtilsTest {
|
|||||||
@Test
|
@Test
|
||||||
fun updateBatteryOptimizationMode_updateToSameOptimizationMode_verifyAction() {
|
fun updateBatteryOptimizationMode_updateToSameOptimizationMode_verifyAction() {
|
||||||
whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(true)
|
whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(true)
|
||||||
whenever(testBatteryOptimizeUtils?.getAppOptimizationMode(true)).thenReturn(MODE_RESTRICTED)
|
whenever(testBatteryOptimizeUtils?.appOptimizationMode).thenReturn(MODE_RESTRICTED)
|
||||||
|
|
||||||
val currentOptMode =
|
val currentOptMode =
|
||||||
AppOptModeSharedPreferencesUtils.updateBatteryOptimizationMode(
|
AppOptModeSharedPreferencesUtils.updateBatteryOptimizationMode(
|
||||||
@@ -286,7 +286,7 @@ class AppOptModeSharedPreferencesUtilsTest {
|
|||||||
|
|
||||||
private fun insertAppOptModeEventForTest(expirationTime: Long, mode: Int = MODE_OPTIMIZED) {
|
private fun insertAppOptModeEventForTest(expirationTime: Long, mode: Int = MODE_OPTIMIZED) {
|
||||||
whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(true)
|
whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(true)
|
||||||
whenever(testBatteryOptimizeUtils?.getAppOptimizationMode(true)).thenReturn(mode)
|
whenever(testBatteryOptimizeUtils?.appOptimizationMode).thenReturn(mode)
|
||||||
AppOptModeSharedPreferencesUtils.updateAppOptModeExpirationInternal(
|
AppOptModeSharedPreferencesUtils.updateAppOptModeExpirationInternal(
|
||||||
context,
|
context,
|
||||||
mutableListOf(UID),
|
mutableListOf(UID),
|
||||||
|
Reference in New Issue
Block a user