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

Commit b97e20b4 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add focus based shade display policy" into main

parents 23ee7594 62cf80b3
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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(
+58 −0
Original line number Diff line number Diff line
/*
 * 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)
        }
}
+34 −0
Original line number Diff line number Diff line
/*
 * 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
}
+16 −17
Original line number Diff line number Diff line
@@ -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)
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -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
Loading