From a954e914dd68b6001280fabd7fb88d3e03de8e17 Mon Sep 17 00:00:00 2001 From: mxyyiyi Date: Mon, 1 Jul 2024 14:20:46 +0800 Subject: [PATCH] Add a flag to protect overwrite app optimization mode to restricted mode. - Skip set app optimization mode to restricted if the flag disabled. Bug: 348192536 Fix: 348192536 Test: atest Flag: EXEMPT bug fix Change-Id: I92d320ce1edfe9b7044afdcd058651b0d54bd6bd --- .../fuelgauge/PowerUsageFeatureProvider.java | 3 + .../PowerUsageFeatureProviderImpl.java | 5 ++ .../AppOptModeSharedPreferencesUtils.kt | 13 +++- .../PowerUsageFeatureProviderImplTest.java | 5 ++ .../AppOptModeSharedPreferencesUtilsTest.kt | 61 ++++++++++++++++--- 5 files changed, 78 insertions(+), 9 deletions(-) diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java index 41ba519be6a..e12cc9ff01d 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java @@ -44,6 +44,9 @@ public interface PowerUsageFeatureProvider { /** Check whether the battery tips card is enabled in the battery usage page */ boolean isBatteryTipsEnabled(); + /** Check whether overwrite the app optimization mode to restricted mode is enabled */ + boolean isRestrictedModeOverwriteEnabled(); + /** Check whether force expire the app optimization mode. */ boolean isForceExpireAppOptimizationModeEnabled(); diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java index 02dff7e369d..4f163a28f47 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java @@ -88,6 +88,11 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider return false; } + @Override + public boolean isRestrictedModeOverwriteEnabled() { + return false; + } + @Override public boolean isForceExpireAppOptimizationModeEnabled() { return false; diff --git a/src/com/android/settings/fuelgauge/batteryusage/AppOptModeSharedPreferencesUtils.kt b/src/com/android/settings/fuelgauge/batteryusage/AppOptModeSharedPreferencesUtils.kt index afff1c9a1bb..508c4df4da3 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/AppOptModeSharedPreferencesUtils.kt +++ b/src/com/android/settings/fuelgauge/batteryusage/AppOptModeSharedPreferencesUtils.kt @@ -76,8 +76,7 @@ object AppOptModeSharedPreferencesUtils { fun resetExpiredAppOptModeBeforeTimestamp(context: Context, queryTimestampMs: Long) = synchronized(appOptimizationModeLock) { val forceExpireEnabled = - featureFactory - .powerUsageFeatureProvider.isForceExpireAppOptimizationModeEnabled + featureFactory.powerUsageFeatureProvider.isForceExpireAppOptimizationModeEnabled val eventsMap = getAppOptModeEventsMap(context) val expirationUids = ArrayList(eventsMap.size) for ((uid, event) in eventsMap) { @@ -113,12 +112,22 @@ object AppOptModeSharedPreferencesUtils { getBatteryOptimizeUtils: (Int, String) -> BatteryOptimizeUtils, ) = synchronized(appOptimizationModeLock) { + val restrictedModeOverwriteEnabled = + featureFactory.powerUsageFeatureProvider.isRestrictedModeOverwriteEnabled val eventsMap = getAppOptModeEventsMap(context) val expirationEvents: MutableMap = ArrayMap() for (i in uids.indices) { val uid = uids[i] val packageName = packageNames[i] val optimizationMode = optimizationModes[i] + if ( + !restrictedModeOverwriteEnabled && + optimizationMode == BatteryOptimizeUtils.MODE_RESTRICTED + ) { + // Unable to set restricted mode due to flag protection. + Log.w(TAG, "setOptimizationMode($packageName) into restricted ignored") + continue + } val originalOptMode: Int = updateBatteryOptimizationMode( context, diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java index cecf8f0f6be..962c40fd81b 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java @@ -77,6 +77,11 @@ public class PowerUsageFeatureProviderImplTest { assertThat(mPowerFeatureProvider.isBatteryTipsEnabled()).isFalse(); } + @Test + public void isRestrictedModeOverwriteEnabled_returnFalse() { + assertThat(mPowerFeatureProvider.isRestrictedModeOverwriteEnabled()).isFalse(); + } + @Test public void isForceExpireAppOptimizationModeEnabled_returnFalse() { assertThat(mPowerFeatureProvider.isForceExpireAppOptimizationModeEnabled()).isFalse(); 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 94f082d4eac..95f69da141d 100644 --- a/tests/unit/src/com/android/settings/fuelgauge/batteryusage/AppOptModeSharedPreferencesUtilsTest.kt +++ b/tests/unit/src/com/android/settings/fuelgauge/batteryusage/AppOptModeSharedPreferencesUtilsTest.kt @@ -83,8 +83,17 @@ class AppOptModeSharedPreferencesUtilsTest { } @Test - fun updateAppOptModeExpirationInternal_withExpirationTime_verifyData() { - insertAppOptModeEventForTest(expirationTime = 1000L) + fun updateAppOptModeExpirationInternal_withoutExpirationTime_verifyEmptyList() { + insertAppOptModeEventForTest(expirationTime = UNLIMITED_EXPIRE_TIME) + + assertThat(AppOptModeSharedPreferencesUtils.getAllEvents(context)).isEmpty() + } + + @Test + fun updateAppOptModeExpirationInternal_setOptimizedModeWithFlagEnabled_verifyData() { + whenever(featureFactory.powerUsageFeatureProvider.isRestrictedModeOverwriteEnabled) + .thenReturn(true) + insertAppOptModeEventForTest(expirationTime = 1000L, mode = MODE_OPTIMIZED) val events = AppOptModeSharedPreferencesUtils.getAllEvents(context) @@ -99,8 +108,46 @@ class AppOptModeSharedPreferencesUtilsTest { } @Test - fun updateAppOptModeExpirationInternal_withoutExpirationTime_verifyEmptyList() { - insertAppOptModeEventForTest(expirationTime = UNLIMITED_EXPIRE_TIME) + fun updateAppOptModeExpirationInternal_setOptimizedModeWithFlagDisabled_verifyData() { + whenever(featureFactory.powerUsageFeatureProvider.isRestrictedModeOverwriteEnabled) + .thenReturn(false) + insertAppOptModeEventForTest(expirationTime = 1000L, mode = MODE_OPTIMIZED) + + val events = AppOptModeSharedPreferencesUtils.getAllEvents(context) + + assertThat(events).hasSize(1) + assertAppOptimizationModeEventInfo( + events[0], + UID, + PACKAGE_NAME, + MODE_OPTIMIZED, + expirationTime = 1000L + ) + } + + @Test + fun updateAppOptModeExpirationInternal_setRestrictedModeWithFlagEnabled_verifyData() { + whenever(featureFactory.powerUsageFeatureProvider.isRestrictedModeOverwriteEnabled) + .thenReturn(true) + insertAppOptModeEventForTest(expirationTime = 1000L, mode = MODE_RESTRICTED) + + val events = AppOptModeSharedPreferencesUtils.getAllEvents(context) + + assertThat(events).hasSize(1) + assertAppOptimizationModeEventInfo( + events[0], + UID, + PACKAGE_NAME, + MODE_RESTRICTED, + expirationTime = 1000L + ) + } + + @Test + fun updateAppOptModeExpirationInternal_setRestrictedModeWithFlagDisabled_verifyEmptyList() { + whenever(featureFactory.powerUsageFeatureProvider.isRestrictedModeOverwriteEnabled) + .thenReturn(false) + insertAppOptModeEventForTest(expirationTime = 1000L, mode = MODE_RESTRICTED) assertThat(AppOptModeSharedPreferencesUtils.getAllEvents(context)).isEmpty() } @@ -237,14 +284,14 @@ class AppOptModeSharedPreferencesUtilsTest { assertThat(currentOptMode).isEqualTo(MODE_RESTRICTED) } - private fun insertAppOptModeEventForTest(expirationTime: Long) { + private fun insertAppOptModeEventForTest(expirationTime: Long, mode: Int = MODE_OPTIMIZED) { whenever(testBatteryOptimizeUtils?.isOptimizeModeMutable).thenReturn(true) - whenever(testBatteryOptimizeUtils?.getAppOptimizationMode(true)).thenReturn(MODE_OPTIMIZED) + whenever(testBatteryOptimizeUtils?.getAppOptimizationMode(true)).thenReturn(mode) AppOptModeSharedPreferencesUtils.updateAppOptModeExpirationInternal( context, mutableListOf(UID), mutableListOf(PACKAGE_NAME), - mutableListOf(MODE_OPTIMIZED), + mutableListOf(mode), longArrayOf(expirationTime), ) { _: Int, _: String -> testBatteryOptimizeUtils