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

Commit 172ff2ba authored by Caitlin Shkuratov's avatar Caitlin Shkuratov Committed by Automerger Merge Worker
Browse files

Merge "[Central Surfaces] Move shelf click wakes to PowerInteractor." into...

Merge "[Central Surfaces] Move shelf click wakes to PowerInteractor." into udc-qpr-dev am: 72f8eb60

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23598839



Change-Id: I2c6bae4545a05a35dd92d01a3f09b5ca284caac2
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 57f1aa3c 72f8eb60
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -6,7 +6,6 @@ import android.animation.ValueAnimator
import android.content.Context
import android.content.res.Configuration
import android.os.PowerManager
import android.os.SystemClock
import android.util.IndentingPrintWriter
import android.util.MathUtils
import android.view.MotionEvent
@@ -30,6 +29,7 @@ import com.android.systemui.plugins.ActivityStarter.OnDismissAction
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.plugins.qs.QS
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.shade.ShadeViewController
import com.android.systemui.shade.data.repository.ShadeRepository
import com.android.systemui.statusbar.notification.collection.NotificationEntry
@@ -76,6 +76,7 @@ class LockscreenShadeTransitionController @Inject constructor(
    dumpManager: DumpManager,
    qsTransitionControllerFactory: LockscreenShadeQsTransitionController.Factory,
    private val shadeRepository: ShadeRepository,
    private val powerInteractor: PowerInteractor,
) : Dumpable {
    private var pulseHeight: Float = 0f
    @get:VisibleForTesting
@@ -278,11 +279,7 @@ class LockscreenShadeTransitionController @Inject constructor(
        // Bind the click listener of the shelf to go to the full shade
        notificationShelfController.setOnClickListener {
            if (statusBarStateController.state == StatusBarState.KEYGUARD) {
                centralSurfaces.wakeUpIfDozing(
                        SystemClock.uptimeMillis(),
                        "SHADE_CLICK",
                        PowerManager.WAKE_REASON_GESTURE,
                )
                powerInteractor.wakeUpIfDozing("SHADE_CLICK", PowerManager.WAKE_REASON_GESTURE)
                goToLockedShade(it)
            }
        }
+3 −9
Original line number Diff line number Diff line
@@ -20,10 +20,9 @@ import android.os.PowerManager
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.data.repository.DeviceEntryFaceAuthRepository
import com.android.systemui.keyguard.data.repository.KeyguardRepository
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.statusbar.LockscreenShadeTransitionController
import com.android.systemui.statusbar.NotificationShelf
import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.util.time.SystemClock
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
@@ -35,8 +34,7 @@ class NotificationShelfInteractor
constructor(
    private val keyguardRepository: KeyguardRepository,
    private val deviceEntryFaceAuthRepository: DeviceEntryFaceAuthRepository,
    private val centralSurfaces: CentralSurfaces,
    private val systemClock: SystemClock,
    private val powerInteractor: PowerInteractor,
    private val keyguardTransitionController: LockscreenShadeTransitionController,
) {
    /** Is the shelf showing on the keyguard? */
@@ -55,11 +53,7 @@ constructor(

    /** Transition keyguard to the locked shade, triggered by the shelf. */
    fun goToLockedShadeFromShelf() {
        centralSurfaces.wakeUpIfDozing(
            systemClock.uptimeMillis(),
            "SHADE_CLICK",
            PowerManager.WAKE_REASON_GESTURE,
        )
        powerInteractor.wakeUpIfDozing("SHADE_CLICK", PowerManager.WAKE_REASON_GESTURE)
        keyguardTransitionController.goToLockedShade(null)
    }
}
+11 −0
Original line number Diff line number Diff line
@@ -8,12 +8,15 @@ import com.android.systemui.ExpandHelper
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.classifier.FalsingCollectorFake
import com.android.systemui.dump.DumpManager
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.media.controls.ui.MediaHierarchyManager
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.plugins.qs.QS
import com.android.systemui.power.data.repository.FakePowerRepository
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.shade.ShadeViewController
import com.android.systemui.shade.data.repository.FakeShadeRepository
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
@@ -26,6 +29,7 @@ import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.phone.LSShadeTransitionLogger
import com.android.systemui.statusbar.phone.ScrimController
import com.android.systemui.statusbar.policy.FakeConfigurationController
import com.android.systemui.util.mockito.mock
import org.junit.After
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
@@ -83,6 +87,12 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() {
    @Mock lateinit var qsTransitionController: LockscreenShadeQsTransitionController
    @Mock lateinit var activityStarter: ActivityStarter
    @Mock lateinit var transitionControllerCallback: LockscreenShadeTransitionController.Callback
    private val powerInteractor = PowerInteractor(
        FakePowerRepository(),
        FalsingCollectorFake(),
        screenOffAnimationController = mock(),
        statusBarStateController = mock(),
    )
    @JvmField @Rule val mockito = MockitoJUnit.rule()

    private val configurationController = FakeConfigurationController()
@@ -129,6 +139,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() {
                qsTransitionControllerFactory = { qsTransitionController },
                activityStarter = activityStarter,
                shadeRepository = FakeShadeRepository(),
                powerInteractor = powerInteractor,
            )
        transitionController.addCallback(transitionControllerCallback)
        whenever(nsslController.view).thenReturn(stackscroller)
+26 −10
Original line number Diff line number Diff line
@@ -22,21 +22,23 @@ import android.os.PowerManager
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.classifier.FalsingCollectorFake
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFaceAuthRepository
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.power.data.repository.FakePowerRepository
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.statusbar.LockscreenShadeTransitionController
import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.util.mockito.any
import com.android.systemui.statusbar.phone.ScreenOffAnimationController
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.time.FakeSystemClock
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.anyLong
import org.mockito.Mockito.isNull
import org.mockito.Mockito.verify

@@ -46,15 +48,27 @@ class NotificationShelfInteractorTest : SysuiTestCase() {

    private val keyguardRepository = FakeKeyguardRepository()
    private val deviceEntryFaceAuthRepository = FakeDeviceEntryFaceAuthRepository()
    private val centralSurfaces: CentralSurfaces = mock()
    private val systemClock = FakeSystemClock()

    private val screenOffAnimationController =
        mock<ScreenOffAnimationController>().also {
            whenever(it.allowWakeUpIfDozing()).thenReturn(true)
        }
    private val statusBarStateController: StatusBarStateController = mock()
    private val powerRepository = FakePowerRepository()
    private val powerInteractor =
        PowerInteractor(
            powerRepository,
            FalsingCollectorFake(),
            screenOffAnimationController,
            statusBarStateController,
        )

    private val keyguardTransitionController: LockscreenShadeTransitionController = mock()
    private val underTest =
        NotificationShelfInteractor(
            keyguardRepository,
            deviceEntryFaceAuthRepository,
            centralSurfaces,
            systemClock,
            powerInteractor,
            keyguardTransitionController,
        )

@@ -107,10 +121,12 @@ class NotificationShelfInteractorTest : SysuiTestCase() {

    @Test
    fun goToLockedShadeFromShelf_wakesUpFromDoze() {
        whenever(statusBarStateController.isDozing).thenReturn(true)

        underTest.goToLockedShadeFromShelf()

        verify(centralSurfaces)
            .wakeUpIfDozing(anyLong(), any(), eq(PowerManager.WAKE_REASON_GESTURE))
        assertThat(powerRepository.lastWakeReason).isNotNull()
        assertThat(powerRepository.lastWakeReason).isEqualTo(PowerManager.WAKE_REASON_GESTURE)
    }

    @Test
+28 −10
Original line number Diff line number Diff line
@@ -24,23 +24,26 @@ import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.accessibility.data.repository.FakeAccessibilityRepository
import com.android.systemui.accessibility.domain.interactor.AccessibilityInteractor
import com.android.systemui.classifier.FalsingCollectorFake
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFaceAuthRepository
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.power.data.repository.FakePowerRepository
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.statusbar.LockscreenShadeTransitionController
import com.android.systemui.statusbar.notification.row.ui.viewmodel.ActivatableNotificationViewModel
import com.android.systemui.statusbar.notification.shelf.domain.interactor.NotificationShelfInteractor
import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.util.mockito.any
import com.android.systemui.statusbar.phone.ScreenOffAnimationController
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.time.FakeSystemClock
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
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.ArgumentMatchers
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.verify
@@ -54,14 +57,23 @@ class NotificationShelfViewModelTest : SysuiTestCase() {
    @Rule @JvmField val mockitoRule: MockitoRule = MockitoJUnit.rule()

    // mocks
    @Mock private lateinit var centralSurfaces: CentralSurfaces
    @Mock private lateinit var keyguardTransitionController: LockscreenShadeTransitionController
    @Mock private lateinit var screenOffAnimationController: ScreenOffAnimationController
    @Mock private lateinit var statusBarStateController: StatusBarStateController

    // fakes
    private val keyguardRepository = FakeKeyguardRepository()
    private val deviceEntryFaceAuthRepository = FakeDeviceEntryFaceAuthRepository()
    private val systemClock = FakeSystemClock()
    private val a11yRepo = FakeAccessibilityRepository()
    private val powerRepository = FakePowerRepository()
    private val powerInteractor by lazy {
        PowerInteractor(
            powerRepository,
            FalsingCollectorFake(),
            screenOffAnimationController,
            statusBarStateController,
        )
    }

    // real impls
    private val a11yInteractor = AccessibilityInteractor(a11yRepo)
@@ -70,13 +82,17 @@ class NotificationShelfViewModelTest : SysuiTestCase() {
        NotificationShelfInteractor(
            keyguardRepository,
            deviceEntryFaceAuthRepository,
            centralSurfaces,
            systemClock,
            powerInteractor,
            keyguardTransitionController,
        )
    }
    private val underTest by lazy { NotificationShelfViewModel(interactor, activatableViewModel) }

    @Before
    fun setUp() {
        whenever(screenOffAnimationController.allowWakeUpIfDozing()).thenReturn(true)
    }

    @Test
    fun canModifyColorOfNotifications_whenKeyguardNotShowing() = runTest {
        val canModifyNotifColor by collectLastValue(underTest.canModifyColorOfNotifications)
@@ -126,10 +142,12 @@ class NotificationShelfViewModelTest : SysuiTestCase() {

    @Test
    fun onClicked_goesToLockedShade() {
        whenever(statusBarStateController.isDozing).thenReturn(true)

        underTest.onShelfClicked()

        verify(centralSurfaces)
            .wakeUpIfDozing(ArgumentMatchers.anyLong(), any(), eq(PowerManager.WAKE_REASON_GESTURE))
        assertThat(powerRepository.lastWakeReason).isNotNull()
        assertThat(powerRepository.lastWakeReason).isEqualTo(PowerManager.WAKE_REASON_GESTURE)
        verify(keyguardTransitionController).goToLockedShade(Mockito.isNull(), eq(true))
    }
}