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

Commit 3ccd6578 authored by Nicolo' Mazzucato's avatar Nicolo' Mazzucato Committed by Nicolò Mazzucato
Browse files

Move logic to move the shade to the default display once locked to ShadeDisplaysRepository

+ MutableShadeDisplaysRepository deleted, it was not needed anymore after recent refactors
+ Moves logic to put the shade window back to the default display once locking the device to the repository (as opposed to StatusBarTouchShadeDisplayPolicy). This allows to have several policies sharing the same logic.
+ Introduce FakeShadeDisplayPolicy for testing

Bug: 362719719
Bug: 380444270
Test: ShadeDisplaysRepositoryTest, ShadePrimaryDisplayCommandTest, StatusBarTouchShadeDisplayPolicyTest
Flag: com.android.systemui.shade_window_goes_around
Change-Id: I6d108fbdac3060a5e6862634a5a1fc0bd4c14919
parent 574ce485
Loading
Loading
Loading
Loading
+45 −11
Original line number Diff line number Diff line
@@ -17,15 +17,21 @@
package com.android.systemui.shade.data.repository

import android.provider.Settings.Global.DEVELOPMENT_SHADE_DISPLAY_AWARENESS
import android.view.Display
import android.view.Display.TYPE_EXTERNAL
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectValues
import com.android.systemui.display.data.repository.display
import com.android.systemui.display.data.repository.displayRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.shade.display.AnyExternalShadeDisplayPolicy
import com.android.systemui.shade.display.DefaultDisplayShadePolicy
import com.android.systemui.shade.display.FakeShadeDisplayPolicy
import com.android.systemui.shade.display.StatusBarTouchShadeDisplayPolicy
import com.android.systemui.testKosmos
import com.android.systemui.util.settings.fakeGlobalSettings
@@ -37,24 +43,28 @@ import org.junit.runner.RunWith
@SmallTest
@RunWith(AndroidJUnit4::class)
class ShadeDisplaysRepositoryTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val kosmos = testKosmos().useUnconfinedTestDispatcher()
    private val testScope = kosmos.testScope
    private val globalSettings = kosmos.fakeGlobalSettings
    private val displayRepository = kosmos.displayRepository
    private val defaultPolicy = DefaultDisplayShadePolicy()
    private val policies = kosmos.shadeDisplayPolicies
    private val keyguardRepository = kosmos.fakeKeyguardRepository

    private val underTest =
    private fun createUnderTest(shadeOnDefaultDisplayWhenLocked: Boolean = false) =
        ShadeDisplaysRepositoryImpl(
            globalSettings,
            defaultPolicy,
            testScope.backgroundScope,
            policies,
            shadeOnDefaultDisplayWhenLocked = shadeOnDefaultDisplayWhenLocked,
            keyguardRepository,
        )

    @Test
    fun policy_changing_propagatedFromTheLatestPolicy() =
        testScope.runTest {
            val underTest = createUnderTest()
            val displayIds by collectValues(underTest.displayId)

            assertThat(displayIds).containsExactly(0)
@@ -81,30 +91,54 @@ class ShadeDisplaysRepositoryTest : SysuiTestCase() {
    @Test
    fun policy_updatesBasedOnSettingValue_defaultDisplay() =
        testScope.runTest {
            val policy by collectLastValue(underTest.policy)

            val underTest = createUnderTest()
            globalSettings.putString(DEVELOPMENT_SHADE_DISPLAY_AWARENESS, "default_display")

            assertThat(policy).isInstanceOf(DefaultDisplayShadePolicy::class.java)
            assertThat(underTest.currentPolicy).isInstanceOf(DefaultDisplayShadePolicy::class.java)
        }

    @Test
    fun policy_updatesBasedOnSettingValue_anyExternal() =
        testScope.runTest {
            val policy by collectLastValue(underTest.policy)

            val underTest = createUnderTest()
            globalSettings.putString(DEVELOPMENT_SHADE_DISPLAY_AWARENESS, "any_external_display")

            assertThat(policy).isInstanceOf(AnyExternalShadeDisplayPolicy::class.java)
            assertThat(underTest.currentPolicy)
                .isInstanceOf(AnyExternalShadeDisplayPolicy::class.java)
        }

    @Test
    fun policy_updatesBasedOnSettingValue_focusBased() =
        testScope.runTest {
            val policy by collectLastValue(underTest.policy)

            val underTest = createUnderTest()
            globalSettings.putString(DEVELOPMENT_SHADE_DISPLAY_AWARENESS, "status_bar_latest_touch")

            assertThat(policy).isInstanceOf(StatusBarTouchShadeDisplayPolicy::class.java)
            assertThat(underTest.currentPolicy)
                .isInstanceOf(StatusBarTouchShadeDisplayPolicy::class.java)
        }

    @Test
    fun displayId_afterKeyguardHides_goesBackToPreviousDisplay() =
        testScope.runTest {
            val underTest = createUnderTest(shadeOnDefaultDisplayWhenLocked = true)
            globalSettings.putString(
                DEVELOPMENT_SHADE_DISPLAY_AWARENESS,
                FakeShadeDisplayPolicy.name,
            )

            val displayId by collectLastValue(underTest.displayId)

            displayRepository.addDisplays(display(id = 2, type = TYPE_EXTERNAL))
            FakeShadeDisplayPolicy.setDisplayId(2)

            assertThat(displayId).isEqualTo(2)

            keyguardRepository.setKeyguardShowing(true)

            assertThat(displayId).isEqualTo(Display.DEFAULT_DISPLAY)

            keyguardRepository.setKeyguardShowing(false)

            assertThat(displayId).isEqualTo(2)
        }
}
+3 −16
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ import com.android.systemui.display.data.repository.displayRepository
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.shade.ShadePrimaryDisplayCommand
import com.android.systemui.shade.display.ShadeDisplayPolicy
import com.android.systemui.shade.display.FakeShadeDisplayPolicy
import com.android.systemui.statusbar.commandline.commandRegistry
import com.android.systemui.testKosmos
import com.android.systemui.util.settings.fakeGlobalSettings
@@ -33,8 +33,6 @@ import com.google.common.truth.StringSubject
import com.google.common.truth.Truth.assertThat
import java.io.PrintWriter
import java.io.StringWriter
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
@@ -118,22 +116,11 @@ class ShadePrimaryDisplayCommandTest : SysuiTestCase() {
    @Test
    fun policies_setsNewPolicy() =
        testScope.runTest {
            val policy by collectLastValue(shadeDisplaysRepository.policy)
            val newPolicy = policies.last().name
            val newPolicy = FakeShadeDisplayPolicy.name

            commandRegistry.onShellCommand(pw, arrayOf("shade_display_override", newPolicy))

            assertThat(policy!!.name).isEqualTo(newPolicy)
        }

    private fun makePolicy(policyName: String): ShadeDisplayPolicy {
        return object : ShadeDisplayPolicy {
            override val name: String
                get() = policyName

            override val displayId: StateFlow<Int>
                get() = MutableStateFlow(0)
        }
            assertThat(shadeDisplaysRepository.currentPolicy.name).isEqualTo(newPolicy)
        }
}

+2 −63
Original line number Diff line number Diff line
@@ -26,12 +26,11 @@ import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectValues
import com.android.systemui.display.data.repository.display
import com.android.systemui.display.data.repository.displayRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.shade.data.repository.statusBarTouchShadeDisplayPolicy
import com.android.systemui.shade.domain.interactor.notificationElement
import com.android.systemui.shade.domain.interactor.qsElement
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlin.test.Test
@@ -45,22 +44,9 @@ import org.mockito.kotlin.mock
class StatusBarTouchShadeDisplayPolicyTest : SysuiTestCase() {
    private val kosmos = testKosmos().useUnconfinedTestDispatcher()
    private val testScope = kosmos.testScope
    private val keyguardRepository = kosmos.fakeKeyguardRepository
    private val displayRepository = kosmos.displayRepository

    private fun createUnderTest(
        shadeOnDefaultDisplayWhenLocked: Boolean = false
    ): StatusBarTouchShadeDisplayPolicy {
        return StatusBarTouchShadeDisplayPolicy(
            displayRepository,
            keyguardRepository,
            testScope.backgroundScope,
            shadeOnDefaultDisplayWhenLocked = shadeOnDefaultDisplayWhenLocked,
            shadeInteractor = { kosmos.shadeInteractor },
            { kosmos.qsElement },
            { kosmos.notificationElement },
        )
    }
    private val underTest = kosmos.statusBarTouchShadeDisplayPolicy

    private fun createMotionEventForDisplay(displayId: Int, xCoordinate: Float = 0f): MotionEvent {
        return mock<MotionEvent> {
@@ -71,15 +57,12 @@ class StatusBarTouchShadeDisplayPolicyTest : SysuiTestCase() {

    @Test
    fun displayId_defaultToDefaultDisplay() {
        val underTest = createUnderTest()

        assertThat(underTest.displayId.value).isEqualTo(Display.DEFAULT_DISPLAY)
    }

    @Test
    fun onStatusBarTouched_called_updatesDisplayId() =
        testScope.runTest {
            val underTest = createUnderTest()
            val displayId by collectLastValue(underTest.displayId)

            displayRepository.addDisplays(display(id = 2, type = TYPE_EXTERNAL))
@@ -91,7 +74,6 @@ class StatusBarTouchShadeDisplayPolicyTest : SysuiTestCase() {
    @Test
    fun onStatusBarTouched_notExistentDisplay_displayIdNotUpdated() =
        testScope.runTest {
            val underTest = createUnderTest()
            val displayIds by collectValues(underTest.displayId)
            assertThat(displayIds).isEqualTo(listOf(Display.DEFAULT_DISPLAY))

@@ -104,7 +86,6 @@ class StatusBarTouchShadeDisplayPolicyTest : SysuiTestCase() {
    @Test
    fun onStatusBarTouched_afterDisplayRemoved_goesBackToDefaultDisplay() =
        testScope.runTest {
            val underTest = createUnderTest()
            val displayId by collectLastValue(underTest.displayId)

            displayRepository.addDisplays(display(id = 2, type = TYPE_EXTERNAL))
@@ -117,47 +98,9 @@ class StatusBarTouchShadeDisplayPolicyTest : SysuiTestCase() {
            assertThat(displayId).isEqualTo(Display.DEFAULT_DISPLAY)
        }

    @Test
    fun onStatusBarTouched_afterKeyguardVisible_goesBackToDefaultDisplay() =
        testScope.runTest {
            val underTest = createUnderTest(shadeOnDefaultDisplayWhenLocked = true)
            val displayId by collectLastValue(underTest.displayId)

            displayRepository.addDisplays(display(id = 2, type = TYPE_EXTERNAL))
            underTest.onStatusBarTouched(createMotionEventForDisplay(2), STATUS_BAR_WIDTH)

            assertThat(displayId).isEqualTo(2)

            keyguardRepository.setKeyguardShowing(true)

            assertThat(displayId).isEqualTo(Display.DEFAULT_DISPLAY)
        }

    @Test
    fun onStatusBarTouched_afterKeyguardHides_goesBackToPreviousDisplay() =
        testScope.runTest {
            val underTest = createUnderTest(shadeOnDefaultDisplayWhenLocked = true)
            val displayId by collectLastValue(underTest.displayId)

            displayRepository.addDisplays(display(id = 2, type = TYPE_EXTERNAL))
            underTest.onStatusBarTouched(createMotionEventForDisplay(2), STATUS_BAR_WIDTH)

            assertThat(displayId).isEqualTo(2)

            keyguardRepository.setKeyguardShowing(true)

            assertThat(displayId).isEqualTo(Display.DEFAULT_DISPLAY)

            keyguardRepository.setKeyguardShowing(false)

            assertThat(displayId).isEqualTo(2)
        }

    @Test
    fun onStatusBarTouched_leftSide_intentSetToNotifications() =
        testScope.runTest {
            val underTest = createUnderTest(shadeOnDefaultDisplayWhenLocked = true)

            underTest.onStatusBarTouched(
                createMotionEventForDisplay(2, STATUS_BAR_WIDTH * 0.1f),
                STATUS_BAR_WIDTH,
@@ -169,8 +112,6 @@ class StatusBarTouchShadeDisplayPolicyTest : SysuiTestCase() {
    @Test
    fun onStatusBarTouched_rightSide_intentSetToQs() =
        testScope.runTest {
            val underTest = createUnderTest(shadeOnDefaultDisplayWhenLocked = true)

            underTest.onStatusBarTouched(
                createMotionEventForDisplay(2, STATUS_BAR_WIDTH * 0.95f),
                STATUS_BAR_WIDTH,
@@ -182,8 +123,6 @@ class StatusBarTouchShadeDisplayPolicyTest : SysuiTestCase() {
    @Test
    fun onStatusBarTouched_nullAfterConsumed() =
        testScope.runTest {
            val underTest = createUnderTest(shadeOnDefaultDisplayWhenLocked = true)

            underTest.onStatusBarTouched(
                createMotionEventForDisplay(2, STATUS_BAR_WIDTH * 0.1f),
                STATUS_BAR_WIDTH,
+0 −10
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@ import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.res.R
import com.android.systemui.scene.ui.view.WindowRootView
import com.android.systemui.shade.data.repository.MutableShadeDisplaysRepository
import com.android.systemui.shade.data.repository.ShadeDisplaysRepository
import com.android.systemui.shade.data.repository.ShadeDisplaysRepositoryImpl
import com.android.systemui.shade.display.ShadeDisplayPolicyModule
@@ -211,15 +210,6 @@ object ShadeDisplayAwareModule {
        return impl
    }

    @SysUISingleton
    @Provides
    fun provideMutableShadePositionRepository(
        impl: ShadeDisplaysRepositoryImpl
    ): MutableShadeDisplaysRepository {
        ShadeWindowGoesAround.isUnexpectedlyInLegacyMode()
        return impl
    }

    @Provides
    @SysUISingleton
    fun provideShadeDialogContextInteractor(
+3 −3
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@ import android.provider.Settings.Global.DEVELOPMENT_SHADE_DISPLAY_AWARENESS
import com.android.systemui.CoreStartable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.display.data.repository.DisplayRepository
import com.android.systemui.shade.data.repository.MutableShadeDisplaysRepository
import com.android.systemui.shade.data.repository.ShadeDisplaysRepository
import com.android.systemui.shade.display.ShadeDisplayPolicy
import com.android.systemui.statusbar.commandline.Command
import com.android.systemui.statusbar.commandline.CommandRegistry
@@ -35,7 +35,7 @@ constructor(
    private val globalSettings: GlobalSettings,
    private val commandRegistry: CommandRegistry,
    private val displaysRepository: DisplayRepository,
    private val positionRepository: MutableShadeDisplaysRepository,
    private val positionRepository: ShadeDisplaysRepository,
    private val policies: Set<@JvmSuppressWildcards ShadeDisplayPolicy>,
    private val defaultPolicy: ShadeDisplayPolicy,
) : Command, CoreStartable {
@@ -103,7 +103,7 @@ constructor(
        }

        private fun printPolicies() {
            val currentPolicyName = positionRepository.policy.value.name
            val currentPolicyName = positionRepository.currentPolicy.name
            pw.println("Available policies: ")
            policies.forEach {
                pw.print(" - ${it.name}")
Loading