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

Commit 3465b807 authored by Jiaming Cheng's avatar Jiaming Cheng
Browse files

[flexiglass] Fix QuickQSPanelControllerTest failures with SceneContainerFlag

Updated the `setUp` method in QuickQSPanelControllerTest to
conditionally mock dependencies
(`mediaCarouselInteractor.hasActiveMedia`,
`quickQSPanel.viewTreeObserver`, `mockViewTreeObserver.isAlive`,
`quickQSPanel.isAttachedToWindow`) only when SceneContainerFlag
is enabled. This resolves the initialization crashes.

Added `@DisableSceneContainer` annotation to the
`mediaExpansion_...` tests to ensure they only run when the
flag is disabled, as they test legacy behavior.

Bug: 416716468
Flag: com.android.systemui.scene_container
Test: com.android.systemui.qs.QuickQSPanelControllerTest
     Locally run this test and verify all the tests are passed with the
     `@EnableSceneContainer` annotation.
Change-Id: I8bb191b327338438bc1e3f6838181350e350d07a
parent 2a9efb6d
Loading
Loading
Loading
Loading
+19 −0
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@ import android.content.res.Configuration
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.annotations.EnableFlags
import android.view.ContextThemeWrapper
import android.view.ContextThemeWrapper
import android.view.ViewTreeObserver
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
import com.android.internal.logging.MetricsLogger
import com.android.internal.logging.MetricsLogger
@@ -27,6 +28,7 @@ import com.android.internal.logging.testing.UiEventLoggerFake
import com.android.systemui.Flags
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager
import com.android.systemui.dump.DumpManager
import com.android.systemui.flags.DisableSceneContainer
import com.android.systemui.haptics.qs.QSLongPressEffect
import com.android.systemui.haptics.qs.QSLongPressEffect
import com.android.systemui.media.controls.domain.pipeline.interactor.MediaCarouselInteractor
import com.android.systemui.media.controls.domain.pipeline.interactor.MediaCarouselInteractor
import com.android.systemui.media.controls.ui.view.MediaHost
import com.android.systemui.media.controls.ui.view.MediaHost
@@ -35,11 +37,13 @@ import com.android.systemui.plugins.qs.QSTile
import com.android.systemui.qs.customize.QSCustomizerController
import com.android.systemui.qs.customize.QSCustomizerController
import com.android.systemui.qs.logging.QSLogger
import com.android.systemui.qs.logging.QSLogger
import com.android.systemui.res.R
import com.android.systemui.res.R
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener
import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController
import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController
import com.android.systemui.util.leak.RotationUtils
import com.android.systemui.util.leak.RotationUtils
import javax.inject.Provider
import javax.inject.Provider
import kotlinx.coroutines.flow.MutableStateFlow
import org.junit.After
import org.junit.After
import org.junit.Before
import org.junit.Before
import org.junit.Test
import org.junit.Test
@@ -71,6 +75,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
    @Mock private lateinit var longPressEffectProvider: Provider<QSLongPressEffect>
    @Mock private lateinit var longPressEffectProvider: Provider<QSLongPressEffect>
    @Mock private lateinit var mediaCarouselInteractor: MediaCarouselInteractor
    @Mock private lateinit var mediaCarouselInteractor: MediaCarouselInteractor
    @Mock private lateinit var configurationController: ConfigurationController
    @Mock private lateinit var configurationController: ConfigurationController
    @Mock private lateinit var mockViewTreeObserver: ViewTreeObserver


    private val usingMediaPlayer: Boolean
    private val usingMediaPlayer: Boolean
        get() = false
        get() = false
@@ -93,6 +98,16 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
        whenever(quickQSPanel.context)
        whenever(quickQSPanel.context)
            .thenReturn(ContextThemeWrapper(context, R.style.Theme_SystemUI_QuickSettings))
            .thenReturn(ContextThemeWrapper(context, R.style.Theme_SystemUI_QuickSettings))


        // When SceneContainerFlag is enabled, QSPanelControllerBase.onInit calls
        // registerForMediaInteractorChanges. This in turn calls JavaAdapterKt.collectFlow,
        // which requires specific mocks for MediaCarouselInteractor and the View's
        // ViewTreeObserver to prevent NullPointerExceptions during test setup.
        if (SceneContainerFlag.isEnabled) {
            whenever(mediaCarouselInteractor.hasActiveMedia).thenReturn(MutableStateFlow(false))
            whenever(quickQSPanel.viewTreeObserver).thenReturn(mockViewTreeObserver)
            whenever(mockViewTreeObserver.isAlive).thenReturn(true)
        }

        controller =
        controller =
            TestQuickQSPanelController(
            TestQuickQSPanelController(
                quickQSPanel,
                quickQSPanel,
@@ -141,6 +156,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() {


    @Test
    @Test
    @DisableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
    @DisableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
    @DisableSceneContainer
    fun mediaExpansion_afterConfigChange_inLandscape_collapsedInLandscapeTrue_updatesToCollapsed_old() {
    fun mediaExpansion_afterConfigChange_inLandscape_collapsedInLandscapeTrue_updatesToCollapsed_old() {
        verify(quickQSPanel).addOnConfigurationChangedListener(captor.capture())
        verify(quickQSPanel).addOnConfigurationChangedListener(captor.capture())


@@ -157,6 +173,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() {


    @Test
    @Test
    @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
    @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
    @DisableSceneContainer
    fun mediaExpansion_afterConfigChange_inLandscape_collapsedInLandscapeTrue_updatesToCollapsed() {
    fun mediaExpansion_afterConfigChange_inLandscape_collapsedInLandscapeTrue_updatesToCollapsed() {
        verify(configurationController).addCallback(configCaptor.capture())
        verify(configurationController).addCallback(configCaptor.capture())


@@ -173,6 +190,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() {


    @Test
    @Test
    @DisableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
    @DisableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
    @DisableSceneContainer
    fun mediaExpansion_afterConfigChange_landscape_collapsedInLandscapeFalse_remainsExpanded_old() {
    fun mediaExpansion_afterConfigChange_landscape_collapsedInLandscapeFalse_remainsExpanded_old() {
        verify(quickQSPanel).addOnConfigurationChangedListener(captor.capture())
        verify(quickQSPanel).addOnConfigurationChangedListener(captor.capture())
        reset(mediaHost)
        reset(mediaHost)
@@ -186,6 +204,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() {


    @Test
    @Test
    @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
    @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND)
    @DisableSceneContainer
    fun mediaExpansion_afterConfigChange_landscape_collapsedInLandscapeFalse_remainsExpanded() {
    fun mediaExpansion_afterConfigChange_landscape_collapsedInLandscapeFalse_remainsExpanded() {
        verify(configurationController).addCallback(configCaptor.capture())
        verify(configurationController).addCallback(configCaptor.capture())
        reset(mediaHost)
        reset(mediaHost)