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