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

Commit e3b51064 authored by Alina Zaidi's avatar Alina Zaidi
Browse files

Initialize status bar for all displays

Flag: com.android.systemui.status_bar_connected_displays
Bug: 376444078
Test: atest com.android.systemui.statusbar.core.CommandQueueInitializerTest
Test: Manual - SystemUi builds
Change-Id: Ibfa87bfda35350ae3b4d14ef5b03671fb3e8171a
parent d8dacaf6
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -67,6 +67,13 @@ interface IStatusBarService
    // ---- Methods below are for use by the status bar policy services ----
    // You need the STATUS_BAR_SERVICE permission
    RegisterStatusBarResult registerStatusBar(IStatusBar callbacks);
    /**
     * Registers the status bar for all displays.
     *
     * Returns a map of all display IDs (as strings) to their corresponding RegisterStatusBarResult
     * objects.
     */
    Map<String, RegisterStatusBarResult> registerStatusBarForAllDisplays(IStatusBar callbacks);
    void onPanelRevealed(boolean clearNotificationEffects, int numItems);
    void onPanelHidden();
    // Mark current notifications as "seen" and stop ringing, vibrating, blinking.
+55 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.statusbar.core

import android.internal.statusbar.FakeStatusBarService.Companion.SECONDARY_DISPLAY_ID
import android.internal.statusbar.fakeStatusBarService
import android.platform.test.annotations.EnableFlags
import android.view.WindowInsets
@@ -53,7 +54,7 @@ class CommandQueueInitializerTest : SysuiTestCase() {
    }

    @Test
    fun start_barResultHasTransientStatusBar_transientStateIsTrue() {
    fun start_defaultDisplay_barResultHasTransientStatusBar_transientStateIsTrue() {
        fakeStatusBarService.transientBarTypes = WindowInsets.Type.statusBars()

        initializer.start()
@@ -62,7 +63,7 @@ class CommandQueueInitializerTest : SysuiTestCase() {
    }

    @Test
    fun start_barResultDoesNotHaveTransientStatusBar_transientStateIsFalse() {
    fun start_defaultDisplay_barResultDoesNotHaveTransientStatusBar_transientStateIsFalse() {
        fakeStatusBarService.transientBarTypes = WindowInsets.Type.navigationBars()

        initializer.start()
@@ -70,6 +71,32 @@ class CommandQueueInitializerTest : SysuiTestCase() {
        assertThat(statusBarModeRepository.defaultDisplay.isTransientShown.value).isFalse()
    }

    @Test
    fun start_secondaryDisplay_barResultHasTransientStatusBar_transientStateIsTrue() {
        fakeStatusBarService.transientBarTypesSecondaryDisplay = WindowInsets.Type.statusBars()
        fakeStatusBarService.transientBarTypes = WindowInsets.Type.navigationBars()

        initializer.start()

        assertThat(statusBarModeRepository.forDisplay(SECONDARY_DISPLAY_ID).isTransientShown.value)
            .isTrue()
        // Default display should be unaffected
        assertThat(statusBarModeRepository.defaultDisplay.isTransientShown.value).isFalse()
    }

    @Test
    fun start_secondaryDisplay_barResultDoesNotHaveTransientStatusBar_transientStateIsFalse() {
        fakeStatusBarService.transientBarTypesSecondaryDisplay = WindowInsets.Type.navigationBars()
        fakeStatusBarService.transientBarTypes = WindowInsets.Type.statusBars()

        initializer.start()

        assertThat(statusBarModeRepository.forDisplay(SECONDARY_DISPLAY_ID).isTransientShown.value)
            .isFalse()
        // Default display should be unaffected
        assertThat(statusBarModeRepository.defaultDisplay.isTransientShown.value).isTrue()
    }

    @Test
    fun start_callsOnSystemBarAttributesChanged_basedOnRegisterBarResult() {
        initializer.start()
@@ -85,6 +112,17 @@ class CommandQueueInitializerTest : SysuiTestCase() {
                fakeStatusBarService.packageName,
                fakeStatusBarService.letterboxDetails,
            )
        verify(commandQueueCallbacks)
            .onSystemBarAttributesChanged(
                SECONDARY_DISPLAY_ID,
                fakeStatusBarService.appearanceSecondaryDisplay,
                fakeStatusBarService.appearanceRegionsSecondaryDisplay,
                fakeStatusBarService.navbarColorManagedByImeSecondaryDisplay,
                fakeStatusBarService.behaviorSecondaryDisplay,
                fakeStatusBarService.requestedVisibleTypesSecondaryDisplay,
                fakeStatusBarService.packageNameSecondaryDisplay,
                fakeStatusBarService.letterboxDetailsSecondaryDisplay,
            )
    }

    @Test
@@ -105,6 +143,14 @@ class CommandQueueInitializerTest : SysuiTestCase() {
                fakeStatusBarService.imeBackDisposition,
                fakeStatusBarService.showImeSwitcher,
            )

        verify(commandQueueCallbacks)
            .setImeWindowStatus(
                SECONDARY_DISPLAY_ID,
                fakeStatusBarService.imeWindowVisSecondaryDisplay,
                fakeStatusBarService.imeBackDispositionSecondaryDisplay,
                fakeStatusBarService.showImeSwitcherSecondaryDisplay,
            )
    }

    @Test
@@ -117,6 +163,11 @@ class CommandQueueInitializerTest : SysuiTestCase() {
            .isEqualTo(fakeStatusBarService.disabledFlags1)
        assertThat(commandQueue.disableFlags2ForDisplay(context.displayId))
            .isEqualTo(fakeStatusBarService.disabledFlags2)

        assertThat(commandQueue.disableFlags1ForDisplay(SECONDARY_DISPLAY_ID))
            .isEqualTo(fakeStatusBarService.disabledFlags1SecondaryDisplay)
        assertThat(commandQueue.disableFlags2ForDisplay(SECONDARY_DISPLAY_ID))
            .isEqualTo(fakeStatusBarService.disabledFlags2SecondaryDisplay)
    }

    @Test
@@ -125,5 +176,7 @@ class CommandQueueInitializerTest : SysuiTestCase() {

        assertThat(commandQueue.disableFlags1ForDisplay(context.displayId)).isNull()
        assertThat(commandQueue.disableFlags2ForDisplay(context.displayId)).isNull()
        assertThat(commandQueue.disableFlags1ForDisplay(SECONDARY_DISPLAY_ID)).isNull()
        assertThat(commandQueue.disableFlags2ForDisplay(SECONDARY_DISPLAY_ID)).isNull()
    }
}
+18 −11
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.app.StatusBarManager
import android.content.Context
import android.os.Binder
import android.os.RemoteException
import android.view.Display
import android.view.WindowInsets
import com.android.internal.statusbar.IStatusBarService
import com.android.internal.statusbar.RegisterStatusBarResult
@@ -47,20 +48,32 @@ constructor(

    override fun start() {
        StatusBarConnectedDisplays.assertInNewMode()
        val result: RegisterStatusBarResult =
        val resultPerDisplay: Map<String, RegisterStatusBarResult> =
            try {
                barService.registerStatusBar(commandQueue)
                barService.registerStatusBarForAllDisplays(commandQueue)
            } catch (ex: RemoteException) {
                ex.rethrowFromSystemServer()
                return
            }

        createNavigationBar(result)
        resultPerDisplay[Display.DEFAULT_DISPLAY.toString()]?.let {
            createNavigationBar(it)
            // Set up the initial icon state
            val numIcons: Int = it.mIcons.size
            for (i in 0 until numIcons) {
                commandQueue.setIcon(it.mIcons.keyAt(i), it.mIcons.valueAt(i))
            }
        }

        for ((displayId, result) in resultPerDisplay.entries) {
            initializeStatusBarForDisplay(displayId.toInt(), result)
        }
    }

    private fun initializeStatusBarForDisplay(displayId: Int, result: RegisterStatusBarResult) {
        if ((result.mTransientBarTypes and WindowInsets.Type.statusBars()) != 0) {
            statusBarModeRepository.defaultDisplay.showTransient()
            statusBarModeRepository.forDisplay(displayId).showTransient()
        }
        val displayId = context.display.displayId
        val commandQueueCallbacks = commandQueueCallbacksLazy.get()
        commandQueueCallbacks.onSystemBarAttributesChanged(
            displayId,
@@ -81,12 +94,6 @@ constructor(
            result.mShowImeSwitcher,
        )

        // Set up the initial icon state
        val numIcons: Int = result.mIcons.size
        for (i in 0 until numIcons) {
            commandQueue.setIcon(result.mIcons.keyAt(i), result.mIcons.valueAt(i))
        }

        // set the initial view visibility
        val disabledFlags1 = result.mDisabledFlags1
        val disabledFlags2 = result.mDisabledFlags2
+100 −15
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.os.Bundle
import android.os.IBinder
import android.os.UserHandle
import android.util.ArrayMap
import android.view.Display
import android.view.KeyEvent
import com.android.internal.logging.InstanceId
import com.android.internal.statusbar.IAddTileResultCallback
@@ -95,6 +96,90 @@ class FakeStatusBarService : IStatusBarService.Stub() {
            )
        )

    var statusBarIconsSecondaryDisplay =
        ArrayMap<String, StatusBarIcon>().also {
            it["slot1"] = mock<StatusBarIcon>()
            it["slot2"] = mock<StatusBarIcon>()
        }
    var disabledFlags1SecondaryDisplay = 12345678
    var appearanceSecondaryDisplay = 1234
    var appearanceRegionsSecondaryDisplay =
        arrayOf(
            AppearanceRegion(
                /* appearance = */ 123,
                /* bounds = */ Rect(/* left= */ 4, /* top= */ 3, /* right= */ 2, /* bottom= */ 1),
            ),
            AppearanceRegion(
                /* appearance = */ 345,
                /* bounds = */ Rect(/* left= */ 1, /* top= */ 2, /* right= */ 3, /* bottom= */ 4),
            ),
        )
    var imeWindowVisSecondaryDisplay = 9876
    var imeBackDispositionSecondaryDisplay = 654
    var showImeSwitcherSecondaryDisplay = true
    var disabledFlags2SecondaryDisplay = 87654321
    var navbarColorManagedByImeSecondaryDisplay = true
    var behaviorSecondaryDisplay = 234
    var requestedVisibleTypesSecondaryDisplay = 345
    var packageNameSecondaryDisplay = "fake.bar.ser.vice"
    var transientBarTypesSecondaryDisplay = 0
    var letterboxDetailsSecondaryDisplay =
        arrayOf(
            LetterboxDetails(
                /* letterboxInnerBounds = */ Rect(
                    /* left= */ 5,
                    /* top= */ 6,
                    /* right= */ 7,
                    /* bottom= */ 8,
                ),
                /* letterboxFullBounds = */ Rect(
                    /* left= */ 1,
                    /* top= */ 2,
                    /* right= */ 3,
                    /* bottom= */ 4,
                ),
                /* appAppearance = */ 123,
            )
        )

    private val defaultRegisterStatusBarResult
        get() =
            RegisterStatusBarResult(
                statusBarIcons,
                disabledFlags1,
                appearance,
                appearanceRegions,
                imeWindowVis,
                imeBackDisposition,
                showImeSwitcher,
                disabledFlags2,
                navbarColorManagedByIme,
                behavior,
                requestedVisibleTypes,
                packageName,
                transientBarTypes,
                letterboxDetails,
            )

    private val registerStatusBarResultSecondaryDisplay
        get() =
            RegisterStatusBarResult(
                statusBarIconsSecondaryDisplay,
                disabledFlags1SecondaryDisplay,
                appearanceSecondaryDisplay,
                appearanceRegionsSecondaryDisplay,
                imeWindowVisSecondaryDisplay,
                imeBackDispositionSecondaryDisplay,
                showImeSwitcherSecondaryDisplay,
                disabledFlags2SecondaryDisplay,
                navbarColorManagedByImeSecondaryDisplay,
                behaviorSecondaryDisplay,
                requestedVisibleTypesSecondaryDisplay,
                packageNameSecondaryDisplay,
                transientBarTypesSecondaryDisplay,
                letterboxDetailsSecondaryDisplay,
            )

    override fun expandNotificationsPanel() {}

    override fun collapsePanels() {}
@@ -140,21 +225,16 @@ class FakeStatusBarService : IStatusBarService.Stub() {

    override fun registerStatusBar(callbacks: IStatusBar): RegisterStatusBarResult {
        registeredStatusBar = callbacks
        return RegisterStatusBarResult(
            statusBarIcons,
            disabledFlags1,
            appearance,
            appearanceRegions,
            imeWindowVis,
            imeBackDisposition,
            showImeSwitcher,
            disabledFlags2,
            navbarColorManagedByIme,
            behavior,
            requestedVisibleTypes,
            packageName,
            transientBarTypes,
            letterboxDetails,
        return defaultRegisterStatusBarResult
    }

    override fun registerStatusBarForAllDisplays(
        callbacks: IStatusBar
    ): Map<String, RegisterStatusBarResult> {
        registeredStatusBar = callbacks
        return mapOf(
            DEFAULT_DISPLAY_ID.toString() to defaultRegisterStatusBarResult,
            SECONDARY_DISPLAY_ID.toString() to registerStatusBarResultSecondaryDisplay,
        )
    }

@@ -352,4 +432,9 @@ class FakeStatusBarService : IStatusBarService.Stub() {
    override fun unregisterNearbyMediaDevicesProvider(provider: INearbyMediaDevicesProvider) {}

    override fun showRearDisplayDialog(currentBaseState: Int) {}

    companion object {
        const val DEFAULT_DISPLAY_ID = Display.DEFAULT_DISPLAY
        const val SECONDARY_DISPLAY_ID = 2
    }
}
+5 −5
Original line number Diff line number Diff line
@@ -34,12 +34,12 @@ class FakeStatusBarModeRepository @Inject constructor() : StatusBarModeRepositor
        const val DISPLAY_ID = Display.DEFAULT_DISPLAY
    }

    override val defaultDisplay: FakeStatusBarModePerDisplayRepository =
        FakeStatusBarModePerDisplayRepository()
    private val perDisplayRepos = mutableMapOf<Int, FakeStatusBarModePerDisplayRepository>()

    override fun forDisplay(displayId: Int): FakeStatusBarModePerDisplayRepository {
        return defaultDisplay
    }
    override val defaultDisplay: FakeStatusBarModePerDisplayRepository = forDisplay(DISPLAY_ID)

    override fun forDisplay(displayId: Int): FakeStatusBarModePerDisplayRepository =
        perDisplayRepos.computeIfAbsent(displayId) { FakeStatusBarModePerDisplayRepository() }
}

class FakeStatusBarModePerDisplayRepository : StatusBarModePerDisplayRepository {
Loading