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

Commit bfb2641a authored by Alina Zaidi's avatar Alina Zaidi Committed by Android (Google) Code Review
Browse files

Merge "Initialize status bar for all displays" into main

parents d9c6a0e9 e3b51064
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