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

Commit d2c2bb5a authored by Bharat Singh's avatar Bharat Singh Committed by Android (Google) Code Review
Browse files

Merge "[SysUI][Floaty] Ignore invocation effect in power key combinations" into main

parents d914c5cc 1ca365dd
Loading
Loading
Loading
Loading
+32 −5
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.jank.interactionJankMonitor
import com.android.systemui.keyevent.data.repository.fakeKeyEventRepository
import com.android.systemui.keyevent.domain.interactor.keyEventInteractor
import com.android.systemui.keyevent.domain.interactor.KeyEventInteractor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.advanceTimeBy
import com.android.systemui.kosmos.runCurrent
@@ -35,8 +35,8 @@ import com.android.systemui.testKosmos
import com.android.systemui.topui.TopUiController
import com.android.systemui.topui.TopUiControllerRefactor
import com.android.systemui.topui.topUiController
import com.android.systemui.topwindoweffects.data.repository.DEFAULT_INITIAL_DELAY_MILLIS
import com.android.systemui.topwindoweffects.data.repository.DEFAULT_LONG_PRESS_POWER_DURATION_MILLIS
import com.android.systemui.topwindoweffects.data.repository.SqueezeEffectRepositoryImpl.Companion.DEFAULT_INITIAL_DELAY_MILLIS
import com.android.systemui.topwindoweffects.data.repository.SqueezeEffectRepositoryImpl.Companion.DEFAULT_LONG_PRESS_POWER_DURATION_MILLIS
import com.android.systemui.topwindoweffects.data.repository.fakeSqueezeEffectRepository
import com.android.systemui.topwindoweffects.domain.interactor.SqueezeEffectInteractor
import com.android.systemui.topwindoweffects.ui.compose.EffectsWindowRoot
@@ -77,10 +77,13 @@ class TopLevelWindowEffectsTest : SysuiTestCase() {
                mainDispatcher = StandardTestDispatcher(testScope.testScheduler),
                topLevelWindowEffectsScope = testScope.backgroundScope,
                windowManager = windowManager,
                keyEventInteractor = keyEventInteractor,
                viewModelFactory = viewModelFactory,
                squeezeEffectInteractor =
                    SqueezeEffectInteractor(squeezeEffectRepository = fakeSqueezeEffectRepository),
                    SqueezeEffectInteractor(
                        squeezeEffectRepository = fakeSqueezeEffectRepository,
                        keyEventInteractor = KeyEventInteractor(fakeKeyEventRepository),
                        coroutineContext = testScope.testScheduler,
                    ),
                appZoomOutOptional = Optional.empty(),
                notificationShadeWindowController = kosmos.notificationShadeWindowController,
                topUiController = kosmos.topUiController,
@@ -119,6 +122,7 @@ class TopLevelWindowEffectsTest : SysuiTestCase() {
            fakeSqueezeEffectRepository.isSqueezeEffectEnabled.value = true
            fakeSqueezeEffectRepository.invocationEffectInitialDelayMs = expectedDelay
            fakeKeyEventRepository.setPowerButtonDown(true)
            fakeSqueezeEffectRepository.isPowerButtonDownInKeyCombination.value = false

            underTest.start()

@@ -135,6 +139,7 @@ class TopLevelWindowEffectsTest : SysuiTestCase() {
            fakeSqueezeEffectRepository.isSqueezeEffectEnabled.value = true
            fakeSqueezeEffectRepository.invocationEffectInitialDelayMs = expectedDelay
            fakeKeyEventRepository.setPowerButtonDown(true)
            fakeSqueezeEffectRepository.isPowerButtonDownInKeyCombination.value = false

            underTest.start()

@@ -151,6 +156,7 @@ class TopLevelWindowEffectsTest : SysuiTestCase() {
            fakeSqueezeEffectRepository.isSqueezeEffectEnabled.value = true
            fakeSqueezeEffectRepository.invocationEffectInitialDelayMs = expectedDelay
            fakeKeyEventRepository.setPowerButtonDown(true)
            fakeSqueezeEffectRepository.isPowerButtonDownInKeyCombination.value = false

            underTest.start()

@@ -171,6 +177,7 @@ class TopLevelWindowEffectsTest : SysuiTestCase() {
            fakeSqueezeEffectRepository.isSqueezeEffectEnabled.value = true
            fakeSqueezeEffectRepository.invocationEffectInitialDelayMs = expectedDelay
            fakeKeyEventRepository.setPowerButtonDown(true)
            fakeSqueezeEffectRepository.isPowerButtonDownInKeyCombination.value = false

            underTest.start()

@@ -192,6 +199,7 @@ class TopLevelWindowEffectsTest : SysuiTestCase() {
            fakeSqueezeEffectRepository.isSqueezeEffectEnabled.value = true
            fakeSqueezeEffectRepository.invocationEffectInitialDelayMs = expectedDelay
            fakeKeyEventRepository.setPowerButtonDown(true)
            fakeSqueezeEffectRepository.isPowerButtonDownInKeyCombination.value = false

            underTest.start()

@@ -213,6 +221,7 @@ class TopLevelWindowEffectsTest : SysuiTestCase() {
            fakeSqueezeEffectRepository.isSqueezeEffectEnabled.value = true
            fakeSqueezeEffectRepository.invocationEffectInitialDelayMs = expectedDelay
            fakeKeyEventRepository.setPowerButtonDown(true)
            fakeSqueezeEffectRepository.isPowerButtonDownInKeyCombination.value = false

            underTest.start()

@@ -226,6 +235,24 @@ class TopLevelWindowEffectsTest : SysuiTestCase() {
            verifyAddViewAndTopUi(never())
        }

    @Test
    fun testNoWindowAddedIfPowerKeyInMultipleKeyCombination() {
        kosmos.runTest {
            val expectedDelay =
                DEFAULT_INITIAL_DELAY_MILLIS + 750 - DEFAULT_LONG_PRESS_POWER_DURATION_MILLIS
            fakeSqueezeEffectRepository.isSqueezeEffectEnabled.value = true
            fakeSqueezeEffectRepository.invocationEffectInitialDelayMs = expectedDelay
            fakeKeyEventRepository.setPowerButtonDown(true)
            fakeSqueezeEffectRepository.isPowerButtonDownInKeyCombination.value = true

            underTest.start()

            advanceTime((expectedDelay + 1).milliseconds)

            verify(windowManager, never()).addView(any<View>(), any<WindowManager.LayoutParams>())
        }
    }

    private fun verifyAddViewAndTopUi(mode: VerificationMode) {
        verify(windowManager, mode).addView(any<View>(), any<WindowManager.LayoutParams>())
        if (TopUiControllerRefactor.isEnabled) {
+8 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.topwindoweffects.data.repository

import android.hardware.input.InputManager
import android.os.Bundle
import android.os.Handler
import android.platform.test.annotations.DisableFlags
@@ -32,6 +33,8 @@ import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.shared.Flags
import com.android.systemui.testKosmos
import com.android.systemui.topwindoweffects.data.repository.SqueezeEffectRepositoryImpl.Companion.IS_INVOCATION_EFFECT_ENABLED_KEY
import com.android.systemui.topwindoweffects.data.repository.SqueezeEffectRepositoryImpl.Companion.SET_INVOCATION_EFFECT_PARAMETERS_ACTION
import com.android.systemui.util.settings.FakeGlobalSettings
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.StandardTestDispatcher
@@ -55,13 +58,16 @@ class SqueezeEffectRepositoryTest : SysuiTestCase() {
    private val globalSettings = FakeGlobalSettings(StandardTestDispatcher())

    @Mock private lateinit var bgHandler: Handler
    @Mock private lateinit var inputManager: InputManager

    private val Kosmos.underTest by
        Kosmos.Fixture {
            SqueezeEffectRepositoryImpl(
                context = mContext,
                bgHandler = bgHandler,
                bgCoroutineContext = testScope.testScheduler,
                handler = bgHandler,
                coroutineContext = testScope.testScheduler,
                executor = Runnable::run,
                inputManager = inputManager,
                globalSettings = globalSettings,
            )
        }
+36 −6
Original line number Diff line number Diff line
@@ -19,9 +19,12 @@ package com.android.systemui.topwindoweffects.domain.interactor
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.keyevent.data.repository.fakeKeyEventRepository
import com.android.systemui.keyevent.domain.interactor.KeyEventInteractor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.testKosmos
import com.android.systemui.topwindoweffects.data.repository.fakeSqueezeEffectRepository
@@ -35,9 +38,12 @@ class SqueezeEffectInteractorTest : SysuiTestCase() {

    private val kosmos = testKosmos().useUnconfinedTestDispatcher()

    private val Kosmos.underTest by Kosmos.Fixture {
    private val Kosmos.underTest by
        Kosmos.Fixture {
            SqueezeEffectInteractor(
            squeezeEffectRepository = fakeSqueezeEffectRepository
                squeezeEffectRepository = fakeSqueezeEffectRepository,
                keyEventInteractor = KeyEventInteractor(fakeKeyEventRepository),
                coroutineContext = testScope.testScheduler,
            )
        }

@@ -60,4 +66,28 @@ class SqueezeEffectInteractorTest : SysuiTestCase() {

            assertThat(isSqueezeEffectEnabled).isTrue()
        }

    @Test
    fun testPowerKeyInKeyCombination_powerKeyNotDownAsSingleGesture() =
        kosmos.runTest {
            fakeSqueezeEffectRepository.isPowerButtonDownInKeyCombination.value = true
            fakeKeyEventRepository.setPowerButtonDown(true)

            val isPowerButtonDownAsSingleKeyGesture by
                collectLastValue(underTest.isPowerButtonDownAsSingleKeyGesture)

            assertThat(isPowerButtonDownAsSingleKeyGesture).isFalse()
        }

    @Test
    fun testPowerKeyNotInKeyCombination_powerKeyDownAsSingleGesture() =
        kosmos.runTest {
            fakeSqueezeEffectRepository.isPowerButtonDownInKeyCombination.value = false
            fakeKeyEventRepository.setPowerButtonDown(true)

            val isPowerButtonDownAsSingleKeyGesture by
                collectLastValue(underTest.isPowerButtonDownAsSingleKeyGesture)

            assertThat(isPowerButtonDownAsSingleKeyGesture).isTrue()
        }
}
+3 −6
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import com.android.systemui.CoreStartable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.keyevent.domain.interactor.KeyEventInteractor
import com.android.systemui.statusbar.NotificationShadeWindowController
import com.android.systemui.topui.TopUiController
import com.android.systemui.topui.TopUiControllerRefactor
@@ -56,7 +55,6 @@ constructor(
    @TopLevelWindowEffectsThread private val topLevelWindowEffectsScope: CoroutineScope,
    private val windowManager: WindowManager,
    private val squeezeEffectInteractor: SqueezeEffectInteractor,
    private val keyEventInteractor: KeyEventInteractor,
    private val viewModelFactory: SqueezeEffectViewModel.Factory,
    // TODO(b/409930584): make AppZoomOut non-optional
    private val appZoomOutOptional: Optional<AppZoomOut>,
@@ -71,7 +69,8 @@ constructor(
        topLevelWindowEffectsScope.launch {
            squeezeEffectInteractor.isSqueezeEffectEnabled.collectLatest { enabled ->
                if (enabled) {
                    keyEventInteractor.isPowerButtonDown.collectLatest { down ->
                    squeezeEffectInteractor.isPowerButtonDownAsSingleKeyGesture.collectLatest { down
                        ->
                        if (down) {
                            val roundedCornerInfo =
                                squeezeEffectInteractor.getRoundedCornersResourceId()
@@ -126,9 +125,7 @@ constructor(
        if (TopUiControllerRefactor.isEnabled) {
            topUiController.setRequestTopUi(false, TAG)
        } else {
            runOnMainThread {
                notificationShadeWindowController.setRequestTopUi(false, TAG)
            }
            runOnMainThread { notificationShadeWindowController.setRequestTopUi(false, TAG) }
        }
    }

+47 −17
Original line number Diff line number Diff line
@@ -16,21 +16,25 @@

package com.android.systemui.topwindoweffects.dagger

import android.os.Handler
import android.os.Looper
import com.android.systemui.CoreStartable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.shared.Flags.enableLppAssistInvocationEffect
import com.android.systemui.topwindoweffects.TopLevelWindowEffects
import dagger.Binds
import com.android.systemui.topwindoweffects.qualifiers.TopLevelWindowEffectsThread
import dagger.Module
import dagger.Provides
import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap
import java.util.concurrent.Executor
import kotlin.coroutines.CoroutineContext
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.asCoroutineDispatcher

@Module
interface TopLevelWindowEffectsModule {

    @Binds fun bindTopLevelWindowEffectsCoreStartable(impl: TopLevelWindowEffects): CoreStartable

    companion object {
object TopLevelWindowEffectsModule {

    @Provides
    @IntoMap
@@ -44,5 +48,31 @@ interface TopLevelWindowEffectsModule {
            }
        }
    }
    }

    @Provides
    @SysUISingleton
    @TopLevelWindowEffectsThread
    fun provideTopLevelWindowEffectsHandler(@TopLevelWindowEffectsThread looper: Looper): Handler =
        Handler(looper)

    @Provides
    @SysUISingleton
    @TopLevelWindowEffectsThread
    fun provideTopLevelWindowEffectsScope(
        @TopLevelWindowEffectsThread dispatcher: CoroutineDispatcher
    ): CoroutineScope = CoroutineScope(dispatcher)

    @Provides
    @SysUISingleton
    @TopLevelWindowEffectsThread
    fun provideTopLevelWindowEffectsDispatcher(
        @TopLevelWindowEffectsThread executor: Executor
    ): CoroutineDispatcher = executor.asCoroutineDispatcher()

    @Provides
    @SysUISingleton
    @TopLevelWindowEffectsThread
    fun provideTopLevelWindowEffectsContext(
        @TopLevelWindowEffectsThread dispatcher: CoroutineDispatcher
    ): CoroutineContext = dispatcher
}
Loading