• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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