diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index f754494045d26..4e09bc65a3a3c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -52,6 +52,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; @@ -414,6 +415,12 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca return mQSPanelController; } + public void setBrightnessMirrorController( + BrightnessMirrorController brightnessMirrorController) { + mQSPanelController.setBrightnessMirror(brightnessMirrorController); + mQuickQSPanelController.setBrightnessMirror(brightnessMirrorController); + } + @Override public boolean isShowingDetail() { return mQSCustomizerController.isCustomizing() || mQSDetail.isShowingDetail(); 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..b0e320ad1e2fb 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSlider.java +++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSlider.java @@ -140,13 +140,7 @@ public class BrightnessSlider extends ViewController imple @Override public void setMirrorControllerAndMirror(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/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 6cafa0da523aa..0bd2caed573bb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1365,7 +1365,7 @@ public class StatusBar extends SystemUI implements 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)