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

Commit f2cd7492 authored by Chris Göllner's avatar Chris Göllner Committed by Android (Google) Code Review
Browse files

Merge "Prepare LightBarController for multi display" into main

parents 7cf1bb48 88228a8a
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -116,6 +116,7 @@ import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.NotificationShadeDepthController;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.data.repository.LightBarControllerStore;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.LightBarController;
@@ -208,7 +209,7 @@ public class NavigationBarTest extends SysuiTestCase {
    @Mock
    private LightBarController mLightBarController;
    @Mock
    private LightBarController.Factory mLightBarcontrollerFactory;
    private LightBarControllerStore mLightBarControllerStore;
    @Mock
    private AutoHideController mAutoHideController;
    @Mock
@@ -257,7 +258,7 @@ public class NavigationBarTest extends SysuiTestCase {
    public void setup() throws Exception {
        MockitoAnnotations.initMocks(this);

        when(mLightBarcontrollerFactory.create(any(Context.class))).thenReturn(mLightBarController);
        when(mLightBarControllerStore.forDisplay(anyInt())).thenReturn(mLightBarController);
        when(mAutoHideControllerFactory.create(any(Context.class))).thenReturn(mAutoHideController);
        when(mNavigationBarView.getHomeButton()).thenReturn(mHomeButton);
        when(mNavigationBarView.getRecentsButton()).thenReturn(mRecentsButton);
@@ -649,8 +650,7 @@ public class NavigationBarTest extends SysuiTestCase {
                mFakeExecutor,
                mUiEventLogger,
                mNavBarHelper,
                mLightBarController,
                mLightBarcontrollerFactory,
                mLightBarControllerStore,
                mAutoHideController,
                mAutoHideControllerFactory,
                Optional.of(mTelecomManager),
+76 −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.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.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.never
import org.mockito.kotlin.verify

@SmallTest
@RunWith(AndroidJUnit4::class)
class LightBarControllerStoreImplTest : SysuiTestCase() {
    private val kosmos = testKosmos().useUnconfinedTestDispatcher()
    private val testScope = kosmos.testScope
    private val fakeDisplayRepository = kosmos.displayRepository

    private val underTest = kosmos.lightBarControllerStoreImpl

    @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 beforeDisplayRemoved_doesNotStopInstances() =
        testScope.runTest {
            val instance = underTest.forDisplay(DEFAULT_DISPLAY)

            verify(instance, never()).stop()
        }

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

            fakeDisplayRepository.removeDisplay(DEFAULT_DISPLAY)

            verify(instance).stop()
        }
}
+18 −20
Original line number Diff line number Diff line
@@ -48,12 +48,10 @@ import com.android.keyguard.TestScopeProvider;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.navigationbar.NavigationModeController;
import com.android.systemui.settings.FakeDisplayTracker;
import com.android.systemui.statusbar.data.model.StatusBarAppearance;
import com.android.systemui.statusbar.data.model.StatusBarMode;
import com.android.systemui.statusbar.data.repository.FakeStatusBarModeRepository;
import com.android.systemui.statusbar.data.repository.FakeStatusBarModePerDisplayRepository;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.util.kotlin.JavaAdapter;

import kotlinx.coroutines.test.TestScope;

@@ -81,8 +79,8 @@ public class LightBarControllerTest extends SysuiTestCase {
    private SysuiDarkIconDispatcher mStatusBarIconController;
    private LightBarController mLightBarController;
    private final TestScope mTestScope = TestScopeProvider.getTestScope();
    private final FakeStatusBarModeRepository mStatusBarModeRepository =
            new FakeStatusBarModeRepository();
    private final FakeStatusBarModePerDisplayRepository mStatusBarModeRepository =
            new FakeStatusBarModePerDisplayRepository();

    @Before
    public void setup() {
@@ -92,15 +90,15 @@ public class LightBarControllerTest extends SysuiTestCase {
        mLightBarTransitionsController = mock(LightBarTransitionsController.class);
        when(mStatusBarIconController.getTransitionsController()).thenReturn(
                mLightBarTransitionsController);
        mLightBarController = new LightBarController(
                mContext,
                new JavaAdapter(mTestScope),
        mLightBarController = new LightBarControllerImpl(
                mContext.getDisplayId(),
                mTestScope,
                mStatusBarIconController,
                mock(BatteryController.class),
                mock(NavigationModeController.class),
                mStatusBarModeRepository,
                mock(DumpManager.class),
                new FakeDisplayTracker(mContext));
                mTestScope.getCoroutineContext());
        mLightBarController.start();
    }

@@ -121,7 +119,7 @@ public class LightBarControllerTest extends SysuiTestCase {
                new AppearanceRegion(APPEARANCE_LIGHT_STATUS_BARS, secondBounds)
        );

        mStatusBarModeRepository.getDefaultDisplay().getStatusBarAppearance().setValue(
        mStatusBarModeRepository.getStatusBarAppearance().setValue(
                new StatusBarAppearance(
                        StatusBarMode.TRANSPARENT,
                        STATUS_BAR_BOUNDS,
@@ -142,7 +140,7 @@ public class LightBarControllerTest extends SysuiTestCase {
                new AppearanceRegion(0 /* appearance */, secondBounds)
        );

        mStatusBarModeRepository.getDefaultDisplay().getStatusBarAppearance().setValue(
        mStatusBarModeRepository.getStatusBarAppearance().setValue(
                new StatusBarAppearance(
                        StatusBarMode.TRANSPARENT,
                        STATUS_BAR_BOUNDS,
@@ -165,7 +163,7 @@ public class LightBarControllerTest extends SysuiTestCase {
                new AppearanceRegion(APPEARANCE_LIGHT_STATUS_BARS, secondBounds)
        );

        mStatusBarModeRepository.getDefaultDisplay().getStatusBarAppearance().setValue(
        mStatusBarModeRepository.getStatusBarAppearance().setValue(
                new StatusBarAppearance(
                        StatusBarMode.TRANSPARENT,
                        STATUS_BAR_BOUNDS,
@@ -190,7 +188,7 @@ public class LightBarControllerTest extends SysuiTestCase {
                new AppearanceRegion(APPEARANCE_LIGHT_STATUS_BARS, thirdBounds)
        );

        mStatusBarModeRepository.getDefaultDisplay().getStatusBarAppearance().setValue(
        mStatusBarModeRepository.getStatusBarAppearance().setValue(
                new StatusBarAppearance(
                        StatusBarMode.TRANSPARENT,
                        STATUS_BAR_BOUNDS,
@@ -214,7 +212,7 @@ public class LightBarControllerTest extends SysuiTestCase {
                new AppearanceRegion(0 /* appearance */, secondBounds)
        );

        mStatusBarModeRepository.getDefaultDisplay().getStatusBarAppearance().setValue(
        mStatusBarModeRepository.getStatusBarAppearance().setValue(
                new StatusBarAppearance(
                        StatusBarMode.TRANSPARENT,
                        STATUS_BAR_BOUNDS,
@@ -231,7 +229,7 @@ public class LightBarControllerTest extends SysuiTestCase {
                new AppearanceRegion(APPEARANCE_LIGHT_STATUS_BARS, new Rect(0, 0, 1, 1))
        );

        mStatusBarModeRepository.getDefaultDisplay().getStatusBarAppearance().setValue(
        mStatusBarModeRepository.getStatusBarAppearance().setValue(
                new StatusBarAppearance(
                        StatusBarMode.TRANSPARENT,
                        STATUS_BAR_BOUNDS,
@@ -249,7 +247,7 @@ public class LightBarControllerTest extends SysuiTestCase {
                new AppearanceRegion(0, new Rect(0, 0, 1, 1))
        );

        mStatusBarModeRepository.getDefaultDisplay().getStatusBarAppearance().setValue(
        mStatusBarModeRepository.getStatusBarAppearance().setValue(
                new StatusBarAppearance(
                        StatusBarMode.TRANSPARENT,
                        STATUS_BAR_BOUNDS,
@@ -266,7 +264,7 @@ public class LightBarControllerTest extends SysuiTestCase {
                new AppearanceRegion(APPEARANCE_LIGHT_STATUS_BARS, new Rect(0, 0, 1, 1))
        );

        mStatusBarModeRepository.getDefaultDisplay().getStatusBarAppearance().setValue(
        mStatusBarModeRepository.getStatusBarAppearance().setValue(
                new StatusBarAppearance(
                        StatusBarMode.TRANSPARENT,
                        STATUS_BAR_BOUNDS,
@@ -276,7 +274,7 @@ public class LightBarControllerTest extends SysuiTestCase {
        reset(mStatusBarIconController);

        // WHEN the same appearance regions but different status bar mode is sent
        mStatusBarModeRepository.getDefaultDisplay().getStatusBarAppearance().setValue(
        mStatusBarModeRepository.getStatusBarAppearance().setValue(
                new StatusBarAppearance(
                        StatusBarMode.LIGHTS_OUT_TRANSPARENT,
                        STATUS_BAR_BOUNDS,
@@ -298,7 +296,7 @@ public class LightBarControllerTest extends SysuiTestCase {
                /* start= */ new Rect(0, 0, 10, 10),
                /* end= */ new Rect(0, 0, 20, 20));

        mStatusBarModeRepository.getDefaultDisplay().getStatusBarAppearance().setValue(
        mStatusBarModeRepository.getStatusBarAppearance().setValue(
                new StatusBarAppearance(
                        StatusBarMode.TRANSPARENT,
                        startingBounds,
@@ -311,7 +309,7 @@ public class LightBarControllerTest extends SysuiTestCase {
        BoundsPair newBounds = new BoundsPair(
                /* start= */ new Rect(0, 0, 30, 30),
                /* end= */ new Rect(0, 0, 40, 40));
        mStatusBarModeRepository.getDefaultDisplay().getStatusBarAppearance().setValue(
        mStatusBarModeRepository.getStatusBarAppearance().setValue(
                new StatusBarAppearance(
                        StatusBarMode.TRANSPARENT,
                        newBounds,
+5 −8
Original line number Diff line number Diff line
@@ -149,6 +149,7 @@ import com.android.systemui.statusbar.CommandQueue.Callbacks;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.NotificationShadeDepthController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.data.repository.LightBarControllerStore;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.CentralSurfaces;
@@ -258,8 +259,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
    private boolean mTransientShownFromGestureOnSystemBar;
    private int mNavBarMode = NAV_BAR_MODE_3BUTTON;
    private LightBarController mLightBarController;
    private final LightBarController mMainLightBarController;
    private final LightBarController.Factory mLightBarControllerFactory;
    private final LightBarControllerStore mLightBarControllerStore;
    private AutoHideController mAutoHideController;
    private final AutoHideController mMainAutoHideController;
    private final AutoHideController.Factory mAutoHideControllerFactory;
@@ -580,8 +580,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
            @Background Executor bgExecutor,
            UiEventLogger uiEventLogger,
            NavBarHelper navBarHelper,
            LightBarController mainLightBarController,
            LightBarController.Factory lightBarControllerFactory,
            LightBarControllerStore lightBarControllerStore,
            AutoHideController mainAutoHideController,
            AutoHideController.Factory autoHideControllerFactory,
            Optional<TelecomManager> telecomManagerOptional,
@@ -628,8 +627,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
        mUiEventLogger = uiEventLogger;
        mNavBarHelper = navBarHelper;
        mNotificationShadeDepthController = notificationShadeDepthController;
        mMainLightBarController = mainLightBarController;
        mLightBarControllerFactory = lightBarControllerFactory;
        mLightBarControllerStore = lightBarControllerStore;
        mMainAutoHideController = mainAutoHideController;
        mAutoHideControllerFactory = autoHideControllerFactory;
        mTelecomManagerOptional = telecomManagerOptional;
@@ -842,8 +840,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
        // Unfortunately, we still need it because status bar needs LightBarController
        // before notifications creation. We cannot directly use getLightBarController()
        // from NavigationBarFragment directly.
        LightBarController lightBarController = mIsOnDefaultDisplay
                ? mMainLightBarController : mLightBarControllerFactory.create(mContext);
        LightBarController lightBarController = mLightBarControllerStore.forDisplay(mDisplayId);
        setLightBarController(lightBarController);

        // TODO(b/118592525): to support multi-display, we start to add something which is
+12 −5
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import com.android.systemui.log.LogBuffer
import com.android.systemui.log.LogBufferFactory
import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
import com.android.systemui.statusbar.data.StatusBarDataLayerModule
import com.android.systemui.statusbar.data.repository.LightBarControllerStore
import com.android.systemui.statusbar.phone.LightBarController
import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
import com.android.systemui.statusbar.phone.StatusBarContentInsetsProviderImpl
@@ -55,31 +56,37 @@ import dagger.multibindings.IntoMap
 *   [com.android.systemui.statusbar.policy.dagger.StatusBarPolicyModule], etc.).
 */
@Module(includes = [StatusBarDataLayerModule::class, SystemBarUtilsProxyImpl.Module::class])
abstract class StatusBarModule {
interface StatusBarModule {

    @Binds
    @IntoMap
    @ClassKey(OngoingCallController::class)
    abstract fun bindOngoingCallController(impl: OngoingCallController): CoreStartable
    fun bindOngoingCallController(impl: OngoingCallController): CoreStartable

    @Binds
    @IntoMap
    @ClassKey(LightBarController::class)
    abstract fun bindLightBarController(impl: LightBarController): CoreStartable
    fun lightBarControllerAsCoreStartable(controller: LightBarController): CoreStartable

    @Binds
    @IntoMap
    @ClassKey(StatusBarSignalPolicy::class)
    abstract fun bindStatusBarSignalPolicy(impl: StatusBarSignalPolicy): CoreStartable
    fun bindStatusBarSignalPolicy(impl: StatusBarSignalPolicy): CoreStartable

    @Binds
    @SysUISingleton
    abstract fun statusBarWindowControllerFactory(
    fun statusBarWindowControllerFactory(
        implFactory: StatusBarWindowControllerImpl.Factory
    ): StatusBarWindowController.Factory

    companion object {

        @Provides
        @SysUISingleton
        fun lightBarController(store: LightBarControllerStore): LightBarController {
            return store.defaultDisplay
        }

        @Provides
        @SysUISingleton
        fun windowControllerStore(
Loading