1 /* 2 * Copyright (C) 2020 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.systemui.qs; 18 19 import static com.android.systemui.classifier.Classifier.QS_SWIPE_SIDE; 20 import static com.android.systemui.media.dagger.MediaModule.QS_PANEL; 21 import static com.android.systemui.qs.QSPanel.QS_SHOW_BRIGHTNESS; 22 import static com.android.systemui.qs.dagger.QSFragmentModule.QS_USING_MEDIA_PLAYER; 23 24 import android.view.MotionEvent; 25 import android.view.View; 26 27 import com.android.internal.logging.MetricsLogger; 28 import com.android.internal.logging.UiEventLogger; 29 import com.android.systemui.dump.DumpManager; 30 import com.android.systemui.media.controls.ui.MediaHierarchyManager; 31 import com.android.systemui.media.controls.ui.MediaHost; 32 import com.android.systemui.media.controls.ui.MediaHostState; 33 import com.android.systemui.plugins.FalsingManager; 34 import com.android.systemui.qs.customize.QSCustomizerController; 35 import com.android.systemui.qs.dagger.QSScope; 36 import com.android.systemui.qs.logging.QSLogger; 37 import com.android.systemui.settings.brightness.BrightnessController; 38 import com.android.systemui.settings.brightness.BrightnessMirrorHandler; 39 import com.android.systemui.settings.brightness.BrightnessSliderController; 40 import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; 41 import com.android.systemui.statusbar.policy.BrightnessMirrorController; 42 import com.android.systemui.tuner.TunerService; 43 44 import javax.inject.Inject; 45 import javax.inject.Named; 46 47 /** 48 * Controller for {@link QSPanel}. 49 */ 50 @QSScope 51 public class QSPanelController extends QSPanelControllerBase<QSPanel> { 52 53 private final TunerService mTunerService; 54 private final QSCustomizerController mQsCustomizerController; 55 private final QSTileRevealController.Factory mQsTileRevealControllerFactory; 56 private final FalsingManager mFalsingManager; 57 private final BrightnessController mBrightnessController; 58 private final BrightnessSliderController mBrightnessSliderController; 59 private final BrightnessMirrorHandler mBrightnessMirrorHandler; 60 private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; 61 62 private View.OnTouchListener mTileLayoutTouchListener = new View.OnTouchListener() { 63 @Override 64 public boolean onTouch(View v, MotionEvent event) { 65 if (event.getActionMasked() == MotionEvent.ACTION_UP) { 66 mFalsingManager.isFalseTouch(QS_SWIPE_SIDE); 67 } 68 return false; 69 } 70 }; 71 72 @Inject QSPanelController(QSPanel view, TunerService tunerService, QSHost qsHost, QSCustomizerController qsCustomizerController, @Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer, @Named(QS_PANEL) MediaHost mediaHost, QSTileRevealController.Factory qsTileRevealControllerFactory, DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger, BrightnessController.Factory brightnessControllerFactory, BrightnessSliderController.Factory brightnessSliderFactory, FalsingManager falsingManager, StatusBarKeyguardViewManager statusBarKeyguardViewManager)73 QSPanelController(QSPanel view, TunerService tunerService, 74 QSHost qsHost, QSCustomizerController qsCustomizerController, 75 @Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer, 76 @Named(QS_PANEL) MediaHost mediaHost, 77 QSTileRevealController.Factory qsTileRevealControllerFactory, 78 DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, 79 QSLogger qsLogger, BrightnessController.Factory brightnessControllerFactory, 80 BrightnessSliderController.Factory brightnessSliderFactory, 81 FalsingManager falsingManager, 82 StatusBarKeyguardViewManager statusBarKeyguardViewManager) { 83 super(view, qsHost, qsCustomizerController, usingMediaPlayer, mediaHost, 84 metricsLogger, uiEventLogger, qsLogger, dumpManager); 85 mTunerService = tunerService; 86 mQsCustomizerController = qsCustomizerController; 87 mQsTileRevealControllerFactory = qsTileRevealControllerFactory; 88 mFalsingManager = falsingManager; 89 90 mBrightnessSliderController = brightnessSliderFactory.create(getContext(), mView); 91 mView.setBrightnessView(mBrightnessSliderController.getRootView()); 92 93 mBrightnessController = brightnessControllerFactory.create(mBrightnessSliderController); 94 mBrightnessMirrorHandler = new BrightnessMirrorHandler(mBrightnessController); 95 mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; 96 } 97 98 @Override onInit()99 public void onInit() { 100 super.onInit(); 101 mMediaHost.setExpansion(MediaHostState.EXPANDED); 102 mMediaHost.setShowsOnlyActiveMedia(false); 103 mMediaHost.init(MediaHierarchyManager.LOCATION_QS); 104 mQsCustomizerController.init(); 105 mBrightnessSliderController.init(); 106 } 107 108 @Override onViewAttached()109 protected void onViewAttached() { 110 super.onViewAttached(); 111 112 updateMediaDisappearParameters(); 113 114 mTunerService.addTunable(mView, QS_SHOW_BRIGHTNESS); 115 mView.updateResources(); 116 if (mView.isListening()) { 117 refreshAllTiles(); 118 } 119 switchTileLayout(true); 120 mBrightnessMirrorHandler.onQsPanelAttached(); 121 PagedTileLayout pagedTileLayout= ((PagedTileLayout) mView.getOrCreateTileLayout()); 122 pagedTileLayout.setOnTouchListener(mTileLayoutTouchListener); 123 } 124 125 @Override createTileRevealController()126 protected QSTileRevealController createTileRevealController() { 127 return mQsTileRevealControllerFactory.create( 128 this, (PagedTileLayout) mView.getOrCreateTileLayout()); 129 } 130 131 @Override onViewDetached()132 protected void onViewDetached() { 133 mTunerService.removeTunable(mView); 134 mBrightnessMirrorHandler.onQsPanelDettached(); 135 super.onViewDetached(); 136 } 137 138 @Override onConfigurationChanged()139 protected void onConfigurationChanged() { 140 mView.updateResources(); 141 if (mView.isListening()) { 142 refreshAllTiles(); 143 } 144 } 145 146 @Override onSplitShadeChanged(boolean shouldUseSplitNotificationShade)147 protected void onSplitShadeChanged(boolean shouldUseSplitNotificationShade) { 148 ((PagedTileLayout) mView.getOrCreateTileLayout()) 149 .forceTilesRedistribution("Split shade state changed"); 150 mView.setCanCollapse(!shouldUseSplitNotificationShade); 151 } 152 153 /** */ setVisibility(int visibility)154 public void setVisibility(int visibility) { 155 mView.setVisibility(visibility); 156 } 157 158 /** */ setListening(boolean listening, boolean expanded)159 public void setListening(boolean listening, boolean expanded) { 160 setListening(listening && expanded); 161 162 // Set the listening as soon as the QS fragment starts listening regardless of the 163 //expansion, so it will update the current brightness before the slider is visible. 164 if (listening) { 165 mBrightnessController.registerCallbacks(); 166 } else { 167 mBrightnessController.unregisterCallbacks(); 168 } 169 } 170 setBrightnessMirror(BrightnessMirrorController brightnessMirrorController)171 public void setBrightnessMirror(BrightnessMirrorController brightnessMirrorController) { 172 mBrightnessMirrorHandler.setController(brightnessMirrorController); 173 } 174 175 /** Update appearance of QSPanel. */ updateResources()176 public void updateResources() { 177 mView.updateResources(); 178 } 179 180 /** Update state of all tiles. */ refreshAllTiles()181 public void refreshAllTiles() { 182 mBrightnessController.checkRestrictionAndSetEnabled(); 183 super.refreshAllTiles(); 184 } 185 186 /** Start customizing the Quick Settings. */ showEdit(View view)187 public void showEdit(View view) { 188 view.post(() -> { 189 if (!mQsCustomizerController.isCustomizing()) { 190 int[] loc = view.getLocationOnScreen(); 191 int x = loc[0] + view.getWidth() / 2; 192 int y = loc[1] + view.getHeight() / 2; 193 mQsCustomizerController.show(x, y, false); 194 } 195 }); 196 } 197 isLayoutRtl()198 public boolean isLayoutRtl() { 199 return mView.isLayoutRtl(); 200 } 201 202 /** */ setPageListener(PagedTileLayout.PageListener listener)203 public void setPageListener(PagedTileLayout.PageListener listener) { 204 mView.setPageListener(listener); 205 } 206 isShown()207 public boolean isShown() { 208 return mView.isShown(); 209 } 210 211 /** */ setContentMargins(int startMargin, int endMargin)212 public void setContentMargins(int startMargin, int endMargin) { 213 mView.setContentMargins(startMargin, endMargin, mMediaHost.getHostView()); 214 } 215 216 /** */ setFooterPageIndicator(PageIndicator pageIndicator)217 public void setFooterPageIndicator(PageIndicator pageIndicator) { 218 mView.setFooterPageIndicator(pageIndicator); 219 } 220 221 /** */ isExpanded()222 public boolean isExpanded() { 223 return mView.isExpanded(); 224 } 225 setPageMargin(int pageMargin)226 void setPageMargin(int pageMargin) { 227 mView.setPageMargin(pageMargin); 228 } 229 230 /** 231 * Determines if bouncer expansion is between 0 and 1 non-inclusive. 232 * 233 * @return if bouncer is in transit 234 */ isBouncerInTransit()235 public boolean isBouncerInTransit() { 236 return mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit(); 237 } 238 getPaddingBottom()239 public int getPaddingBottom() { 240 return mView.getPaddingBottom(); 241 } 242 } 243 244