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

Commit 5aee8c5d authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Remove QQS brightness controller"

parents 3445cdb0 119975a7
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -420,7 +420,6 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
    public void setBrightnessMirrorController(
            BrightnessMirrorController brightnessMirrorController) {
        mQSPanelController.setBrightnessMirror(brightnessMirrorController);
        mQuickQSPanelController.setBrightnessMirror(brightnessMirrorController);
    }

    @Override
+0 −102
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 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.qs

import androidx.annotation.VisibleForTesting
import com.android.systemui.settings.brightness.BrightnessController
import com.android.systemui.settings.brightness.BrightnessSliderController
import com.android.systemui.settings.brightness.MirroredBrightnessController
import com.android.systemui.statusbar.policy.BrightnessMirrorController
import javax.inject.Inject

/**
 * Controls brightness slider in QQS, which is visible only in split shade. It's responsible for
 * showing/hiding it when appropriate and (un)registering listeners
 */
class QuickQSBrightnessController @VisibleForTesting constructor(
    private val brightnessControllerFactory: () -> BrightnessController
) : MirroredBrightnessController {

    @Inject constructor(
        brightnessControllerFactory: BrightnessController.Factory,
        brightnessSliderControllerFactory: BrightnessSliderController.Factory,
        quickQSPanel: QuickQSPanel
    ) : this(brightnessControllerFactory = {
            val slider = brightnessSliderControllerFactory.create(quickQSPanel.context,
                    quickQSPanel)
            slider.init()
            quickQSPanel.setBrightnessView(slider.rootView)
            brightnessControllerFactory.create(slider)
        })

    private var isListening = false
    private var brightnessController: BrightnessController? = null
    private var mirrorController: BrightnessMirrorController? = null

    fun init(shouldUseSplitNotificationShade: Boolean) {
        refreshVisibility(shouldUseSplitNotificationShade)
    }

    /**
     * Starts/Stops listening for brightness changing events.
     * It's fine to call this function even if slider is not visible (which would be the case for
     * all small screen devices), it will just do nothing in that case
     */
    fun setListening(listening: Boolean) {
        if (listening) {
            // controller can be null when slider was never shown
            if (!isListening && brightnessController != null) {
                brightnessController?.registerCallbacks()
                isListening = true
            }
        } else {
            brightnessController?.unregisterCallbacks()
            isListening = false
        }
    }

    fun checkRestrictionAndSetEnabled() {
        brightnessController?.checkRestrictionAndSetEnabled()
    }

    fun refreshVisibility(shouldUseSplitNotificationShade: Boolean) {
        if (shouldUseSplitNotificationShade) {
            showBrightnessSlider()
        } else {
            hideBrightnessSlider()
        }
    }

    override fun setMirror(controller: BrightnessMirrorController) {
        mirrorController = controller
        mirrorController?.let { brightnessController?.setMirror(it) }
    }

    private fun hideBrightnessSlider() {
        brightnessController?.hideSlider()
    }

    private fun showBrightnessSlider() {
        if (brightnessController == null) {
            brightnessController = brightnessControllerFactory()
            mirrorController?.also { brightnessController?.setMirror(it) }
            brightnessController?.registerCallbacks()
            isListening = true
        }
        brightnessController?.showSlider()
    }
}
+1 −25
Original line number Diff line number Diff line
@@ -33,8 +33,6 @@ import com.android.systemui.plugins.qs.QSTile;
import com.android.systemui.qs.customize.QSCustomizerController;
import com.android.systemui.qs.dagger.QSScope;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.settings.brightness.BrightnessMirrorHandler;
import com.android.systemui.statusbar.policy.BrightnessMirrorController;
import com.android.systemui.util.leak.RotationUtils;

import java.util.ArrayList;
@@ -55,10 +53,6 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel>
                }
            };

    // brightness is visible only in split shade
    private final QuickQSBrightnessController mBrightnessController;
    private final BrightnessMirrorHandler mBrightnessMirrorHandler;

    private final MediaFlags mMediaFlags;
    private final boolean mUsingCollapsedLandscapeMedia;

@@ -70,13 +64,10 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel>
            @Named(QS_USING_COLLAPSED_LANDSCAPE_MEDIA) boolean usingCollapsedLandscapeMedia,
            MediaFlags mediaFlags,
            MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger,
            DumpManager dumpManager,
            QuickQSBrightnessController quickQSBrightnessController
            DumpManager dumpManager
    ) {
        super(view, qsTileHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger,
                uiEventLogger, qsLogger, dumpManager);
        mBrightnessController = quickQSBrightnessController;
        mBrightnessMirrorHandler = new BrightnessMirrorHandler(mBrightnessController);
        mUsingCollapsedLandscapeMedia = usingCollapsedLandscapeMedia;
        mMediaFlags = mediaFlags;
    }
@@ -87,7 +78,6 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel>
        updateMediaExpansion();
        mMediaHost.setShowsOnlyActiveMedia(true);
        mMediaHost.init(MediaHierarchyManager.LOCATION_QQS);
        mBrightnessController.init(mShouldUseSplitNotificationShade);
    }

    private void updateMediaExpansion() {
@@ -111,20 +101,17 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel>
    protected void onViewAttached() {
        super.onViewAttached();
        mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener);
        mBrightnessMirrorHandler.onQsPanelAttached();
    }

    @Override
    protected void onViewDetached() {
        super.onViewDetached();
        mView.removeOnConfigurationChangedListener(mOnConfigurationChangedListener);
        mBrightnessMirrorHandler.onQsPanelDettached();
    }

    @Override
    void setListening(boolean listening) {
        super.setListening(listening);
        mBrightnessController.setListening(listening);
    }

    public boolean isListening() {
@@ -136,15 +123,8 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel>
        setTiles();
    }

    @Override
    public void refreshAllTiles() {
        mBrightnessController.checkRestrictionAndSetEnabled();
        super.refreshAllTiles();
    }

    @Override
    protected void onConfigurationChanged() {
        mBrightnessController.refreshVisibility(mShouldUseSplitNotificationShade);
        updateMediaExpansion();
    }

