From 7bfa060c5f36f7b2406c2b4ea2ab79220e5f8ec4 Mon Sep 17 00:00:00 2001 From: mxyyiyi Date: Mon, 14 Oct 2024 13:32:17 +0800 Subject: [PATCH] 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 --- .../fuelgauge/BatteryBackupHelper.java | 4 +++- .../fuelgauge/BatteryOptimizeUtils.java | 23 +++++++++++-------- .../fuelgauge/BatterySettingsStorage.java | 4 +++- .../BatteryOptimizationModeCache.java | 3 ++- ...teryOptimizationModeAppListPageProvider.kt | 2 +- .../fuelgauge/BatteryOptimizeUtilsTest.java | 9 ++++++++ .../AppOptModeSharedPreferencesUtilsTest.kt | 10 ++++---- 7 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java index 582239731c4..651a1b258eb 100644 --- a/src/com/android/settings/fuelgauge/BatteryBackupHelper.java +++ b/src/com/android/settings/fuelgauge/BatteryBackupHelper.java @@ -196,7 +196,9 @@ public final class BatteryBackupHelper implements BackupHelper { appOptModeMap.containsKey(info.uid) ? (int) appOptModeMap.get(info.uid).getResetOptimizationMode() : BatteryOptimizeUtils.getAppOptimizationMode( - mode, allowlistedApps.contains(info.packageName)); + mode, + allowlistedApps.contains(info.packageName), + /* ignoreUnknownMode= */ false); // Ignores default optimized/unknown state or system/default apps. if (optimizationMode == BatteryOptimizeUtils.MODE_OPTIMIZED || optimizationMode == BatteryOptimizeUtils.MODE_UNKNOWN diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java index 3233f0d7aa9..6c95823853f 100644 --- a/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryOptimizeUtils.java @@ -100,7 +100,8 @@ public class BatteryOptimizeUtils { /** Gets the {@link OptimizationMode} based on mode and allowed list. */ @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) { return MODE_RESTRICTED; } else if (isAllowListed && mode == AppOpsManager.MODE_ALLOWED) { @@ -108,13 +109,15 @@ public class BatteryOptimizeUtils { } else if (!isAllowListed && mode == AppOpsManager.MODE_ALLOWED) { return MODE_OPTIMIZED; } 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. */ @OptimizationMode - public int getAppOptimizationMode(boolean refreshList) { + public int getAppOptimizationMode(boolean refreshList, boolean ignoreUnknownMode) { if (refreshList) { mPowerAllowListBackend.refreshList(); } @@ -127,13 +130,13 @@ public class BatteryOptimizeUtils { String.format( "refresh %s state, allowlisted = %s, mode = %d", mPackageName, mAllowListed, mMode)); - return getAppOptimizationMode(mMode, mAllowListed); + return getAppOptimizationMode(mMode, mAllowListed, ignoreUnknownMode); } /** Gets the {@link OptimizationMode} for associated app. */ @OptimizationMode public int getAppOptimizationMode() { - return getAppOptimizationMode(true); + return getAppOptimizationMode(/* refreshList= */ true, /* ignoreUnknownMode= */ true); } /** Resets optimization mode for all applications. */ @@ -246,10 +249,11 @@ public class BatteryOptimizeUtils { @OptimizationMode final int optimizationMode = getAppOptimizationMode( - mode, allowlistBackend.isAllowlisted(info.packageName, info.uid)); - // Ignores default optimized/unknown state or system/default apps. + mode, + allowlistBackend.isAllowlisted(info.packageName, info.uid), + /* ignoreUnknownMode= */ false); + // Ignores default optimized state or system/default apps. if (optimizationMode == MODE_OPTIMIZED - || optimizationMode == MODE_UNKNOWN || isSystemOrDefaultApp( context, allowlistBackend, info.packageName, info.uid)) { continue; @@ -374,7 +378,8 @@ public class BatteryOptimizeUtils { "\tStandbyMode: %s, allowListed: %s, mode: %s", appStandbyMode, allowListed, - getAppOptimizationMode(appStandbyMode, allowListed)); + getAppOptimizationMode( + appStandbyMode, allowListed, /* ignoreUnknownMode= */ false)); } private static @DataChangeReason int toChangeReason(Action action) { diff --git a/src/com/android/settings/fuelgauge/BatterySettingsStorage.java b/src/com/android/settings/fuelgauge/BatterySettingsStorage.java index 33a802586eb..eeebbec676e 100644 --- a/src/com/android/settings/fuelgauge/BatterySettingsStorage.java +++ b/src/com/android/settings/fuelgauge/BatterySettingsStorage.java @@ -347,7 +347,9 @@ public final class BatterySettingsStorage extends ObservableBackupRestoreStorage appOptModeMap.containsKey(info.uid) ? (int) appOptModeMap.get(info.uid).getResetOptimizationMode() : BatteryOptimizeUtils.getAppOptimizationMode( - mode, mAllowlistedApps.contains(info.packageName)); + mode, + mAllowlistedApps.contains(info.packageName), + /* ignoreUnknownMode= */ false); // Ignores default optimized/unknown state or system/default apps. if (optimizationMode == BatteryOptimizeUtils.MODE_OPTIMIZED || optimizationMode == BatteryOptimizeUtils.MODE_UNKNOWN diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryOptimizationModeCache.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryOptimizationModeCache.java index 2084b660b06..076676d0eab 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryOptimizationModeCache.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryOptimizationModeCache.java @@ -51,7 +51,8 @@ final class BatteryOptimizationModeCache { Pair.create( BatteryOptimizationMode.forNumber( batteryOptimizeUtils.getAppOptimizationMode( - /* refreshList= */ false)), + /* refreshList= */ false, + /* ignoreUnknownMode= */ false)), batteryOptimizeUtils.isOptimizeModeMutable())); } final Pair batteryOptimizeModeInfo = diff --git a/src/com/android/settings/spa/app/battery/BatteryOptimizationModeAppListPageProvider.kt b/src/com/android/settings/spa/app/battery/BatteryOptimizationModeAppListPageProvider.kt index f077506bc3c..5c27f5bfad0 100644 --- a/src/com/android/settings/spa/app/battery/BatteryOptimizationModeAppListPageProvider.kt +++ b/src/com/android/settings/spa/app/battery/BatteryOptimizationModeAppListPageProvider.kt @@ -107,7 +107,7 @@ class BatteryOptimizationModeAppListModel( PowerAllowlistBackend.getInstance(context).refreshList() return recordListFlow.filterItem { val appOptimizationMode = BatteryOptimizeUtils(context, it.app.uid, it.app.packageName) - .getAppOptimizationMode(/* refreshList */ false); + .getAppOptimizationMode(/* refreshList */ false, /* ignoreUnknownMode */ true); when (OptimizationModeSpinnerItem.entries.getOrNull(option)) { OptimizationModeSpinnerItem.Restricted -> appOptimizationMode == BatteryOptimizeUtils.MODE_RESTRICTED diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java index 72b49e27de5..41e9dca86f1 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryOptimizeUtilsTest.java @@ -127,6 +127,15 @@ public class BatteryOptimizeUtilsTest { 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 public void testIsSystemOrDefaultApp_isSystemOrDefaultApp_returnTrue() { when(mMockBackend.isAllowlisted(anyString(), anyInt())).thenReturn(true); diff --git a/tests/unit/src/com/android/settings/fuelgauge/batteryusage/AppOptModeSharedPreferencesUtilsTest.kt b/tests/unit/src/com/android/settings/fuelgauge/batteryusage/AppOptModeSharedPreferencesUtilsTest.kt index 95f69da141d..385de309ea2 100644 --- a/tests/unit/src/com/android/settings/fuelgauge/batteryusage/AppOptModeSharedPreferencesUtilsTest.kt +++ b/tests/unit/src/com/android/settings/fuelgauge/batteryusage/AppOptModeSharedPreferencesUtilsTest.kt @@ -228,7 +228,7 @@ class AppOptModeSharedPreferencesUtilsTest { @Test fun updateBatteryOptimizationMode_updateToOptimizedMode_verifyAction() { whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(true) - whenever(testBatteryOptimizeUtils?.getAppOptimizationMode(true)) + whenever(testBatteryOptimizeUtils?.getAppOptimizationMode()) .thenReturn(MODE_UNRESTRICTED) val currentOptMode = @@ -246,9 +246,9 @@ class AppOptModeSharedPreferencesUtilsTest { } @Test - fun updateBatteryOptimizationMode_optimizationModeNotChanged_verifyAction() { + fun updateBatteryOptimizationMode_optimizationModeImmutable_verifyAction() { whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(false) - whenever(testBatteryOptimizeUtils?.getAppOptimizationMode(true)) + whenever(testBatteryOptimizeUtils?.appOptimizationMode) .thenReturn(MODE_UNRESTRICTED) val currentOptMode = @@ -268,7 +268,7 @@ class AppOptModeSharedPreferencesUtilsTest { @Test fun updateBatteryOptimizationMode_updateToSameOptimizationMode_verifyAction() { whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(true) - whenever(testBatteryOptimizeUtils?.getAppOptimizationMode(true)).thenReturn(MODE_RESTRICTED) + whenever(testBatteryOptimizeUtils?.appOptimizationMode).thenReturn(MODE_RESTRICTED) val currentOptMode = AppOptModeSharedPreferencesUtils.updateBatteryOptimizationMode( @@ -286,7 +286,7 @@ class AppOptModeSharedPreferencesUtilsTest { private fun insertAppOptModeEventForTest(expirationTime: Long, mode: Int = MODE_OPTIMIZED) { whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(true) - whenever(testBatteryOptimizeUtils?.getAppOptimizationMode(true)).thenReturn(mode) + whenever(testBatteryOptimizeUtils?.appOptimizationMode).thenReturn(mode) AppOptModeSharedPreferencesUtils.updateAppOptModeExpirationInternal( context, mutableListOf(UID),