Loading packages/SystemUI/aconfig/systemui.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -509,3 +509,13 @@ flag { purpose: PURPOSE_BUGFIX } } flag { name: "trim_resources_with_background_trim_at_lock" namespace: "systemui" description: "Trim fonts and other caches when the device locks to lower memory consumption." bug: "322143614" metadata { purpose: PURPOSE_BUGFIX } } packages/SystemUI/src/com/android/systemui/flags/Flags.kt +0 −5 Original line number Diff line number Diff line Loading @@ -474,11 +474,6 @@ object Flags { val WARN_ON_BLOCKING_BINDER_TRANSACTIONS = unreleasedFlag("warn_on_blocking_binder_transactions") // TODO(b/283071711): Tracking bug @JvmField val TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK = unreleasedFlag("trim_resources_with_background_trim_on_lock") // TODO:(b/283203305): Tracking bug @JvmField val TRIM_FONT_CACHES_AT_UNLOCK = unreleasedFlag("trim_font_caches_on_unlock") Loading packages/SystemUI/src/com/android/systemui/keyguard/ResourceTrimmer.kt +8 −12 Original line number Diff line number Diff line Loading @@ -32,13 +32,13 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInterac import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.utils.GlobalWindowManager import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import javax.inject.Inject /** * Releases cached resources on allocated by keyguard. Loading @@ -62,7 +62,7 @@ constructor( override fun start() { Log.d(LOG_TAG, "Resource trimmer registered.") if (featureFlags.isEnabled(Flags.TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK)) { if (com.android.systemui.Flags.trimResourcesWithBackgroundTrimAtLock()) { applicationScope.launch(bgDispatcher) { // We need to wait for the AoD transition (and animation) to complete. // This means we're waiting for isDreaming (== implies isDoze) and dozeAmount == 1f Loading Loading @@ -111,15 +111,12 @@ constructor( isDreaming: Boolean, isDozingFully: Boolean ) { if (!featureFlags.isEnabled(Flags.TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK)) { if (!com.android.systemui.Flags.trimResourcesWithBackgroundTrimAtLock()) { return } if (DEBUG) { Log.d( LOG_TAG, "isAsleep: $isAsleep Dreaming: $isDreaming DozeAmount: $isDozingFully" ) Log.d(LOG_TAG, "isAsleep: $isAsleep Dreaming: $isDreaming DozeAmount: $isDozingFully") } // There are three scenarios: // * No dozing and no AoD at all - where we go directly to ASLEEP with isDreaming = false Loading @@ -129,8 +126,7 @@ constructor( // * AoD - where we go to ASLEEP with iDreaming = true and dozeAmount slowly increases // to 1f val dozeDisabledAndScreenOff = isAsleep && !isDreaming val dozeEnabledAndDozeAnimationCompleted = isAsleep && isDreaming && isDozingFully val dozeEnabledAndDozeAnimationCompleted = isAsleep && isDreaming && isDozingFully if (dozeDisabledAndScreenOff || dozeEnabledAndDozeAnimationCompleted) { Trace.beginSection("ResourceTrimmer#trimMemory") Log.d(LOG_TAG, "SysUI asleep, trimming memory.") Loading packages/SystemUI/tests/src/com/android/systemui/keyguard/ResourceTrimmerTest.kt +34 −1 Original line number Diff line number Diff line Loading @@ -2,6 +2,9 @@ package com.android.systemui.keyguard import android.content.ComponentCallbacks2 import android.graphics.HardwareRenderer import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.SetFlagsRule import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase Loading @@ -23,6 +26,7 @@ import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock Loading @@ -48,10 +52,11 @@ class ResourceTrimmerTest : SysuiTestCase() { @Mock private lateinit var globalWindowManager: GlobalWindowManager private lateinit var resourceTrimmer: ResourceTrimmer @Rule @JvmField public val setFlagsRule = SetFlagsRule() @Before fun setUp() { MockitoAnnotations.initMocks(this) featureFlags.set(Flags.TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK, true) featureFlags.set(Flags.TRIM_FONT_CACHES_AT_UNLOCK, true) keyguardRepository.setDozeAmount(0f) keyguardRepository.setKeyguardGoingAway(false) Loading @@ -76,6 +81,7 @@ class ResourceTrimmerTest : SysuiTestCase() { } @Test @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun noChange_noOutputChanges() = testScope.runTest { testScope.runCurrent() Loading @@ -83,6 +89,7 @@ class ResourceTrimmerTest : SysuiTestCase() { } @Test @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun dozeAodDisabled_sleep_trimsMemory() = testScope.runTest { powerInteractor.setAsleepForTest() Loading @@ -93,6 +100,27 @@ class ResourceTrimmerTest : SysuiTestCase() { } @Test @DisableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun dozeAodDisabled_flagDisabled_sleep_doesntTrimMemory() = testScope.runTest { powerInteractor.setAsleepForTest() testScope.runCurrent() verifyZeroInteractions(globalWindowManager) } @Test @DisableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun dozeEnabled_flagDisabled_sleepWithFullDozeAmount_doesntTrimMemory() = testScope.runTest { keyguardRepository.setDreaming(true) keyguardRepository.setDozeAmount(1f) powerInteractor.setAsleepForTest() testScope.runCurrent() verifyZeroInteractions(globalWindowManager) } @Test @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun dozeEnabled_sleepWithFullDozeAmount_trimsMemory() = testScope.runTest { keyguardRepository.setDreaming(true) Loading @@ -105,6 +133,7 @@ class ResourceTrimmerTest : SysuiTestCase() { } @Test @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun dozeEnabled_sleepWithoutFullDozeAmount_doesntTrimMemory() = testScope.runTest { keyguardRepository.setDreaming(true) Loading @@ -115,6 +144,7 @@ class ResourceTrimmerTest : SysuiTestCase() { } @Test @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun aodEnabled_sleepWithFullDozeAmount_trimsMemoryOnce() { testScope.runTest { keyguardRepository.setDreaming(true) Loading @@ -141,6 +171,7 @@ class ResourceTrimmerTest : SysuiTestCase() { } @Test @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun aodEnabled_deviceWakesHalfWayThrough_doesNotTrimMemory() { testScope.runTest { keyguardRepository.setDreaming(true) Loading Loading @@ -172,6 +203,7 @@ class ResourceTrimmerTest : SysuiTestCase() { } @Test @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun keyguardTransitionsToGone_trimsFontCache() = testScope.runTest { keyguardTransitionRepository.sendTransitionSteps( Loading @@ -186,6 +218,7 @@ class ResourceTrimmerTest : SysuiTestCase() { } @Test @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun keyguardTransitionsToGone_flagDisabled_doesNotTrimFontCache() = testScope.runTest { featureFlags.set(Flags.TRIM_FONT_CACHES_AT_UNLOCK, false) Loading Loading
packages/SystemUI/aconfig/systemui.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -509,3 +509,13 @@ flag { purpose: PURPOSE_BUGFIX } } flag { name: "trim_resources_with_background_trim_at_lock" namespace: "systemui" description: "Trim fonts and other caches when the device locks to lower memory consumption." bug: "322143614" metadata { purpose: PURPOSE_BUGFIX } }
packages/SystemUI/src/com/android/systemui/flags/Flags.kt +0 −5 Original line number Diff line number Diff line Loading @@ -474,11 +474,6 @@ object Flags { val WARN_ON_BLOCKING_BINDER_TRANSACTIONS = unreleasedFlag("warn_on_blocking_binder_transactions") // TODO(b/283071711): Tracking bug @JvmField val TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK = unreleasedFlag("trim_resources_with_background_trim_on_lock") // TODO:(b/283203305): Tracking bug @JvmField val TRIM_FONT_CACHES_AT_UNLOCK = unreleasedFlag("trim_font_caches_on_unlock") Loading
packages/SystemUI/src/com/android/systemui/keyguard/ResourceTrimmer.kt +8 −12 Original line number Diff line number Diff line Loading @@ -32,13 +32,13 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInterac import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.utils.GlobalWindowManager import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import javax.inject.Inject /** * Releases cached resources on allocated by keyguard. Loading @@ -62,7 +62,7 @@ constructor( override fun start() { Log.d(LOG_TAG, "Resource trimmer registered.") if (featureFlags.isEnabled(Flags.TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK)) { if (com.android.systemui.Flags.trimResourcesWithBackgroundTrimAtLock()) { applicationScope.launch(bgDispatcher) { // We need to wait for the AoD transition (and animation) to complete. // This means we're waiting for isDreaming (== implies isDoze) and dozeAmount == 1f Loading Loading @@ -111,15 +111,12 @@ constructor( isDreaming: Boolean, isDozingFully: Boolean ) { if (!featureFlags.isEnabled(Flags.TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK)) { if (!com.android.systemui.Flags.trimResourcesWithBackgroundTrimAtLock()) { return } if (DEBUG) { Log.d( LOG_TAG, "isAsleep: $isAsleep Dreaming: $isDreaming DozeAmount: $isDozingFully" ) Log.d(LOG_TAG, "isAsleep: $isAsleep Dreaming: $isDreaming DozeAmount: $isDozingFully") } // There are three scenarios: // * No dozing and no AoD at all - where we go directly to ASLEEP with isDreaming = false Loading @@ -129,8 +126,7 @@ constructor( // * AoD - where we go to ASLEEP with iDreaming = true and dozeAmount slowly increases // to 1f val dozeDisabledAndScreenOff = isAsleep && !isDreaming val dozeEnabledAndDozeAnimationCompleted = isAsleep && isDreaming && isDozingFully val dozeEnabledAndDozeAnimationCompleted = isAsleep && isDreaming && isDozingFully if (dozeDisabledAndScreenOff || dozeEnabledAndDozeAnimationCompleted) { Trace.beginSection("ResourceTrimmer#trimMemory") Log.d(LOG_TAG, "SysUI asleep, trimming memory.") Loading
packages/SystemUI/tests/src/com/android/systemui/keyguard/ResourceTrimmerTest.kt +34 −1 Original line number Diff line number Diff line Loading @@ -2,6 +2,9 @@ package com.android.systemui.keyguard import android.content.ComponentCallbacks2 import android.graphics.HardwareRenderer import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.SetFlagsRule import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase Loading @@ -23,6 +26,7 @@ import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock Loading @@ -48,10 +52,11 @@ class ResourceTrimmerTest : SysuiTestCase() { @Mock private lateinit var globalWindowManager: GlobalWindowManager private lateinit var resourceTrimmer: ResourceTrimmer @Rule @JvmField public val setFlagsRule = SetFlagsRule() @Before fun setUp() { MockitoAnnotations.initMocks(this) featureFlags.set(Flags.TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK, true) featureFlags.set(Flags.TRIM_FONT_CACHES_AT_UNLOCK, true) keyguardRepository.setDozeAmount(0f) keyguardRepository.setKeyguardGoingAway(false) Loading @@ -76,6 +81,7 @@ class ResourceTrimmerTest : SysuiTestCase() { } @Test @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun noChange_noOutputChanges() = testScope.runTest { testScope.runCurrent() Loading @@ -83,6 +89,7 @@ class ResourceTrimmerTest : SysuiTestCase() { } @Test @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun dozeAodDisabled_sleep_trimsMemory() = testScope.runTest { powerInteractor.setAsleepForTest() Loading @@ -93,6 +100,27 @@ class ResourceTrimmerTest : SysuiTestCase() { } @Test @DisableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun dozeAodDisabled_flagDisabled_sleep_doesntTrimMemory() = testScope.runTest { powerInteractor.setAsleepForTest() testScope.runCurrent() verifyZeroInteractions(globalWindowManager) } @Test @DisableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun dozeEnabled_flagDisabled_sleepWithFullDozeAmount_doesntTrimMemory() = testScope.runTest { keyguardRepository.setDreaming(true) keyguardRepository.setDozeAmount(1f) powerInteractor.setAsleepForTest() testScope.runCurrent() verifyZeroInteractions(globalWindowManager) } @Test @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun dozeEnabled_sleepWithFullDozeAmount_trimsMemory() = testScope.runTest { keyguardRepository.setDreaming(true) Loading @@ -105,6 +133,7 @@ class ResourceTrimmerTest : SysuiTestCase() { } @Test @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun dozeEnabled_sleepWithoutFullDozeAmount_doesntTrimMemory() = testScope.runTest { keyguardRepository.setDreaming(true) Loading @@ -115,6 +144,7 @@ class ResourceTrimmerTest : SysuiTestCase() { } @Test @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun aodEnabled_sleepWithFullDozeAmount_trimsMemoryOnce() { testScope.runTest { keyguardRepository.setDreaming(true) Loading @@ -141,6 +171,7 @@ class ResourceTrimmerTest : SysuiTestCase() { } @Test @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun aodEnabled_deviceWakesHalfWayThrough_doesNotTrimMemory() { testScope.runTest { keyguardRepository.setDreaming(true) Loading Loading @@ -172,6 +203,7 @@ class ResourceTrimmerTest : SysuiTestCase() { } @Test @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun keyguardTransitionsToGone_trimsFontCache() = testScope.runTest { keyguardTransitionRepository.sendTransitionSteps( Loading @@ -186,6 +218,7 @@ class ResourceTrimmerTest : SysuiTestCase() { } @Test @EnableFlags(com.android.systemui.Flags.FLAG_TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK) fun keyguardTransitionsToGone_flagDisabled_doesNotTrimFontCache() = testScope.runTest { featureFlags.set(Flags.TRIM_FONT_CACHES_AT_UNLOCK, false) Loading