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

Commit 32b7c35f authored by Fabian Kozynski's avatar Fabian Kozynski
Browse files

Remove QQS brightness controller

This was not being used and it was leaking ContentObservers

Test: heapdump, switching between splitshade and not splitshade many
times
Test: atest com.android.systemui.qs
Fixes: 218888308

Change-Id: I63501bf573e006f52379192b7b766283fea40dda
Merged-In: I63501bf573e006f52379192b7b766283fea40dda
parent a268d263
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -428,7 +428,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())
    }