diff options
| author | 2025-01-21 21:08:41 +0000 | |
|---|---|---|
| committer | 2025-01-23 01:37:55 -0800 | |
| commit | 62cf80b3df40a8713a33ed81894839d7828543fe (patch) | |
| tree | 1d6486df1a0016e5b2b922b81a6d860006a59b1c | |
| parent | 3ccd65789b65089740364d393a6690b007cb4367 (diff) | |
Add focus based shade display policy
This policy just propagates FocusedDisplayRepository as ShadeDisplayPolicy
Bug: 362719719
Bug: 380444270
Test: FocusShadeDisplayPolicyTest
Flag: com.android.systemui.shade_window_goes_around
Change-Id: Ia8e1cbd8a751e274e6effa10271bc8dca6cd802e
6 files changed, 120 insertions, 20 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/TakeScreenshotExecutorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/TakeScreenshotExecutorTest.kt index 27e9f07af168..3d5daf6cf9c2 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/TakeScreenshotExecutorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/TakeScreenshotExecutorTest.kt @@ -318,7 +318,7 @@ class TakeScreenshotExecutorTest : SysuiTestCase() { val displayId = 1 setDisplays(display(TYPE_INTERNAL, id = 0), display(TYPE_EXTERNAL, id = displayId)) val onSaved = { _: Uri? -> } - focusedDisplayRepository.emit(displayId) + focusedDisplayRepository.setDisplayId(displayId) screenshotExecutor.executeScreenshots( createScreenshotRequest( @@ -345,7 +345,7 @@ class TakeScreenshotExecutorTest : SysuiTestCase() { display(TYPE_INTERNAL, id = Display.DEFAULT_DISPLAY), display(TYPE_EXTERNAL, id = 1), ) - focusedDisplayRepository.emit(5) // invalid display + focusedDisplayRepository.setDisplayId(5) // invalid display val onSaved = { _: Uri? -> } screenshotExecutor.executeScreenshots( createScreenshotRequest( diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/FocusShadeDisplayPolicyTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/FocusShadeDisplayPolicyTest.kt new file mode 100644 index 000000000000..b4249ef72e62 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/display/FocusShadeDisplayPolicyTest.kt @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2024 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 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.kosmos.testScope +import com.android.systemui.kosmos.useUnconfinedTestDispatcher +import com.android.systemui.shade.data.repository.fakeFocusedDisplayRepository +import com.android.systemui.shade.data.repository.focusShadeDisplayPolicy +import com.android.systemui.testKosmos +import com.google.common.truth.Truth.assertThat +import kotlin.test.Test +import kotlinx.coroutines.test.runTest +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidJUnit4::class) +class FocusShadeDisplayPolicyTest : SysuiTestCase() { + private val kosmos = testKosmos().useUnconfinedTestDispatcher() + private val testScope = kosmos.testScope + private val focusedDisplayRepository = kosmos.fakeFocusedDisplayRepository + + private val underTest = kosmos.focusShadeDisplayPolicy + + @Test + fun displayId_propagatedFromRepository() = + testScope.runTest { + val displayId by collectLastValue(underTest.displayId) + + assertThat(displayId).isEqualTo(Display.DEFAULT_DISPLAY) + + focusedDisplayRepository.setDisplayId(2) + + assertThat(displayId).isEqualTo(2) + + focusedDisplayRepository.setDisplayId(3) + + assertThat(displayId).isEqualTo(3) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/shade/display/FocusShadeDisplayPolicy.kt b/packages/SystemUI/src/com/android/systemui/shade/display/FocusShadeDisplayPolicy.kt new file mode 100644 index 000000000000..7d8f7c59ad66 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/shade/display/FocusShadeDisplayPolicy.kt @@ -0,0 +1,34 @@ +/* + * 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 com.android.systemui.dagger.SysUISingleton +import com.android.systemui.display.data.repository.FocusedDisplayRepository +import javax.inject.Inject +import kotlinx.coroutines.flow.StateFlow + +/** Policy that just emits the [FocusedDisplayRepository] display id. */ +@SysUISingleton +class FocusShadeDisplayPolicy +@Inject +constructor(private val focusedDisplayRepository: FocusedDisplayRepository) : ShadeDisplayPolicy { + override val name: String + get() = "focused_display" + + override val displayId: StateFlow<Int> + get() = focusedDisplayRepository.focusedDisplayId +} diff --git a/packages/SystemUI/src/com/android/systemui/shade/display/ShadeDisplayPolicy.kt b/packages/SystemUI/src/com/android/systemui/shade/display/ShadeDisplayPolicy.kt index bf5deff5cff5..677e41a47afe 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/display/ShadeDisplayPolicy.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/display/ShadeDisplayPolicy.kt @@ -19,7 +19,8 @@ package com.android.systemui.shade.display import com.android.systemui.shade.domain.interactor.ShadeExpandedStateInteractor.ShadeElement import dagger.Binds import dagger.Module -import dagger.multibindings.IntoSet +import dagger.Provides +import dagger.multibindings.ElementsIntoSet import kotlinx.coroutines.flow.StateFlow /** Describes the display the shade should be shown in. */ @@ -53,27 +54,25 @@ interface ShadeExpansionIntent { fun consumeExpansionIntent(): ShadeElement? } -@Module +@Module(includes = [AllShadeDisplayPoliciesModule::class]) interface ShadeDisplayPolicyModule { @Binds fun provideDefaultPolicy(impl: DefaultDisplayShadePolicy): ShadeDisplayPolicy @Binds fun provideShadeExpansionIntent(impl: StatusBarTouchShadeDisplayPolicy): ShadeExpansionIntent +} - @IntoSet - @Binds - fun provideDefaultDisplayPolicyToSet(impl: DefaultDisplayShadePolicy): ShadeDisplayPolicy - - @IntoSet - @Binds - fun provideAnyExternalShadeDisplayPolicyToSet( - impl: AnyExternalShadeDisplayPolicy - ): ShadeDisplayPolicy - - @Binds - @IntoSet - fun provideStatusBarTouchShadeDisplayPolicy( - impl: StatusBarTouchShadeDisplayPolicy - ): ShadeDisplayPolicy +@Module +internal object AllShadeDisplayPoliciesModule { + @Provides + @ElementsIntoSet + fun provideShadeDisplayPolicies( + defaultPolicy: DefaultDisplayShadePolicy, + externalPolicy: AnyExternalShadeDisplayPolicy, + statusBarPolicy: StatusBarTouchShadeDisplayPolicy, + focusPolicy: FocusShadeDisplayPolicy, + ): Set<ShadeDisplayPolicy> { + return setOf(defaultPolicy, externalPolicy, statusBarPolicy, focusPolicy) + } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/FakeFocusedDisplayRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/FakeFocusedDisplayRepository.kt index 83df5d874ad6..ad9370f7ac84 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/FakeFocusedDisplayRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/display/data/repository/FakeFocusedDisplayRepository.kt @@ -33,7 +33,7 @@ class FakeFocusedDisplayRepository @Inject constructor() : FocusedDisplayReposit override val focusedDisplayId: StateFlow<Int> get() = flow.asStateFlow() - suspend fun emit(focusedDisplay: Int) = flow.emit(focusedDisplay) + suspend fun setDisplayId(focusedDisplay: Int) = flow.emit(focusedDisplay) } @Module 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 4d718744320d..d9a348d93533 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 @@ -16,6 +16,7 @@ package com.android.systemui.shade.data.repository +import com.android.systemui.display.data.repository.FakeFocusedDisplayRepository import com.android.systemui.display.data.repository.displayRepository import com.android.systemui.keyguard.data.repository.keyguardRepository import com.android.systemui.kosmos.Kosmos @@ -23,6 +24,7 @@ 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.FocusShadeDisplayPolicy import com.android.systemui.shade.display.ShadeDisplayPolicy import com.android.systemui.shade.display.ShadeExpansionIntent import com.android.systemui.shade.display.StatusBarTouchShadeDisplayPolicy @@ -78,3 +80,10 @@ val Kosmos.shadeDisplayPolicies: Set<ShadeDisplayPolicy> by val Kosmos.fakeShadeDisplaysRepository: FakeShadeDisplayRepository by Kosmos.Fixture { FakeShadeDisplayRepository() } +val Kosmos.fakeFocusedDisplayRepository: FakeFocusedDisplayRepository by + Kosmos.Fixture { FakeFocusedDisplayRepository() } + +val Kosmos.focusShadeDisplayPolicy: FocusShadeDisplayPolicy by + Kosmos.Fixture { + FocusShadeDisplayPolicy(focusedDisplayRepository = fakeFocusedDisplayRepository) + } |