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 private boolean mListening; 62 63 private View.OnTouchListener mTileLayoutTouchListener = new View.OnTouchListener() { 64 @Override 65 public boolean onTouch(View v, MotionEvent event) { 66 if (event.getActionMasked() == MotionEvent.ACTION_UP) { 67 mFalsingManager.isFalseTouch(QS_SWIPE_SIDE); 68 } 69 return false; 70 } 71 }; 72 73 @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)74 QSPanelController(QSPanel view, TunerService tunerService, 75 QSHost qsHost, QSCustomizerController qsCustomizerController, 76 @Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer, 77 @Named(QS_PANEL) MediaHost mediaHost, 78 QSTileRevealController.Factory qsTileRevealControllerFactory, 79 DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, 80 QSLogger qsLogger, BrightnessController.Factory brightnessControllerFactory, 81 BrightnessSliderController.Factory brightnessSliderFactory, 82 FalsingManager falsingManager, 83 StatusBarKeyguardViewManager statusBarKeyguardViewManager) { 84 super(view, qsHost, qsCustomizerController, usingMediaPlayer, mediaHost, 85 metricsLogger, uiEventLogger, qsLogger, dumpManager); 86 mTunerService = tunerService; 87 mQsCustomizerController = qsCustomizerController; 88 mQsTileRevealControllerFactory = qsTileRevealControllerFactory; 89 mFalsingManager = falsingManager; 90 91 mBrightnessSliderController = brightnessSliderFactory.create(getContext(), mView); 92 mView.setBrightnessView(mBrightnessSliderController.getRootView()); 93 94 mBrightnessController = brightnessControllerFactory.create(mBrightnessSliderController); 95 mBrightnessMirrorHandler = new BrightnessMirrorHandler(mBrightnessController); 96 mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; 97 } 98 99 @Override onInit()100 public void onInit() { 101 super.onInit(); 102 mMediaHost.setExpansion(MediaHostState.EXPANDED); 103 mMediaHost.setShowsOnlyActiveMedia(false); 104 mMediaHost.init(MediaHierarchyManager.LOCATION_QS); 105 mQsCustomizerController.init(); 106 mBrightnessSliderController.init(); 107 } 108 109 @Override onViewAttached()110 protected void onViewAttached() { 111 super.onViewAttached(); 112 113 updateMediaDisappearParameters(); 114 115 mTunerService.addTunable(mView, QS_SHOW_BRIGHTNESS); 116 mView.updateResources(); 117 if (mView.isListening()) { 118 refreshAllTiles(); 119 } 120 switchTileLayout(true); 121 mBrightnessMirrorHandler.onQsPanelAttached(); 122 PagedTileLayout pagedTileLayout= ((PagedTileLayout) mView.getOrCreateTileLayout()); 123 pagedTileLayout.setOnTouchListener(mTileLayoutTouchListener); 124 } 125 126 @Override createTileRevealController()127 protected QSTileRevealController createTileRevealController() { 128 return mQsTileRevealControllerFactory.create( 129 this, (PagedTileLayout) mView.getOrCreateTileLayout()); 130 } 131 132 @Override onViewDetached()133 protected void onViewDetached() { 134 mTunerService.removeTunable(mView); 135 mBrightnessMirrorHandler.onQsPanelDettached(); 136 super.onViewDetached(); 137 } 138 139 @Override onConfigurationChanged()140 protected void onConfigurationChanged() { 141 mView.updateResources(); 142 if (mView.isListening()) { 143 refreshAllTiles(); 144 } 145 } 146 147 @Override onSplitShadeChanged(boolean shouldUseSplitNotificationShade)148 protected void onSplitShadeChanged(boolean shouldUseSplitNotificationShade) { 149 ((PagedTileLayout) mView.getOrCreateTileLayout()) 150 .forceTilesRedistribution("Split shade state changed"); 151 mView.setCanCollapse(!shouldUseSplitNotificationShade); 152 } 153 154 /** */ setVisibility(int visibility)155 public void setVisibility(int visibility) { 156 mView.setVisibility(visibility); 157 } 158 159 /** */ setListening(boolean listening, boolean expanded)160 public void setListening(boolean listening, boolean expanded) { 161 setListening(listening && expanded); 162 163 if (listening != mListening) { 164 mListening = listening; 165 // Set the listening as soon as the QS fragment starts listening regardless of the 166 //expansion, so it will update the current brightness before the slider is visible. 167 if (listening) { 168 mBrightnessController.registerCallbacks(); 169 } else { 170 mBrightnessController.unregisterCallbacks(); 171 } 172 } 173 } 174 setBrightnessMirror(BrightnessMirrorController brightnessMirrorController)175 public void setBrightnessMirror(BrightnessMirrorController brightnessMirrorController) { 176 mBrightnessMirrorHandler.setController(brightnessMirrorController); 177 } 178 179 /** Update appearance of QSPanel. */ updateResources()180 public void updateResources() { 181 mView.updateResources(); 182 } 183 184 /** Update state of all tiles. */ refreshAllTiles()185 public void refreshAllTiles() { 186 mBrightnessController.checkRestrictionAndSetEnabled(); 187 super.refreshAllTiles(); 188 } 189 190 /** Start customizing the Quick Settings. */ showEdit(View view)191 public void showEdit(View view) { 192 view.post(() -> { 193 if (!mQsCustomizerController.isCustomizing()) { 194 int[] loc = view.getLocationOnScreen(); 195 int x = loc[0] + view.getWidth() / 2; 196 int y = loc[1] + view.getHeight() / 2; 197 mQsCustomizerController.show(x, y, false); 198 } 199 }); 200 } 201 isLayoutRtl()202 public boolean isLayoutRtl() { 203 return mView.isLayoutRtl(); 204 } 205 206 /** */ setPageListener(PagedTileLayout.PageListener listener)207 public void setPageListener(PagedTileLayout.PageListener listener) { 208 mView.setPageListener(listener); 209 } 210 isShown()211 public boolean isShown() { 212 return mView.isShown(); 213 } 214 215 /** */ setContentMargins(int startMargin, int endMargin)216 public void setContentMargins(int startMargin, int endMargin) { 217 mView.setContentMargins(startMargin, endMargin, mMediaHost.getHostView()); 218 } 219 220 /** */ setFooterPageIndicator(PageIndicator pageIndicator)221 public void setFooterPageIndicator(PageIndicator pageIndicator) { 222 mView.setFooterPageIndicator(pageIndicator); 223 } 224 225 /** */ isExpanded()226 public boolean isExpanded() { 227 return mView.isExpanded(); 228 } 229 setPageMargin(int pageMargin)230 void setPageMargin(int pageMargin) { 231 mView.setPageMargin(pageMargin); 232 } 233 234 /** 235 * Determines if bouncer expansion is between 0 and 1 non-inclusive. 236 * 237 * @return if bouncer is in transit 238 */ isBouncerInTransit()239 public boolean isBouncerInTransit() { 240 return mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit(); 241 } 242 getPaddingBottom()243 public int getPaddingBottom() { 244 return mView.getPaddingBottom(); 245 } 246 } 247 248