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

Commit b2c07628 authored by Nicolo' Mazzucato's avatar Nicolo' Mazzucato
Browse files

Introduce Shade configuration controller

This introduces a new configuration controller for the Shade, enabling it to adapt to per-display settings. Previously, the Shade relied on global configuration from SystemUIApplication, which is unsuitable for multi-display environments.

Now, the Shade obtains configuration from its associated window's root view. This ensures that when the Shade is moved to an external display, the correct configuration is applied.

This change is guarded by a feature flag. When disabled, the existing global configuration mechanism remains active.

This commit focuses on migrating Shade components within the /systemui/shade directory to the new per-display configuration controller. Further changes will address remaining components in subsequent commits.

Bug: 362719719
Bug: 374267505
Test: NotificationShadeWindowViewTest + presubmits
Flag: com.android.systemui.shade_window_goes_around
Change-Id: Id5a97ac717674e1c610f53b7a129c386d192a558
parent e62e7c83
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ import com.android.systemui.statusbar.notification.domain.interactor.Notificatio
import com.android.systemui.statusbar.notification.stack.AmbientState
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.statusbar.phone.ConfigurationForwarder
import com.android.systemui.statusbar.phone.DozeScrimController
import com.android.systemui.statusbar.phone.DozeServiceHost
import com.android.systemui.statusbar.phone.PhoneStatusBarViewController
@@ -219,6 +220,7 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
                primaryBouncerInteractor,
                alternateBouncerInteractor,
                mock(BouncerViewBinder::class.java),
                mock(ConfigurationForwarder::class.java),
            )
        underTest.setupExpandedStatusBar()
        underTest.setDragDownHelper(dragDownHelper)
+29 −5
Original line number Diff line number Diff line
@@ -15,8 +15,10 @@
 */
package com.android.systemui.shade

import android.content.res.Configuration
import android.os.SystemClock
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.testing.TestableLooper.RunWithLooper
import android.view.MotionEvent
import android.widget.FrameLayout
@@ -54,6 +56,7 @@ import com.android.systemui.statusbar.notification.stack.AmbientState
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.statusbar.phone.ConfigurationForwarder
import com.android.systemui.statusbar.phone.DozeScrimController
import com.android.systemui.statusbar.phone.DozeServiceHost
import com.android.systemui.statusbar.window.StatusBarWindowStateController
@@ -76,9 +79,11 @@ import org.mockito.ArgumentCaptor
import org.mockito.Captor
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.never
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations
import org.mockito.kotlin.eq

@ExperimentalCoroutinesApi
@RunWith(AndroidJUnit4::class)
@@ -123,6 +128,7 @@ class NotificationShadeWindowViewTest : SysuiTestCase() {
    @Mock private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor
    @Mock lateinit var primaryBouncerInteractor: PrimaryBouncerInteractor
    @Mock lateinit var alternateBouncerInteractor: AlternateBouncerInteractor
    @Mock lateinit var configurationForwarder: ConfigurationForwarder
    @Captor
    private lateinit var interactionEventHandlerCaptor: ArgumentCaptor<InteractionEventHandler>

@@ -191,6 +197,7 @@ class NotificationShadeWindowViewTest : SysuiTestCase() {
                primaryBouncerInteractor,
                alternateBouncerInteractor,
                mock(),
                configurationForwarder,
            )

        controller.setupExpandedStatusBar()
@@ -222,6 +229,23 @@ class NotificationShadeWindowViewTest : SysuiTestCase() {
            assertThat(interactionEventHandler.shouldInterceptTouchEvent(mock())).isFalse()
        }

    @Test
    @DisableFlags(AConfigFlags.FLAG_SHADE_WINDOW_GOES_AROUND)
    fun onConfigurationChanged_configForwarderNotSet() {
        underTest.onConfigurationChanged(Configuration())

        verify(configurationForwarder, never()).onConfigurationChanged(any())
    }

    @Test
    @EnableFlags(AConfigFlags.FLAG_SHADE_WINDOW_GOES_AROUND)
    fun onConfigurationChanged_configForwarderSet_propagatesConfig() {
        val config = Configuration()
        underTest.onConfigurationChanged(config)

        verify(configurationForwarder).onConfigurationChanged(eq(config))
    }

    private fun captureInteractionEventHandler() {
        verify(underTest).setInteractionEventHandler(interactionEventHandlerCaptor.capture())
        interactionEventHandler = interactionEventHandlerCaptor.value
+2 −0
Original line number Diff line number Diff line
@@ -107,6 +107,7 @@ import com.android.systemui.security.data.repository.SecurityRepositoryModule;
import com.android.systemui.settings.DisplayTracker;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.shade.ShadeController;
import com.android.systemui.shade.ShadeDisplayAwareModule;
import com.android.systemui.shade.transition.LargeScreenShadeInterpolator;
import com.android.systemui.shade.transition.LargeScreenShadeInterpolatorImpl;
import com.android.systemui.shared.condition.Monitor;
@@ -265,6 +266,7 @@ import javax.inject.Named;
        CommonSystemUIUnfoldModule.class,
        TelephonyRepositoryModule.class,
        TemporaryDisplayModule.class,
        ShadeDisplayAwareModule.class,
        TouchpadModule.class,
        TunerModule.class,
        UserDomainLayerModule.class,
+1 −1
Original line number Diff line number Diff line
@@ -689,7 +689,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
            KeyguardUpdateMonitor keyguardUpdateMonitor,
            MetricsLogger metricsLogger,
            ShadeLogger shadeLogger,
            ConfigurationController configurationController,
            @ShadeDisplayAware ConfigurationController configurationController,
            Provider<FlingAnimationUtils.Builder> flingAnimationUtilsBuilder,
            StatusBarTouchableRegionManager statusBarTouchableRegionManager,
            ConversationNotificationManager conversationNotificationManager,
+1 −1
Original line number Diff line number Diff line
@@ -154,7 +154,7 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW
            IActivityManager activityManager,
            DozeParameters dozeParameters,
            StatusBarStateController statusBarStateController,
            ConfigurationController configurationController,
            @ShadeDisplayAware ConfigurationController configurationController,
            KeyguardViewMediator keyguardViewMediator,
            KeyguardBypassController keyguardBypassController,
            @Main Executor mainExecutor,
Loading