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
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index dd81b65..4e7bd21 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.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 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 f3d071e..6e09f22 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.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 @@ 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 @@ 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 @@ 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 @@ 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 @@ protected void onViewDetached() { mTunerService.removeTunable(mView); mView.removeOnConfigurationChangedListener(mOnConfigurationChangedListener); - if (mBrightnessMirrorController != null) { - mBrightnessMirrorController.removeCallback(mBrightnessMirrorListener); - } + mBrightnessMirrorHandler.onQsPanelDettached(); super.onViewDetached(); } @@ -196,23 +188,8 @@ } } - /** */ 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 7c81abc..14374ff 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 @@ 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 @@ */ class QuickQSBrightnessController @VisibleForTesting constructor( private val brightnessControllerFactory: () -> BrightnessController -) { +) : MirroredBrightnessController { @Inject constructor( brightnessControllerFactory: BrightnessController.Factory, @@ -42,6 +44,7 @@ private var isListening = false private var brightnessController: BrightnessController? = null + private var mirrorController: BrightnessMirrorController? = null fun init(shouldUseSplitNotificationShade: Boolean) { refreshVisibility(shouldUseSplitNotificationShade) @@ -77,6 +80,11 @@ } } + override fun setMirror(controller: BrightnessMirrorController) { + mirrorController = controller + mirrorController?.let { brightnessController?.setMirror(it) } + } + private fun hideBrightnessSlider() { brightnessController?.hideSlider() } @@ -84,11 +92,10 @@ 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 74cd50c..8c7a2cd 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.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 @@ // 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 @@ super(view, qsTileHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger, uiEventLogger, qsLogger, dumpManager); mBrightnessController = quickQSBrightnessController; + mBrightnessMirrorHandler = new BrightnessMirrorHandler(mBrightnessController); } @Override @@ -78,12 +82,14 @@ 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 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 a9ebcad..185b8ef 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.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 @@ 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 0000000..51aa339 --- /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 896106a..7dc9e8b 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.ViewGroup; import android.widget.SeekBar; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.settingslib.RestrictedLockUtils; @@ -138,15 +139,9 @@ * @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 0000000..8d857de --- /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 5de22d4..3ef4ad2 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 @@ import android.view.MotionEvent; +import androidx.annotation.NonNull; + import com.android.settingslib.RestrictedLockUtils; import com.android.systemui.statusbar.policy.BrightnessMirrorController; @@ -27,7 +29,7 @@ } 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 10d5d57..e29d026 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 @@ 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 f8373ff..de1d86b 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 @@ 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 @@ 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 e0187bd..bceb928 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
@@ -108,15 +108,6 @@ } @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)