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

Commit 4f110111 authored by Fabian Kozynski's avatar Fabian Kozynski Committed by Presubmit Automerger Backend
Browse files

[automerge] Remove QQS brightness controller 2p: 32b7c35f

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16850576


Change-Id: I45e28d1aebecf8be5434675883bd8f6ac7ac70e7
Merged-In: I63501bf573e006f52379192b7b766283fea40dda
parents ee83bd3a 32b7c35f
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -429,7 +429,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()
    }
}
+0 −23
Original line number Diff line number Diff line
@@ -30,8 +30,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 java.util.ArrayList;
import java.util.List;
@@ -51,9 +49,6 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel>
                }
            };

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

    @Inject
@@ -63,13 +58,10 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel>
            @Named(QUICK_QS_PANEL) MediaHost mediaHost,
            MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger,
            DumpManager dumpManager,
            QuickQSBrightnessController quickQSBrightnessController,
            @Named(QQS_FOOTER) FooterActionsController footerActionsController
    ) {
        super(view, qsTileHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger,
                uiEventLogger, qsLogger, dumpManager);
        mBrightnessController = quickQSBrightnessController;
        mBrightnessMirrorHandler = new BrightnessMirrorHandler(mBrightnessController);
        mFooterActionsController = footerActionsController;
    }

@@ -79,7 +71,6 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel>
        mMediaHost.setExpansion(0.0f);
        mMediaHost.setShowsOnlyActiveMedia(true);
        mMediaHost.init(MediaHierarchyManager.LOCATION_QQS);
        mBrightnessController.init(mShouldUseSplitNotificationShade);
        mFooterActionsController.init();
        mFooterActionsController.refreshVisibility(mShouldUseSplitNotificationShade);
    }
@@ -88,20 +79,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);
        mFooterActionsController.setListening(listening);
    }

@@ -114,15 +102,8 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel>
        setTiles();
    }

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

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

@@ -146,8 +127,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
+1 −6
Original line number Diff line number Diff line
@@ -67,8 +67,6 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
    @Mock
    private lateinit var tileView: QSTileView
    @Mock
    private lateinit var quickQsBrightnessController: QuickQSBrightnessController
    @Mock
    private lateinit var footerActionsController: FooterActionsController
    @Captor
    private lateinit var captor: ArgumentCaptor<QSPanel.OnConfigurationChangedListener>
@@ -95,7 +93,6 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
                uiEventLogger,
                qsLogger,
                dumpManager,
                quickQsBrightnessController,
                footerActionsController
        )

@@ -128,13 +125,11 @@ class QuickQSPanelControllerTest : SysuiTestCase() {
    }

    @Test
    fun testBrightnessAndFooterVisibilityRefreshedWhenConfigurationChanged() {
    fun testFooterVisibilityRefreshedWhenConfigurationChanged() {
        // 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())
        // times(2) because footer visibility is also refreshed on controller init
        verify(footerActionsController, times(2)).refreshVisibility(anyBoolean())
    }