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.media.dagger.MediaModule.QUICK_QS_PANEL;
20 import static com.android.systemui.qs.dagger.QSFragmentModule.QQS_FOOTER;
21 import static com.android.systemui.qs.dagger.QSFragmentModule.QS_USING_MEDIA_PLAYER;
22 
23 import com.android.internal.logging.MetricsLogger;
24 import com.android.internal.logging.UiEventLogger;
25 import com.android.systemui.R;
26 import com.android.systemui.dump.DumpManager;
27 import com.android.systemui.media.MediaHierarchyManager;
28 import com.android.systemui.media.MediaHost;
29 import com.android.systemui.plugins.qs.QSTile;
30 import com.android.systemui.qs.customize.QSCustomizerController;
31 import com.android.systemui.qs.dagger.QSScope;
32 import com.android.systemui.qs.logging.QSLogger;
33 
34 import java.util.ArrayList;
35 import java.util.List;
36 
37 import javax.inject.Inject;
38 import javax.inject.Named;
39 
40 /** Controller for {@link QuickQSPanel}. */
41 @QSScope
42 public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> {
43 
44     private final QSPanel.OnConfigurationChangedListener mOnConfigurationChangedListener =
45             newConfig -> {
46                 int newMaxTiles = getResources().getInteger(R.integer.quick_qs_panel_max_tiles);
47                 if (newMaxTiles != mView.getNumQuickTiles()) {
48                     setMaxTiles(newMaxTiles);
49                 }
50             };
51 
52     private final FooterActionsController mFooterActionsController;
53 
54     @Inject
QuickQSPanelController(QuickQSPanel view, QSTileHost qsTileHost, QSCustomizerController qsCustomizerController, @Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer, @Named(QUICK_QS_PANEL) MediaHost mediaHost, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger, DumpManager dumpManager, @Named(QQS_FOOTER) FooterActionsController footerActionsController )55     QuickQSPanelController(QuickQSPanel view, QSTileHost qsTileHost,
56             QSCustomizerController qsCustomizerController,
57             @Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer,
58             @Named(QUICK_QS_PANEL) MediaHost mediaHost,
59             MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger,
60             DumpManager dumpManager,
61             @Named(QQS_FOOTER) FooterActionsController footerActionsController
62     ) {
63         super(view, qsTileHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger,
64                 uiEventLogger, qsLogger, dumpManager);
65         mFooterActionsController = footerActionsController;
66     }
67 
68     @Override
onInit()69     protected void onInit() {
70         super.onInit();
71         mMediaHost.setExpansion(0.0f);
72         mMediaHost.setShowsOnlyActiveMedia(true);
73         mMediaHost.init(MediaHierarchyManager.LOCATION_QQS);
74         mFooterActionsController.init();
75         mFooterActionsController.refreshVisibility(mShouldUseSplitNotificationShade);
76     }
77 
78     @Override
onViewAttached()79     protected void onViewAttached() {
80         super.onViewAttached();
81         mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener);
82     }
83 
84     @Override
onViewDetached()85     protected void onViewDetached() {
86         super.onViewDetached();
87         mView.removeOnConfigurationChangedListener(mOnConfigurationChangedListener);
88     }
89 
90     @Override
setListening(boolean listening)91     void setListening(boolean listening) {
92         super.setListening(listening);
93         mFooterActionsController.setListening(listening);
94     }
95 
isListening()96     public boolean isListening() {
97         return mView.isListening();
98     }
99 
setMaxTiles(int parseNumTiles)100     private void setMaxTiles(int parseNumTiles) {
101         mView.setMaxTiles(parseNumTiles);
102         setTiles();
103     }
104 
105     @Override
onConfigurationChanged()106     protected void onConfigurationChanged() {
107         mFooterActionsController.refreshVisibility(mShouldUseSplitNotificationShade);
108     }
109 
110     @Override
setTiles()111     public void setTiles() {
112         List<QSTile> tiles = new ArrayList<>();
113         for (QSTile tile : mHost.getTiles()) {
114             tiles.add(tile);
115             if (tiles.size() == mView.getNumQuickTiles()) {
116                 break;
117             }
118         }
119         super.setTiles(tiles, /* collapsedView */ true);
120     }
121 
122     /** */
setContentMargins(int marginStart, int marginEnd)123     public void setContentMargins(int marginStart, int marginEnd) {
124         mView.setContentMargins(marginStart, marginEnd, mMediaHost.getHostView());
125     }
126 
getNumQuickTiles()127     public int getNumQuickTiles() {
128         return mView.getNumQuickTiles();
129     }
130 }
131