@@ -168,8 +148,4 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel>
    public int getNumQuickTiles() {
        return mView.getNumQuickTiles();
    }

    public void setBrightnessMirror(BrightnessMirrorController brightnessMirrorController) {
        mBrightnessMirrorHandler.setController(brightnessMirrorController);
    }
}
+0 −118
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 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.qs

import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.settings.brightness.BrightnessController
import com.android.systemui.statusbar.policy.BrightnessMirrorController
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mockito.Mock
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.mockito.Mockito.never
import org.mockito.Mockito.mock
import org.mockito.junit.MockitoJUnit

@SmallTest
class QuickQSBrightnessControllerTest : SysuiTestCase() {

    @Mock
    lateinit var brightnessController: BrightnessController
    @get:Rule
    val mockito = MockitoJUnit.rule()

    lateinit var quickQSBrightnessController: QuickQSBrightnessController

    @Before
    fun setUp() {
        quickQSBrightnessController = QuickQSBrightnessController(
                brightnessControllerFactory = { brightnessController })
    }

    @Test
    fun testSliderIsShownWhenInitializedInSplitShade() {
        quickQSBrightnessController.init(shouldUseSplitNotificationShade = true)

        verify(brightnessController).showSlider()
    }

    @Test
    fun testSliderIsShownWhenRefreshedInSplitShade() {
        quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = true)

        verify(brightnessController, times(1)).showSlider()
    }

    @Test
    fun testSliderIsHiddenWhenRefreshedInNonSplitShade() {
        // needs to be shown first
        quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = true)
        quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = false)

        verify(brightnessController).hideSlider()
    }

    @Test
    fun testSliderChangesVisibilityWhenRotating() {
        quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = true)
        verify(brightnessController, times(1)).showSlider()

        quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = false)
        verify(brightnessController, times(1)).hideSlider()
    }

    @Test
    fun testCallbacksAreRegisteredOnlyOnce() {
        // this flow simulates expanding shade in portrait...
        quickQSBrightnessController.setListening(true)
        quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = false)
        // ... and rotating to landscape/split shade where slider is visible
        quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = true)

        verify(brightnessController, times(1)).registerCallbacks()
    }

    @Test
    fun testCallbacksAreRegisteredOnlyOnceWhenRotatingPhone() {
        quickQSBrightnessController.setListening(true)
        quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = true)
        quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = false)
        quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = true)

        verify(brightnessController, times(1)).registerCallbacks()
    }

    @Test
    fun testCallbacksAreNotRegisteredWhenSliderNotVisible() {
        quickQSBrightnessController.setListening(true)
        quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = false)

        verify(brightnessController, never()).registerCallbacks()
    }

    @Test
    fun testMirrorIsSetWhenSliderIsShown() {
        val mirrorController = mock(BrightnessMirrorController::class.java)
        quickQSBrightnessController.setMirror(mirrorController)
        quickQSBrightnessController.refreshVisibility(shouldUseSplitNotificationShade = true)

        verify(brightnessController).setMirror(mirrorController)
    }
}
 No newline at end of file
+3 −17
Original line number Diff line number Diff line
@@ -71,8 +71,6 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
    private lateinit var tileLayout: TileLayout
    @Mock
    private lateinit var tileView: QSTileView
    @Mock
    private lateinit var quickQsBrightnessController: QuickQSBrightnessController
    @Captor
    private lateinit var captor: ArgumentCaptor<QSPanel.OnConfigurationChangedListener>

@@ -100,8 +98,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
                metricsLogger,
                uiEventLogger,
                qsLogger,
                dumpManager,
                quickQsBrightnessController
                dumpManager
        )

        controller.init()
@@ -132,16 +129,6 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
        verify(quickQSPanel, times(limit)).addTile(any())
    }

    @Test
    fun testBrightnessRefreshedWhenConfigurationChanged() {
        // times(2) because both controller and base controller are registering their listeners
        verify(quickQSPanel, times(2)).addOnConfigurationChangedListener(captor.capture())

        captor.allValues.forEach { it.onConfigurationChange(Configuration.EMPTY) }

        verify(quickQsBrightnessController).refreshVisibility(anyBoolean())
    }

    @Test
    fun testMediaExpansionUpdatedWhenConfigurationChanged() {
        `when`(mediaFlags.useMediaSessionLayout()).thenReturn(true)
@@ -171,11 +158,10 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
        metricsLogger: MetricsLogger,
        uiEventLogger: UiEventLoggerFake,
        qsLogger: QSLogger,
        dumpManager: DumpManager,
        quickQSBrightnessController: QuickQSBrightnessController
        dumpManager: DumpManager
    ) : QuickQSPanelController(view, qsTileHost, qsCustomizerController, usingMediaPlayer,
        mediaHost, usingCollapsedLandscapeMedia, mediaFlags, metricsLogger, uiEventLogger, qsLogger,
        dumpManager, quickQSBrightnessController) {
        dumpManager) {

        private var rotation = RotationUtils.ROTATION_NONE