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

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

Merge "Create a seperate instance of StatusBarModePerDisplayRepository for every display" into main

parents 04a63d23 954faef9
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -26,11 +26,14 @@ import androidx.test.filters.SmallTest
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.fragments.FragmentHostManager
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.statusbar.data.repository.fakeStatusBarModePerDisplayRepository
import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment
import com.android.systemui.statusbar.phone.fragment.dagger.HomeStatusBarComponent
import com.android.systemui.statusbar.pipeline.shared.ui.composable.StatusBarRootFactory
import com.android.systemui.statusbar.window.StatusBarWindowController
import com.android.systemui.statusbar.window.StatusBarWindowControllerStore
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlin.test.Test
import org.junit.Assert.assertThrows
@@ -45,12 +48,14 @@ import org.mockito.kotlin.whenever
@SmallTest
@RunWith(AndroidJUnit4::class)
class StatusBarInitializerTest : SysuiTestCase() {
    private val kosmos = testKosmos().useUnconfinedTestDispatcher()
    private val windowController = mock(StatusBarWindowController::class.java)
    private val windowControllerStore = mock(StatusBarWindowControllerStore::class.java)
    private val transaction = mock(FragmentTransaction::class.java)
    private val fragmentManager = mock(FragmentManager::class.java)
    private val fragmentHostManager = mock(FragmentHostManager::class.java)
    private val backgroundView = mock(ViewGroup::class.java)
    private val statusBarModePerDisplayRepository = kosmos.fakeStatusBarModePerDisplayRepository

