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
This commit is contained in:
@@ -44,6 +44,9 @@ public interface PowerUsageFeatureProvider {
|
|||||||
/** Check whether the battery tips card is enabled in the battery usage page */
|
/** Check whether the battery tips card is enabled in the battery usage page */
|
||||||
boolean isBatteryTipsEnabled();
|
boolean isBatteryTipsEnabled();
|
||||||
|
|
||||||
|
/** Check whether overwrite the app optimization mode to restricted mode is enabled */
|
||||||
|
boolean isRestrictedModeOverwriteEnabled();
|
||||||
|
|
||||||
/** Check whether force expire the app optimization mode. */
|
/** Check whether force expire the app optimization mode. */
|
||||||
boolean isForceExpireAppOptimizationModeEnabled();
|
boolean isForceExpireAppOptimizationModeEnabled();
|
||||||
|
|
||||||
|
@@ -88,6 +88,11 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isRestrictedModeOverwriteEnabled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isForceExpireAppOptimizationModeEnabled() {
|
public boolean isForceExpireAppOptimizationModeEnabled() {
|
||||||
return false;
|
return false;
|
||||||
|
@@ -76,8 +76,7 @@ object AppOptModeSharedPreferencesUtils {
|
|||||||
fun resetExpiredAppOptModeBeforeTimestamp(context: Context, queryTimestampMs: Long) =
|
fun resetExpiredAppOptModeBeforeTimestamp(context: Context, queryTimestampMs: Long) =
|
||||||
synchronized(appOptimizationModeLock) {
|
synchronized(appOptimizationModeLock) {
|
||||||
val forceExpireEnabled =
|
val forceExpireEnabled =
|
||||||
featureFactory
|
featureFactory.powerUsageFeatureProvider.isForceExpireAppOptimizationModeEnabled
|
||||||
.powerUsageFeatureProvider.isForceExpireAppOptimizationModeEnabled
|
|
||||||
val eventsMap = getAppOptModeEventsMap(context)
|
val eventsMap = getAppOptModeEventsMap(context)
|
||||||
val expirationUids = ArrayList<Int>(eventsMap.size)
|
val expirationUids = ArrayList<Int>(eventsMap.size)
|
||||||
for ((uid, event) in eventsMap) {
|
for ((uid, event) in eventsMap) {
|
||||||
@@ -113,12 +112,22 @@ object AppOptModeSharedPreferencesUtils {
|
|||||||
getBatteryOptimizeUtils: (Int, String) -> BatteryOptimizeUtils,
|
getBatteryOptimizeUtils: (Int, String) -> BatteryOptimizeUtils,
|
||||||
) =
|
) =
|
||||||
synchronized(appOptimizationModeLock) {
|
synchronized(appOptimizationModeLock) {
|
||||||
|
val restrictedModeOverwriteEnabled =
|
||||||
|
featureFactory.powerUsageFeatureProvider.isRestrictedModeOverwriteEnabled
|
||||||
val eventsMap = getAppOptModeEventsMap(context)
|
val eventsMap = getAppOptModeEventsMap(context)
|
||||||
val expirationEvents: MutableMap<Int, AppOptimizationModeEvent> = ArrayMap()
|
val expirationEvents: MutableMap<Int, AppOptimizationModeEvent> = ArrayMap()
|
||||||
for (i in uids.indices) {
|
for (i in uids.indices) {
|
||||||
val uid = uids[i]
|
val uid = uids[i]
|
||||||
val packageName = packageNames[i]
|
val packageName = packageNames[i]
|
||||||
val optimizationMode = optimizationModes[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 =
|
val originalOptMode: Int =
|
||||||
updateBatteryOptimizationMode(
|
updateBatteryOptimizationMode(
|
||||||
context,
|
context,
|
||||||
|
@@ -77,6 +77,11 @@ public class PowerUsageFeatureProviderImplTest {
|
|||||||
assertThat(mPowerFeatureProvider.isBatteryTipsEnabled()).isFalse();
|
assertThat(mPowerFeatureProvider.isBatteryTipsEnabled()).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isRestrictedModeOverwriteEnabled_returnFalse() {
|
||||||
|
assertThat(mPowerFeatureProvider.isRestrictedModeOverwriteEnabled()).isFalse();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void isForceExpireAppOptimizationModeEnabled_returnFalse() {
|
public void isForceExpireAppOptimizationModeEnabled_returnFalse() {
|
||||||
assertThat(mPowerFeatureProvider.isForceExpireAppOptimizationModeEnabled()).isFalse();
|
assertThat(mPowerFeatureProvider.isForceExpireAppOptimizationModeEnabled()).isFalse();
|
||||||
|
@@ -83,8 +83,17 @@ class AppOptModeSharedPreferencesUtilsTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun updateAppOptModeExpirationInternal_withExpirationTime_verifyData() {
|
fun updateAppOptModeExpirationInternal_withoutExpirationTime_verifyEmptyList() {
|
||||||
insertAppOptModeEventForTest(expirationTime = 1000L)
|
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)
|
val events = AppOptModeSharedPreferencesUtils.getAllEvents(context)
|
||||||
|
|
||||||
@@ -99,8 +108,46 @@ class AppOptModeSharedPreferencesUtilsTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun updateAppOptModeExpirationInternal_withoutExpirationTime_verifyEmptyList() {
|
fun updateAppOptModeExpirationInternal_setOptimizedModeWithFlagDisabled_verifyData() {
|
||||||
insertAppOptModeEventForTest(expirationTime = UNLIMITED_EXPIRE_TIME)
|
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()
|
assertThat(AppOptModeSharedPreferencesUtils.getAllEvents(context)).isEmpty()
|
||||||
}
|
}
|
||||||
@@ -237,14 +284,14 @@ class AppOptModeSharedPreferencesUtilsTest {
|
|||||||
assertThat(currentOptMode).isEqualTo(MODE_RESTRICTED)
|
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?.isOptimizeModeMutable).thenReturn(true)
|
||||||
whenever(testBatteryOptimizeUtils?.getAppOptimizationMode(true)).thenReturn(MODE_OPTIMIZED)
|
whenever(testBatteryOptimizeUtils?.getAppOptimizationMode(true)).thenReturn(mode)
|
||||||
AppOptModeSharedPreferencesUtils.updateAppOptModeExpirationInternal(
|
AppOptModeSharedPreferencesUtils.updateAppOptModeExpirationInternal(
|
||||||
context,
|
context,
|
||||||
mutableListOf(UID),
|
mutableListOf(UID),
|
||||||
mutableListOf(PACKAGE_NAME),
|
mutableListOf(PACKAGE_NAME),
|
||||||
mutableListOf(MODE_OPTIMIZED),
|
mutableListOf(mode),
|
||||||
longArrayOf(expirationTime),
|
longArrayOf(expirationTime),
|
||||||
) { _: Int, _: String ->
|
) { _: Int, _: String ->
|
||||||
testBatteryOptimizeUtils
|
testBatteryOptimizeUtils
|
||||||
|
Reference in New Issue
Block a user