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 Original line Diff line number Diff line
@@ -67,6 +67,13 @@ interface IStatusBarService
    // ---- Methods below are for use by the status bar policy services ----
    // ---- Methods below are for use by the status bar policy services ----
    // You need the STATUS_BAR_SERVICE permission
    // You need the STATUS_BAR_SERVICE permission
    RegisterStatusBarResult registerStatusBar(IStatusBar callbacks);
    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 onPanelRevealed(boolean clearNotificationEffects, int numItems);
    void onPanelHidden();
    void onPanelHidden();
    // Mark current notifications as "seen" and stop ringing, vibrating, blinking.
    // Mark current notifications as "seen" and stop ringing, vibrating, blinking.
+55 −2
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.systemui.statusbar.core
package com.android.systemui.statusbar.core


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


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


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


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


        initializer.start()
        initializer.start()
@@ -70,6 +71,32 @@ class CommandQueueInitializerTest : SysuiTestCase() {
        assertThat(statusBarModeRepository.defaultDisplay.isTransientShown.value).isFalse()
        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
    @Test
    fun start_callsOnSystemBarAttributesChanged_basedOnRegisterBarResult() {
    fun start_callsOnSystemBarAttributesChanged_basedOnRegisterBarResult() {
        initializer.start()
        initializer.start()
@@ -85,6 +112,17 @@ class CommandQueueInitializerTest : SysuiTestCase() {
                fakeStatusBarService.packageName,
                fakeStatusBarService.packageName,
                fakeStatusBarService.letterboxDetails,
                fakeStatusBarService.letterboxDetails,
            )
            )
        verify(commandQueueCallbacks)
            .onSystemBarAttributesChanged(
                SECONDARY_DISPLAY_ID,
                fakeStatusBarService.appearanceSecondaryDisplay,
                fakeStatusBarService.appearanceRegionsSecondaryDisplay,
                fakeStatusBarService.navbarColorManagedByImeSecondaryDisplay,
                fakeStatusBarService.behaviorSecondaryDisplay,
                fakeStatusBarService.requestedVisibleTypesSecondaryDisplay,
                fakeStatusBarService.packageNameSecondaryDisplay,
                fakeStatusBarService.letterboxDetailsSecondaryDisplay,
            )
    }
    }


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

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


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

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


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


        assertThat(commandQueue.disableFlags1ForDisplay(context.displayId)).isNull()
        assertThat(commandQueue.disableFlags1ForDisplay(context.displayId)).isNull()
        assertThat(commandQueue.disableFlags2ForDisplay(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 Original line Diff line number Diff line
@@ -20,6 +20,7 @@ import android.app.StatusBarManager
import android.content.Context
import android.content.Context
import android.os.Binder
import android.os.Binder
import android.os.RemoteException
import android.os.RemoteException
import android.view.Display
import android.view.WindowInsets
import android.view.WindowInsets
import com.android.internal.statusbar.IStatusBarService
import com.android.internal.statusbar.IStatusBarService
import com.android.internal.statusbar.RegisterStatusBarResult
import com.android.internal.statusbar.RegisterStatusBarResult
@@ -47,20 +48,32 @@ constructor(


    override fun start() {
    override fun start() {
        StatusBarConnectedDisplays.assertInNewMode()
        StatusBarConnectedDisplays.assertInNewMode()
        val result: RegisterStatusBarResult =
        val resultPerDisplay: Map<String, RegisterStatusBarResult> =
            try {
            try {
                barService.registerStatusBar(commandQueue)
                barService.registerStatusBarForAllDisplays(commandQueue)
            } catch (ex: RemoteException) {
            } catch (ex: RemoteException) {
                ex.rethrowFromSystemServer()
                ex.rethrowFromSystemServer()
                return
                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) {
        if ((result.mTransientBarTypes and WindowInsets.Type.statusBars()) != 0) {
            statusBarModeRepository.defaultDisplay.showTransient()
            statusBarModeRepository.forDisplay(displayId).showTransient()
        }
        }
        val displayId = context.display.displayId
        val commandQueueCallbacks = commandQueueCallbacksLazy.get()
        val commandQueueCallbacks = commandQueueCallbacksLazy.get()
        commandQueueCallbacks.onSystemBarAttributesChanged(
        commandQueueCallbacks.onSystemBarAttributesChanged(
            displayId,
            displayId,
@@ -81,12 +94,6 @@ constructor(
            result.mShowImeSwitcher,
            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
        // set the initial view visibility
        val disabledFlags1 = result.mDisabledFlags1
        val disabledFlags1 = result.mDisabledFlags1
        val disabledFlags2 = result.mDisabledFlags2
        val disabledFlags2 = result.mDisabledFlags2
+100 −15
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@ import android.os.Bundle
import android.os.IBinder
import android.os.IBinder
import android.os.UserHandle
import android.os.UserHandle
import android.util.ArrayMap
import android.util.ArrayMap
import android.view.Display
import android.view.KeyEvent
import android.view.KeyEvent
import com.android.internal.logging.InstanceId
import com.android.internal.logging.InstanceId
import com.android.internal.statusbar.IAddTileResultCallback
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 expandNotificationsPanel() {}


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


    override fun registerStatusBar(callbacks: IStatusBar): RegisterStatusBarResult {
    override fun registerStatusBar(callbacks: IStatusBar): RegisterStatusBarResult {
        registeredStatusBar = callbacks
        registeredStatusBar = callbacks
        return RegisterStatusBarResult(
        return defaultRegisterStatusBarResult
            statusBarIcons,
    }
            disabledFlags1,

            appearance,
    override fun registerStatusBarForAllDisplays(
            appearanceRegions,
        callbacks: IStatusBar
            imeWindowVis,
    ): Map<String, RegisterStatusBarResult> {
            imeBackDisposition,
        registeredStatusBar = callbacks
            showImeSwitcher,
        return mapOf(
            disabledFlags2,
            DEFAULT_DISPLAY_ID.toString() to defaultRegisterStatusBarResult,
            navbarColorManagedByIme,
            SECONDARY_DISPLAY_ID.toString() to registerStatusBarResultSecondaryDisplay,
            behavior,
            requestedVisibleTypes,
            packageName,
            transientBarTypes,
            letterboxDetails,
        )
        )
    }
    }


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


    override fun showRearDisplayDialog(currentBaseState: Int) {}
    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 Original line Diff line number Diff line
@@ -34,12 +34,12 @@ class FakeStatusBarModeRepository @Inject constructor() : StatusBarModeRepositor
        const val DISPLAY_ID = Display.DEFAULT_DISPLAY
        const val DISPLAY_ID = Display.DEFAULT_DISPLAY
    }
    }


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


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

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


class FakeStatusBarModePerDisplayRepository : StatusBarModePerDisplayRepository {
class FakeStatusBarModePerDisplayRepository : StatusBarModePerDisplayRepository {
Loading