From 263e907c1b31fa1da4bbb4ba5bcdbf27840e4d6b Mon Sep 17 00:00:00 2001 From: Michal Brzezinski Date: Fri, 16 Jul 2021 19:15:03 +0100 Subject: [PATCH] Making mirror slider appear when brightness slider is used in split shade This change is mostly about QuickQSPanelController which should have very similar brightness mirror logic to QSPanelController. They have common base class QSPanelControllerBase which could be used for sharing the logic, but: - brightness slider logic differs a bit and it would be cumbersome to share brightness slider logic in base class - from above, it would be weird to have brightness mirror logic in base class, but not brightness logic - favour composition over inheritance That's why brightness mirror logic was extracted to BrightnessMirrorHandler and a few duplicated lines remain. Bug: 193651759 Test: QuickQSBrightnessControllerTest Change-Id: Iea604092cd84f1da96cdbc5cd085babc0dc2bb49 --- .../com/android/systemui/qs/QSFragment.java | 7 ++- .../systemui/qs/QSPanelController.java | 37 +++------------ .../qs/QuickQSBrightnessController.kt | 17 +++++-- .../systemui/qs/QuickQSPanelController.java | 10 ++++ .../brightness/BrightnessController.java | 8 +++- .../brightness/BrightnessMirrorHandler.kt | 46 +++++++++++++++++++ .../settings/brightness/BrightnessSlider.java | 11 ++--- .../MirroredBrightnessController.kt | 26 +++++++++++ .../settings/brightness/ToggleSlider.java | 4 +- .../systemui/statusbar/phone/StatusBar.java | 3 +- .../qs/QuickQSBrightnessControllerTest.kt | 13 +++++- .../brightness/BrightnessSliderTest.kt | 9 ---- 12 files changed, 132 insertions(+), 59 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessMirrorHandler.kt create mode 100644 packages/SystemUI/src/com/android/systemui/settings/brightness/MirroredBrightnessController.kt diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index dd81b65723b9f..4e7bd210eab5b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -50,6 +50,7 @@ import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer; +import com.android.systemui.statusbar.policy.BrightnessMirrorController; import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler; import com.android.systemui.util.InjectionInflationController; import com.android.systemui.util.LifecycleFragment; @@ -403,8 +404,10 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca } } - public QSPanelController getQSPanelController() { - return mQSPanelController; + public void setBrightnessMirrorController( + BrightnessMirrorController brightnessMirrorController) { + mQSPanelController.setBrightnessMirror(brightnessMirrorController); + mQuickQSPanelController.setBrightnessMirror(brightnessMirrorController); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java index f3d071e900e30..6e09f22fba631 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java @@ -40,6 +40,7 @@ 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.BrightnessController; +import com.android.systemui.settings.brightness.BrightnessMirrorHandler; import com.android.systemui.settings.brightness.BrightnessSlider; import com.android.systemui.statusbar.policy.BrightnessMirrorController; import com.android.systemui.tuner.TunerService; @@ -60,10 +61,9 @@ public class QSPanelController extends QSPanelControllerBase { private final QSTileRevealController.Factory mQsTileRevealControllerFactory; private final FalsingManager mFalsingManager; private final BrightnessController mBrightnessController; - private final BrightnessSlider.Factory mBrightnessSliderFactory; private final BrightnessSlider mBrightnessSlider; + private final BrightnessMirrorHandler mBrightnessMirrorHandler; - private BrightnessMirrorController mBrightnessMirrorController; private boolean mGridContentVisible = true; private final QSPanel.OnConfigurationChangedListener mOnConfigurationChangedListener = @@ -75,14 +75,10 @@ public class QSPanelController extends QSPanelControllerBase { if (mView.isListening()) { refreshAllTiles(); } - updateBrightnessMirror(); mView.switchSecurityFooter(mShouldUseSplitNotificationShade); } }; - private final BrightnessMirrorController.BrightnessMirrorListener mBrightnessMirrorListener = - mirror -> updateBrightnessMirror(); - private View.OnTouchListener mTileLayoutTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { @@ -110,12 +106,12 @@ public class QSPanelController extends QSPanelControllerBase { mQsTileRevealControllerFactory = qsTileRevealControllerFactory; mFalsingManager = falsingManager; mQsSecurityFooter.setHostEnvironment(qstileHost); - mBrightnessSliderFactory = brightnessSliderFactory; - mBrightnessSlider = mBrightnessSliderFactory.create(getContext(), mView); + mBrightnessSlider = brightnessSliderFactory.create(getContext(), mView); mView.setBrightnessView(mBrightnessSlider.getRootView()); mBrightnessController = brightnessControllerFactory.create(mBrightnessSlider); + mBrightnessMirrorHandler = new BrightnessMirrorHandler(mBrightnessController); } @Override @@ -142,9 +138,7 @@ public class QSPanelController extends QSPanelControllerBase { mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener); mView.setSecurityFooter(mQsSecurityFooter.getView(), mShouldUseSplitNotificationShade); switchTileLayout(true); - if (mBrightnessMirrorController != null) { - mBrightnessMirrorController.addCallback(mBrightnessMirrorListener); - } + mBrightnessMirrorHandler.onQsPanelAttached(); ((PagedTileLayout) mView.getOrCreateTileLayout()) .setOnTouchListener(mTileLayoutTouchListener); @@ -160,9 +154,7 @@ public class QSPanelController extends QSPanelControllerBase { protected void onViewDetached() { mTunerService.removeTunable(mView); mView.removeOnConfigurationChangedListener(mOnConfigurationChangedListener); - if (mBrightnessMirrorController != null) { - mBrightnessMirrorController.removeCallback(mBrightnessMirrorListener); - } + mBrightnessMirrorHandler.onQsPanelDettached(); super.onViewDetached(); } @@ -196,23 +188,8 @@ public class QSPanelController extends QSPanelControllerBase { } } - /** */ public void setBrightnessMirror(BrightnessMirrorController brightnessMirrorController) { - mBrightnessMirrorController = brightnessMirrorController; - if (mBrightnessMirrorController != null) { - mBrightnessMirrorController.removeCallback(mBrightnessMirrorListener); - } - mBrightnessMirrorController = brightnessMirrorController; - if (mBrightnessMirrorController != null) { - mBrightnessMirrorController.addCallback(mBrightnessMirrorListener); - } - updateBrightnessMirror(); - } - - private void updateBrightnessMirror() { - if (mBrightnessMirrorController != null) { - mBrightnessSlider.setMirrorControllerAndMirror(mBrightnessMirrorController); - } + mBrightnessMirrorHandler.setController(brightnessMirrorController); } /** Get the QSTileHost this panel uses. */ diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSBrightnessController.kt b/packages/SystemUI/src/com/android/systemui/qs/QuickQSBrightnessController.kt index 7c81abcfe5840..14374ffe9f897 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSBrightnessController.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSBrightnessController.kt @@ -19,6 +19,8 @@ package com.android.systemui.qs import androidx.annotation.VisibleForTesting import com.android.systemui.settings.brightness.BrightnessController import com.android.systemui.settings.brightness.BrightnessSlider +import com.android.systemui.settings.brightness.MirroredBrightnessController +import com.android.systemui.statusbar.policy.BrightnessMirrorController import javax.inject.Inject /** @@ -27,7 +29,7 @@ import javax.inject.Inject */ class QuickQSBrightnessController @VisibleForTesting constructor( private val brightnessControllerFactory: () -> BrightnessController -) { +) : MirroredBrightnessController { @Inject constructor( brightnessControllerFactory: BrightnessController.Factory, @@ -42,6 +44,7 @@ class QuickQSBrightnessController @VisibleForTesting constructor( private var isListening = false private var brightnessController: BrightnessController? = null + private var mirrorController: BrightnessMirrorController? = null fun init(shouldUseSplitNotificationShade: Boolean) { refreshVisibility(shouldUseSplitNotificationShade) @@ -77,6 +80,11 @@ class QuickQSBrightnessController @VisibleForTesting constructor( } } + override fun setMirror(controller: BrightnessMirrorController) { + mirrorController = controller + mirrorController?.let { brightnessController?.setMirror(it) } + } + private fun hideBrightnessSlider() { brightnessController?.hideSlider() } @@ -84,11 +92,10 @@ class QuickQSBrightnessController @VisibleForTesting constructor( private fun showBrightnessSlider() { if (brightnessController == null) { brightnessController = brightnessControllerFactory() - } - brightnessController?.showSlider() - if (!isListening) { + mirrorController?.also { brightnessController?.setMirror(it) } brightnessController?.registerCallbacks() isListening = true } + brightnessController?.showSlider() } -} \ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java index 74cd50c3f2668..8c7a2cda271af 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java @@ -29,6 +29,8 @@ 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; @@ -50,6 +52,7 @@ public class QuickQSPanelController extends QSPanelControllerBase // brightness is visible only in split shade private final QuickQSBrightnessController mBrightnessController; + private final BrightnessMirrorHandler mBrightnessMirrorHandler; @Inject QuickQSPanelController(QuickQSPanel view, QSTileHost qsTileHost, @@ -63,6 +66,7 @@ public class QuickQSPanelController extends QSPanelControllerBase super(view, qsTileHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger, uiEventLogger, qsLogger, dumpManager); mBrightnessController = quickQSBrightnessController; + mBrightnessMirrorHandler = new BrightnessMirrorHandler(mBrightnessController); } @Override @@ -78,12 +82,14 @@ public class QuickQSPanelController extends QSPanelControllerBase protected void onViewAttached() { super.onViewAttached(); mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener); + mBrightnessMirrorHandler.onQsPanelAttached(); } @Override protected void onViewDetached() { super.onViewDetached(); mView.removeOnConfigurationChangedListener(mOnConfigurationChangedListener); + mBrightnessMirrorHandler.onQsPanelDettached(); } @Override @@ -132,4 +138,8 @@ public class QuickQSPanelController extends QSPanelControllerBase public int getNumQuickTiles() { return mView.getNumQuickTiles(); } + + public void setBrightnessMirror(BrightnessMirrorController brightnessMirrorController) { + mBrightnessMirrorHandler.setController(brightnessMirrorController); + } } diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java index a9ebcad8304f8..185b8ef04c4c4 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java +++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java @@ -50,12 +50,13 @@ import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.systemui.Dependency; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.settings.CurrentUserTracker; +import com.android.systemui.statusbar.policy.BrightnessMirrorController; import java.util.ArrayList; import javax.inject.Inject; -public class BrightnessController implements ToggleSlider.Listener { +public class BrightnessController implements ToggleSlider.Listener, MirroredBrightnessController { private static final String TAG = "StatusBar.BrightnessController"; private static final int SLIDER_ANIMATION_DURATION = 3000; @@ -109,6 +110,11 @@ public class BrightnessController implements ToggleSlider.Listener { private ValueAnimator mSliderAnimator; + @Override + public void setMirror(BrightnessMirrorController controller) { + mControl.setMirrorControllerAndMirror(controller); + } + public interface BrightnessStateChangeCallback { /** Indicates that some of the brightness settings have changed */ void onBrightnessLevelChanged(); diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessMirrorHandler.kt b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessMirrorHandler.kt new file mode 100644 index 0000000000000..51aa339149a42 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessMirrorHandler.kt @@ -0,0 +1,46 @@ +/* + * 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.settings.brightness + +import com.android.systemui.statusbar.policy.BrightnessMirrorController +import com.android.systemui.statusbar.policy.BrightnessMirrorController.BrightnessMirrorListener + +class BrightnessMirrorHandler(private val brightnessController: MirroredBrightnessController) { + + private var mirrorController: BrightnessMirrorController? = null + + private val brightnessMirrorListener = BrightnessMirrorListener { updateBrightnessMirror() } + + fun onQsPanelAttached() { + mirrorController?.addCallback(brightnessMirrorListener) + } + + fun onQsPanelDettached() { + mirrorController?.removeCallback(brightnessMirrorListener) + } + + fun setController(controller: BrightnessMirrorController) { + mirrorController?.removeCallback(brightnessMirrorListener) + mirrorController = controller + mirrorController?.addCallback(brightnessMirrorListener) + updateBrightnessMirror() + } + + private fun updateBrightnessMirror() { + mirrorController?.let { brightnessController.setMirror(it) } + } +} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSlider.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSlider.java index 896106a82fe43..7dc9e8ba0edba 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSlider.java +++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSlider.java @@ -23,6 +23,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.SeekBar; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.settingslib.RestrictedLockUtils; @@ -138,15 +139,9 @@ public class BrightnessSlider extends ViewController imple * @param c */ @Override - public void setMirrorControllerAndMirror(BrightnessMirrorController c) { + public void setMirrorControllerAndMirror(@NonNull BrightnessMirrorController c) { mMirrorController = c; - if (c != null) { - setMirror(c.getToggleSlider()); - } else { - // If there's no mirror, we may be the ones dispatching, events but we should not mirror - // them - mView.setOnDispatchTouchEventListener(null); - } + setMirror(c.getToggleSlider()); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/MirroredBrightnessController.kt b/packages/SystemUI/src/com/android/systemui/settings/brightness/MirroredBrightnessController.kt new file mode 100644 index 0000000000000..8d857dec2108b --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/MirroredBrightnessController.kt @@ -0,0 +1,26 @@ +/* + * 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.settings.brightness + +import com.android.systemui.statusbar.policy.BrightnessMirrorController + +/** + * Indicates controller that has brightness slider and uses [BrightnessMirrorController] + */ +interface MirroredBrightnessController { + fun setMirror(controller: BrightnessMirrorController) +} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSlider.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSlider.java index 5de22d43a21b8..3ef4ad2231207 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSlider.java +++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSlider.java @@ -18,6 +18,8 @@ package com.android.systemui.settings.brightness; import android.view.MotionEvent; +import androidx.annotation.NonNull; + import com.android.settingslib.RestrictedLockUtils; import com.android.systemui.statusbar.policy.BrightnessMirrorController; @@ -27,7 +29,7 @@ public interface ToggleSlider { } void setEnforcedAdmin(RestrictedLockUtils.EnforcedAdmin admin); - void setMirrorControllerAndMirror(BrightnessMirrorController c); + void setMirrorControllerAndMirror(@NonNull BrightnessMirrorController c); boolean mirrorTouchEvent(MotionEvent ev); void setOnChangedListener(Listener l); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 10d5d571ef50c..e29d026129219 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1309,8 +1309,7 @@ public class StatusBar extends SystemUI implements DemoMode, fragmentHostManager.addTagListener(QS.TAG, (tag, f) -> { QS qs = (QS) f; if (qs instanceof QSFragment) { - mQSPanelController = ((QSFragment) qs).getQSPanelController(); - mQSPanelController.setBrightnessMirror(mBrightnessMirrorController); + ((QSFragment) qs).setBrightnessMirrorController(mBrightnessMirrorController); } }); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSBrightnessControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSBrightnessControllerTest.kt index f8373ffca955a..de1d86b08785b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSBrightnessControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSBrightnessControllerTest.kt @@ -19,13 +19,15 @@ 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.verify 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 @@ -104,4 +106,13 @@ class QuickQSBrightnessControllerTest : SysuiTestCase() { 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 diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderTest.kt index e0187bdf6adaf..bceb92894609e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderTest.kt @@ -107,15 +107,6 @@ class BrightnessSliderTest : SysuiTestCase() { verify(brightnessSliderView).setEnforcedAdmin(enforcedAdmin) } - @Test - fun testNullMirrorControllerNotTrackingTouch() { - mController.setMirrorControllerAndMirror(null) - - verify(brightnessSliderView, never()).max - verify(brightnessSliderView, never()).value - verify(brightnessSliderView).setOnDispatchTouchEventListener(isNull()) - } - @Test fun testNullMirrorNotTrackingTouch() { whenever(mirrorController.toggleSlider).thenReturn(null)