    @Before
    fun setup() {
@@ -72,6 +77,7 @@ class StatusBarInitializerTest : SysuiTestCase() {
            statusBarRootFactory = mock(StatusBarRootFactory::class.java),
            componentFactory = mock(HomeStatusBarComponent.Factory::class.java),
            creationListeners = setOf(),
            statusBarModePerDisplayRepository = statusBarModePerDisplayRepository,
        )

    @Test
+70 −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.statusbar.data.repository

import android.platform.test.annotations.EnableFlags
import android.view.Display.DEFAULT_DISPLAY
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.display.data.repository.displayRepository
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
import com.android.systemui.testKosmos
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.verify

@SmallTest
@RunWith(AndroidJUnit4::class)
@EnableFlags(StatusBarConnectedDisplays.FLAG_NAME)
class MultiDisplayStatusBarModeRepositoryStoreTest : SysuiTestCase() {

    private val kosmos = testKosmos().useUnconfinedTestDispatcher()
    private val testScope = kosmos.testScope
    private val fakeDisplayRepository = kosmos.displayRepository
    private val underTest by lazy { kosmos.multiDisplayStatusBarModeRepositoryStore }

    @Before
    fun start() {
        underTest.start()
    }

    @Before fun addDisplays() = runBlocking { fakeDisplayRepository.addDisplay(DEFAULT_DISPLAY) }

    @Test
    fun forDisplay_startsInstance() =
        testScope.runTest {
            val instance = underTest.forDisplay(DEFAULT_DISPLAY)

            verify(instance).start()
        }

    @Test
    fun displayRemoved_stopsInstance() =
        testScope.runTest {
            val instance = underTest.forDisplay(DEFAULT_DISPLAY)

            fakeDisplayRepository.removeDisplay(DEFAULT_DISPLAY)

            verify(instance).stop()
        }
}
+15 −5
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import com.android.systemui.fragments.FragmentHostManager
import com.android.systemui.res.R
import com.android.systemui.statusbar.core.StatusBarInitializer.OnStatusBarViewInitializedListener
import com.android.systemui.statusbar.core.StatusBarInitializer.OnStatusBarViewUpdatedListener
import com.android.systemui.statusbar.data.repository.StatusBarModePerDisplayRepository
import com.android.systemui.statusbar.phone.PhoneStatusBarTransitions
import com.android.systemui.statusbar.phone.PhoneStatusBarView
import com.android.systemui.statusbar.phone.PhoneStatusBarViewController
@@ -71,7 +72,10 @@ interface StatusBarInitializer : CoreStartable {
    }

    interface Factory {
        fun create(statusBarWindowController: StatusBarWindowController): StatusBarInitializer
        fun create(
            statusBarWindowController: StatusBarWindowController,
            statusBarModePerDisplayRepository: StatusBarModePerDisplayRepository,
        ): StatusBarInitializer
    }
}

@@ -79,6 +83,7 @@ class StatusBarInitializerImpl
@AssistedInject
constructor(
    @Assisted private val statusBarWindowController: StatusBarWindowController,
    @Assisted private val statusBarModePerDisplayRepository: StatusBarModePerDisplayRepository,
    private val collapsedStatusBarFragmentProvider: Provider<CollapsedStatusBarFragment>,
    private val statusBarRootFactory: StatusBarRootFactory,
    private val componentFactory: HomeStatusBarComponent.Factory,
@@ -127,7 +132,7 @@ constructor(
                val phoneStatusBarView = cv.findViewById<PhoneStatusBarView>(R.id.status_bar)
                component =
                    componentFactory.create(phoneStatusBarView).also { component ->
                        // CollapsedStatusBarFragment used to be responsible initializting
                        // CollapsedStatusBarFragment used to be responsible initializing
                        component.init()

                        statusBarViewUpdatedListener?.onStatusBarViewUpdated(
@@ -135,11 +140,15 @@ constructor(
                            component.phoneStatusBarTransitions,
                        )

                        if (StatusBarConnectedDisplays.isEnabled) {
                            statusBarModePerDisplayRepository.onStatusBarViewInitialized(component)
                        } else {
                            creationListeners.forEach { listener ->
                                listener.onStatusBarViewInitialized(component)
                            }
                        }
                    }
            }

        // Add the new compose view to the hierarchy because we don't use fragment transactions
        // anymore
@@ -184,7 +193,8 @@ constructor(
    @AssistedFactory
    interface Factory : StatusBarInitializer.Factory {
        override fun create(
            statusBarWindowController: StatusBarWindowController
            statusBarWindowController: StatusBarWindowController,
            statusBarModePerDisplayRepository: StatusBarModePerDisplayRepository,
        ): StatusBarInitializerImpl
    }
}
+4 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import com.android.systemui.display.data.repository.DisplayRepository
import com.android.systemui.display.data.repository.PerDisplayStore
import com.android.systemui.display.data.repository.PerDisplayStoreImpl
import com.android.systemui.display.data.repository.SingleDisplayStore
import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryStore
import com.android.systemui.statusbar.window.StatusBarWindowControllerStore
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
@@ -37,6 +38,7 @@ constructor(
    displayRepository: DisplayRepository,
    private val factory: StatusBarInitializer.Factory,
    private val statusBarWindowControllerStore: StatusBarWindowControllerStore,
    private val statusBarModeRepositoryStore: StatusBarModeRepositoryStore,
) :
    StatusBarInitializerStore,
    PerDisplayStoreImpl<StatusBarInitializer>(backgroundApplicationScope, displayRepository) {
@@ -47,7 +49,8 @@ constructor(

    override fun createInstanceForDisplay(displayId: Int): StatusBarInitializer {
        return factory.create(
            statusBarWindowController = statusBarWindowControllerStore.forDisplay(displayId)
            statusBarWindowController = statusBarWindowControllerStore.forDisplay(displayId),
            statusBarModePerDisplayRepository = statusBarModeRepositoryStore.forDisplay(displayId),
        )
    }

+14 −4
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ import android.view.WindowInsetsController.APPEARANCE_SEMI_TRANSPARENT_STATUS_BA
import android.view.WindowInsetsController.Appearance
import com.android.internal.statusbar.LetterboxDetails
import com.android.internal.view.AppearanceRegion
import com.android.systemui.Dumpable
import com.android.systemui.CoreStartable
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.statusbar.CommandQueue
import com.android.systemui.statusbar.core.StatusBarInitializer.OnStatusBarViewInitializedListener
@@ -59,7 +59,7 @@ import kotlinx.coroutines.flow.stateIn
 * Note: These status bar modes are status bar *window* states that are sent to us from
 * WindowManager, not determined internally.
 */
interface StatusBarModePerDisplayRepository {
interface StatusBarModePerDisplayRepository : OnStatusBarViewInitializedListener, CoreStartable {
    /**
     * True if the status bar window is showing transiently and will disappear soon, and false
     * otherwise. ("Otherwise" in this case means the status bar is persistently hidden OR
@@ -104,6 +104,12 @@ interface StatusBarModePerDisplayRepository {
     *   determined internally instead.
     */
    fun clearTransient()

    /**
     * Called when the [StatusBarModePerDisplayRepository] should stop doing any work and clean up
     * if needed.
     */
    fun stop()
}

class StatusBarModePerDisplayRepositoryImpl
@@ -114,7 +120,7 @@ constructor(
    private val commandQueue: CommandQueue,
    private val letterboxAppearanceCalculator: LetterboxAppearanceCalculator,
    ongoingCallRepository: OngoingCallRepository,
) : StatusBarModePerDisplayRepository, OnStatusBarViewInitializedListener, Dumpable {
) : StatusBarModePerDisplayRepository {

    private val commandQueueCallback =
        object : CommandQueue.Callbacks {
@@ -163,10 +169,14 @@ constructor(
            }
        }

    fun start() {
    override fun start() {
        commandQueue.addCallback(commandQueueCallback)
    }

    override fun stop() {
        commandQueue.removeCallback(commandQueueCallback)
    }

    private val _isTransientShown = MutableStateFlow(false)
    override val isTransientShown: StateFlow<Boolean> = _isTransientShown.asStateFlow()

Loading