Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a954e914 authored by mxyyiyi's avatar mxyyiyi
Browse files

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
parent 90acfa75
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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();

+5 −0
Original line number Diff line number Diff line
@@ -88,6 +88,11 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider
        return false;
    }

    @Override
    public boolean isRestrictedModeOverwriteEnabled() {
        return false;
    }

    @Override
    public boolean isForceExpireAppOptimizationModeEnabled() {
        return false;
+11 −2
Original line number Diff line number Diff line
@@ -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<Int>(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<Int, AppOptimizationModeEvent> = 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,
+5 −0
Original line number Diff line number Diff line
@@ -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();
+54 −7
Original line number Diff line number Diff line
@@ -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