summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2025-01-23 03:55:36 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-01-23 03:55:36 -0800
commit934dd3a267c4f99ef9ae2bd99aa22fac637310d6 (patch)
tree94130c3a3a211ca51f9f107ba55a2634ae363503
parent3f30ce082348d0c9d3a728bb69ac8afda4624e94 (diff)
parent3ccd65789b65089740364d393a6690b007cb4367 (diff)
Merge "Move logic to move the shade to the default display once locked to ShadeDisplaysRepository" into main
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadeDisplaysRepositoryTest.kt56
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadePrimaryDisplayCommandTest.kt19
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicyTest.kt65
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt10
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/ShadePrimaryDisplayCommand.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/data/repository/FakeShadeDisplayRepository.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeDisplaysRepository.kt48
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/display/FakeShadeDisplayPolicy.kt36
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicy.kt22
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/ShadeDisplaysRepositoryKosmos.kt8
10 files changed, 135 insertions, 142 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadeDisplaysRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadeDisplaysRepositoryTest.kt
index 007a0fb87953..4f332d4bbed8 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadeDisplaysRepositoryTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadeDisplaysRepositoryTest.kt
@@ -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)
}
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadePrimaryDisplayCommandTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadePrimaryDisplayCommandTest.kt
index eeb3e6b31c69..fd6bc98b006c 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadePrimaryDisplayCommandTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadePrimaryDisplayCommandTest.kt
@@ -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,23 +116,12 @@ 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)
+ assertThat(shadeDisplaysRepository.currentPolicy.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)
- }
- }
}
private fun StringSubject.containsAllIn(strings: List<String>) {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicyTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicyTest.kt
index 20dfd3e11947..e43c46b36a06 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicyTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicyTest.kt
@@ -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))
@@ -118,46 +99,8 @@ class StatusBarTouchShadeDisplayPolicyTest : SysuiTestCase() {
}
@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,
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt
index 747642097327..f926d39760fe 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt
@@ -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(
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadePrimaryDisplayCommand.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadePrimaryDisplayCommand.kt
index 7bfe40c3d811..173da336c62f 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadePrimaryDisplayCommand.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadePrimaryDisplayCommand.kt
@@ -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}")
diff --git a/packages/SystemUI/src/com/android/systemui/shade/data/repository/FakeShadeDisplayRepository.kt b/packages/SystemUI/src/com/android/systemui/shade/data/repository/FakeShadeDisplayRepository.kt
index 732d4d1500e7..3513334f2a5c 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/data/repository/FakeShadeDisplayRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/data/repository/FakeShadeDisplayRepository.kt
@@ -17,6 +17,8 @@
package com.android.systemui.shade.data.repository
import android.view.Display
+import com.android.systemui.shade.display.FakeShadeDisplayPolicy
+import com.android.systemui.shade.display.ShadeDisplayPolicy
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@@ -30,7 +32,6 @@ class FakeShadeDisplayRepository : ShadeDisplaysRepository {
override val displayId: StateFlow<Int>
get() = _displayId
- fun resetDisplayId() {
- _displayId.value = Display.DEFAULT_DISPLAY
- }
+ override val currentPolicy: ShadeDisplayPolicy
+ get() = FakeShadeDisplayPolicy
}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeDisplaysRepository.kt b/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeDisplaysRepository.kt
index af48231e0a99..f959f7fe0c31 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeDisplaysRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeDisplaysRepository.kt
@@ -20,14 +20,18 @@ import android.provider.Settings.Global.DEVELOPMENT_SHADE_DISPLAY_AWARENESS
import android.view.Display
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
+import com.android.systemui.keyguard.data.repository.KeyguardRepository
+import com.android.systemui.shade.ShadeOnDefaultDisplayWhenLocked
import com.android.systemui.shade.display.ShadeDisplayPolicy
import com.android.systemui.util.settings.GlobalSettings
import com.android.systemui.util.settings.SettingsProxyExt.observerFlow
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.map
@@ -38,12 +42,8 @@ import kotlinx.coroutines.flow.stateIn
interface ShadeDisplaysRepository {
/** ID of the display which currently hosts the shade */
val displayId: StateFlow<Int>
-}
-
-/** Allows to change the policy that determines in which display the Shade window is visible. */
-interface MutableShadeDisplaysRepository : ShadeDisplaysRepository {
- /** Updates the policy to select where the shade is visible. */
- val policy: StateFlow<ShadeDisplayPolicy>
+ /** The current policy set. */
+ val currentPolicy: ShadeDisplayPolicy
}
/** Keeps the policy and propagates the display id for the shade from it. */
@@ -56,9 +56,11 @@ constructor(
defaultPolicy: ShadeDisplayPolicy,
@Background bgScope: CoroutineScope,
policies: Set<@JvmSuppressWildcards ShadeDisplayPolicy>,
-) : MutableShadeDisplaysRepository {
+ @ShadeOnDefaultDisplayWhenLocked private val shadeOnDefaultDisplayWhenLocked: Boolean,
+ keyguardRepository: KeyguardRepository,
+) : ShadeDisplaysRepository {
- override val policy: StateFlow<ShadeDisplayPolicy> =
+ private val policy: StateFlow<ShadeDisplayPolicy> =
globalSettings
.observerFlow(DEVELOPMENT_SHADE_DISPLAY_AWARENESS)
.onStart { emit(Unit) }
@@ -71,10 +73,32 @@ constructor(
return@map defaultPolicy
}
.distinctUntilChanged()
- .stateIn(bgScope, SharingStarted.WhileSubscribed(), defaultPolicy)
+ .stateIn(bgScope, SharingStarted.Eagerly, defaultPolicy)
+
+ private val displayIdFromPolicy: Flow<Int> = policy.flatMapLatest { it.displayId }
+
+ private val keyguardAwareDisplayPolicy: Flow<Int> =
+ if (!shadeOnDefaultDisplayWhenLocked) {
+ displayIdFromPolicy
+ } else {
+ keyguardRepository.isKeyguardShowing.combine(displayIdFromPolicy) {
+ isKeyguardShowing,
+ currentDisplayId ->
+ if (isKeyguardShowing) {
+ Display.DEFAULT_DISPLAY
+ } else {
+ currentDisplayId
+ }
+ }
+ }
+
+ override val currentPolicy: ShadeDisplayPolicy
+ get() = policy.value
override val displayId: StateFlow<Int> =
- policy
- .flatMapLatest { it.displayId }
- .stateIn(bgScope, SharingStarted.WhileSubscribed(), Display.DEFAULT_DISPLAY)
+ keyguardAwareDisplayPolicy.stateIn(
+ bgScope,
+ SharingStarted.WhileSubscribed(),
+ Display.DEFAULT_DISPLAY,
+ )
}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/display/FakeShadeDisplayPolicy.kt b/packages/SystemUI/src/com/android/systemui/shade/display/FakeShadeDisplayPolicy.kt
new file mode 100644
index 000000000000..e010bd6f9880
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/shade/display/FakeShadeDisplayPolicy.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.shade.display
+
+import android.view.Display
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+
+/** Used only for testing. */
+object FakeShadeDisplayPolicy : ShadeDisplayPolicy {
+ override val name: String
+ get() = "fake_shade_policy"
+
+ override val displayId: StateFlow<Int>
+ get() = _displayId
+
+ private val _displayId = MutableStateFlow(Display.DEFAULT_DISPLAY)
+
+ fun setDisplayId(displayId: Int) {
+ _displayId.value = displayId
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicy.kt b/packages/SystemUI/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicy.kt
index 91020aa7bdb0..b155ada87efd 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicy.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/display/StatusBarTouchShadeDisplayPolicy.kt
@@ -23,8 +23,6 @@ import com.android.app.tracing.coroutines.launchTraced
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.display.data.repository.DisplayRepository
-import com.android.systemui.keyguard.data.repository.KeyguardRepository
-import com.android.systemui.shade.ShadeOnDefaultDisplayWhenLocked
import com.android.systemui.shade.domain.interactor.NotificationShadeElement
import com.android.systemui.shade.domain.interactor.QSShadeElement
import com.android.systemui.shade.domain.interactor.ShadeExpandedStateInteractor.ShadeElement
@@ -38,13 +36,10 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.collectLatest
-import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.stateIn
/**
* Moves the shade on the last display that received a status bar touch.
@@ -57,9 +52,7 @@ class StatusBarTouchShadeDisplayPolicy
@Inject
constructor(
displayRepository: DisplayRepository,
- keyguardRepository: KeyguardRepository,
@Background private val backgroundScope: CoroutineScope,
- @ShadeOnDefaultDisplayWhenLocked private val shadeOnDefaultDisplayWhenLocked: Boolean,
private val shadeInteractor: Lazy<ShadeInteractor>,
private val qsShadeElement: Lazy<QSShadeElement>,
private val notificationElement: Lazy<NotificationShadeElement>,
@@ -72,20 +65,7 @@ constructor(
private var latestIntent = AtomicReference<ShadeElement?>()
private var timeoutJob: Job? = null
- override val displayId: StateFlow<Int> =
- if (shadeOnDefaultDisplayWhenLocked) {
- keyguardRepository.isKeyguardShowing
- .combine(currentDisplayId) { isKeyguardShowing, currentDisplayId ->
- if (isKeyguardShowing) {
- Display.DEFAULT_DISPLAY
- } else {
- currentDisplayId
- }
- }
- .stateIn(backgroundScope, SharingStarted.WhileSubscribed(), currentDisplayId.value)
- } else {
- currentDisplayId
- }
+ override val displayId: StateFlow<Int> = currentDisplayId
private var removalListener: Job? = null
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/ShadeDisplaysRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/ShadeDisplaysRepositoryKosmos.kt
index aaef27d257c5..4d718744320d 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/ShadeDisplaysRepositoryKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/ShadeDisplaysRepositoryKosmos.kt
@@ -22,6 +22,7 @@ import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.testScope
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.ShadeDisplayPolicy
import com.android.systemui.shade.display.ShadeExpansionIntent
import com.android.systemui.shade.display.StatusBarTouchShadeDisplayPolicy
@@ -46,8 +47,6 @@ val Kosmos.statusBarTouchShadeDisplayPolicy: StatusBarTouchShadeDisplayPolicy by
StatusBarTouchShadeDisplayPolicy(
displayRepository = displayRepository,
backgroundScope = testScope.backgroundScope,
- keyguardRepository = keyguardRepository,
- shadeOnDefaultDisplayWhenLocked = false,
shadeInteractor = { shadeInteractor },
notificationElement = { notificationElement },
qsShadeElement = { qsElement },
@@ -55,13 +54,15 @@ val Kosmos.statusBarTouchShadeDisplayPolicy: StatusBarTouchShadeDisplayPolicy by
}
val Kosmos.shadeExpansionIntent: ShadeExpansionIntent by
Kosmos.Fixture { statusBarTouchShadeDisplayPolicy }
-val Kosmos.shadeDisplaysRepository: MutableShadeDisplaysRepository by
+val Kosmos.shadeDisplaysRepository: ShadeDisplaysRepository by
Kosmos.Fixture {
ShadeDisplaysRepositoryImpl(
bgScope = testScope.backgroundScope,
globalSettings = fakeGlobalSettings,
policies = shadeDisplayPolicies,
defaultPolicy = defaultShadeDisplayPolicy,
+ shadeOnDefaultDisplayWhenLocked = true,
+ keyguardRepository = keyguardRepository,
)
}
@@ -71,6 +72,7 @@ val Kosmos.shadeDisplayPolicies: Set<ShadeDisplayPolicy> by
defaultShadeDisplayPolicy,
anyExternalShadeDisplayPolicy,
statusBarTouchShadeDisplayPolicy,
+ FakeShadeDisplayPolicy,
)
}