diff options
10 files changed, 63 insertions, 7 deletions
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt index c865070b2c91..ffb20d87a7f8 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt @@ -22,7 +22,9 @@ import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier +import androidx.compose.ui.input.pointer.motionEventSpy import com.android.compose.animation.scene.Back import com.android.compose.animation.scene.ObservableTransitionState as SceneTransitionObservableTransitionState import com.android.compose.animation.scene.SceneKey as SceneTransitionSceneKey @@ -56,6 +58,7 @@ import kotlinx.coroutines.flow.map * must have entries in this map. * @param modifier A modifier. */ +@OptIn(ExperimentalComposeUiApi::class) @Composable fun SceneContainer( viewModel: SceneContainerViewModel, @@ -79,7 +82,7 @@ fun SceneContainer( onChangeScene = viewModel::onSceneChanged, transitions = SceneContainerTransitions, state = state, - modifier = modifier.fillMaxSize(), + modifier = modifier.fillMaxSize().motionEventSpy { viewModel.onUserInput() }, ) { sceneByKey.forEach { (sceneKey, composableScene) -> scene( diff --git a/packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt b/packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt index 69cb6119580b..b2a87197371d 100644 --- a/packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt @@ -39,6 +39,9 @@ interface PowerRepository { /** Wakes up the device. */ fun wakeUp(why: String, @PowerManager.WakeReason wakeReason: Int) + + /** Notifies the power repository that a user touch happened. */ + fun userTouch() } @SysUISingleton @@ -83,6 +86,14 @@ constructor( ) } + override fun userTouch() { + manager.userActivity( + systemClock.uptimeMillis(), + PowerManager.USER_ACTIVITY_EVENT_TOUCH, + /* flags= */ 0, + ) + } + companion object { private const val TAG = "PowerRepository" } diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt index a7434c6ac797..342c218c41e5 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/SceneInteractor.kt @@ -18,6 +18,7 @@ package com.android.systemui.scene.domain.interactor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.power.data.repository.PowerRepository import com.android.systemui.scene.data.repository.SceneContainerRepository import com.android.systemui.scene.shared.logger.SceneLogger import com.android.systemui.scene.shared.model.ObservableTransitionState @@ -44,6 +45,7 @@ class SceneInteractor constructor( @Application applicationScope: CoroutineScope, private val repository: SceneContainerRepository, + private val powerRepository: PowerRepository, private val logger: SceneLogger, ) { @@ -153,6 +155,11 @@ constructor( repository.setTransitionState(transitionState) } + /** Handles a user input event. */ + fun onUserInput() { + powerRepository.userTouch() + } + /** * Notifies that the UI has transitioned sufficiently to the given scene. * diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt index 5c16fb54e3a0..c5b605ad7877 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt @@ -63,6 +63,11 @@ constructor( interactor.setTransitionState(transitionState) } + /** Handles an event representing user input. */ + fun onUserInput() { + interactor.onUserInput() + } + companion object { private const val SCENE_TRANSITION_LOGGING_REASON = "user input" } diff --git a/packages/SystemUI/tests/src/com/android/systemui/power/data/repository/PowerRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/power/data/repository/PowerRepositoryImplTest.kt index a01394f027cf..f566efe6f176 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/power/data/repository/PowerRepositoryImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/power/data/repository/PowerRepositoryImplTest.kt @@ -193,6 +193,23 @@ class PowerRepositoryImplTest : SysuiTestCase() { assertThat(reasonCaptor.value).contains(context.applicationContext.packageName) } + @Test + fun userActivity_notifiesPowerManager() { + systemClock.setUptimeMillis(345000) + + underTest.userTouch() + + val flagsCaptor = argumentCaptor<Int>() + verify(manager) + .userActivity( + eq(345000L), + eq(PowerManager.USER_ACTIVITY_EVENT_TOUCH), + capture(flagsCaptor) + ) + assertThat(flagsCaptor.value).isNotEqualTo(PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS) + assertThat(flagsCaptor.value).isNotEqualTo(PowerManager.USER_ACTIVITY_FLAG_INDIRECT) + } + private fun verifyRegistered() { // We must verify with all arguments, even those that are optional because they have default // values because Mockito is forcing us to. Once we can use mockito-kotlin, we should be diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt b/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt index 46cbfacb0044..0ecbcdebc68c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt @@ -127,7 +127,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { bouncerInteractor = bouncerInteractor, ) - private val keyguardRepository = utils.keyguardRepository() + private val keyguardRepository = utils.keyguardRepository private val keyguardInteractor = utils.keyguardInteractor( repository = keyguardRepository, diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt index 713c6027d642..8620f6184107 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/SceneInteractorTest.kt @@ -147,4 +147,11 @@ class SceneInteractorTest : SysuiTestCase() { underTest.setVisible(true, "reason") assertThat(isVisible).isTrue() } + + @Test + fun userInput() = + testScope.runTest { + underTest.onUserInput() + assertThat(utils.powerRepository.userTouchRegistered).isTrue() + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt index 951cadd7664e..d60d99430860 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt @@ -61,7 +61,7 @@ class SceneContainerStartableTest : SysuiTestCase() { utils.authenticationInteractor( repository = authenticationRepository, ) - private val keyguardRepository = utils.keyguardRepository() + private val keyguardRepository = utils.keyguardRepository private val keyguardInteractor = utils.keyguardInteractor( repository = keyguardRepository, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/power/data/repository/FakePowerRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/power/data/repository/FakePowerRepository.kt index 3334f3e82c59..b92d946b3750 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/power/data/repository/FakePowerRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/power/data/repository/FakePowerRepository.kt @@ -32,6 +32,8 @@ class FakePowerRepository( var lastWakeWhy: String? = null var lastWakeReason: Int? = null + var userTouchRegistered = false + fun setInteractive(value: Boolean) { _isInteractive.value = value } @@ -40,4 +42,8 @@ class FakePowerRepository( lastWakeWhy = why lastWakeReason = wakeReason } + + override fun userTouch() { + userTouchRegistered = true + } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt index 6b40f8eb2c2f..4f33a97139b2 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt @@ -37,6 +37,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.shared.model.WakeSleepReason import com.android.systemui.keyguard.shared.model.WakefulnessModel import com.android.systemui.keyguard.shared.model.WakefulnessState +import com.android.systemui.power.data.repository.FakePowerRepository import com.android.systemui.scene.data.repository.SceneContainerRepository import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.model.SceneContainerConfig @@ -93,6 +94,8 @@ class SceneTestUtils( } } + val powerRepository: FakePowerRepository by lazy { FakePowerRepository() } + private val context = test.context fun fakeSceneContainerRepository( @@ -126,6 +129,7 @@ class SceneTestUtils( return SceneInteractor( applicationScope = applicationScope(), repository = repository, + powerRepository = powerRepository, logger = mock(), ) } @@ -149,10 +153,6 @@ class SceneTestUtils( ) } - fun keyguardRepository(): FakeKeyguardRepository { - return keyguardRepository - } - fun keyguardInteractor(repository: KeyguardRepository): KeyguardInteractor { return KeyguardInteractor( repository = repository, |