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:
mxyyiyi
2024-10-14 13:32:17 +08:00
parent fdc8eb3e00
commit 7bfa060c5f
7 changed files with 37 additions and 18 deletions

View File

@@ -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

View File

@@ -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) {

View File

@@ -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

View File

@@ -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 =

View File

@@ -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

View File

@@ -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);

View File

@@ -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),