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.QS_USING_COLLAPSED_LANDSCAPE_MEDIA;
21 import static com.android.systemui.qs.dagger.QSFragmentModule.QS_USING_MEDIA_PLAYER;
22 
23 import androidx.annotation.VisibleForTesting;
24 
25 import com.android.internal.logging.MetricsLogger;
26 import com.android.internal.logging.UiEventLogger;
27 import com.android.systemui.R;
28 import com.android.systemui.dump.DumpManager;
29 import com.android.systemui.media.controls.ui.MediaHierarchyManager;
30 import com.android.systemui.media.controls.ui.MediaHost;
31 import com.android.systemui.plugins.qs.QSTile;
32 import com.android.systemui.qs.customize.QSCustomizerController;
33 import com.android.systemui.qs.dagger.QSScope;
34 import com.android.systemui.qs.logging.QSLogger;
35 import com.android.systemui.util.leak.RotationUtils;
36 
37 import java.util.ArrayList;
38 import java.util.List;
39 
40 import javax.inject.Inject;
41 import javax.inject.Named;
42 import javax.inject.Provider;
43 
44 /** Controller for {@link QuickQSPanel}. */
45 @QSScope
46 public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> {
47 
48     private final Provider<Boolean> mUsingCollapsedLandscapeMediaProvider;
49 
50     @Inject
QuickQSPanelController(QuickQSPanel view, QSHost qsHost, QSCustomizerController qsCustomizerController, @Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer, @Named(QUICK_QS_PANEL) MediaHost mediaHost, @Named(QS_USING_COLLAPSED_LANDSCAPE_MEDIA) Provider<Boolean> usingCollapsedLandscapeMediaProvider, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger, DumpManager dumpManager )51     QuickQSPanelController(QuickQSPanel view, QSHost qsHost,
52             QSCustomizerController qsCustomizerController,
53             @Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer,
54             @Named(QUICK_QS_PANEL) MediaHost mediaHost,
55             @Named(QS_USING_COLLAPSED_LANDSCAPE_MEDIA)
56                     Provider<Boolean> usingCollapsedLandscapeMediaProvider,
57             MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger,
58             DumpManager dumpManager
59     ) {
60         super(view, qsHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger,
61                 uiEventLogger, qsLogger, dumpManager);
62         mUsingCollapsedLandscapeMediaProvider = usingCollapsedLandscapeMediaProvider;
63     }
64 
65     @Override
onInit()66     protected void onInit() {
67         super.onInit();
68         updateMediaExpansion();
69         mMediaHost.setShowsOnlyActiveMedia(true);
70         mMediaHost.init(MediaHierarchyManager.LOCATION_QQS);
71     }
72 
updateMediaExpansion()73     private void updateMediaExpansion() {
74         int rotation = getRotation();
75         boolean isLandscape = rotation == RotationUtils.ROTATION_LANDSCAPE
76                 || rotation == RotationUtils.ROTATION_SEASCAPE;
77         boolean usingCollapsedLandscapeMedia = mUsingCollapsedLandscapeMediaProvider.get();
78         if (!usingCollapsedLandscapeMedia || !isLandscape) {
79             mMediaHost.setExpansion(MediaHost.EXPANDED);
80         } else {
81             mMediaHost.setExpansion(MediaHost.COLLAPSED);
82         }
83     }
84 
85     @VisibleForTesting
getRotation()86     protected int getRotation() {
87         return RotationUtils.getRotation(getContext());
88     }
89 
90     @Override
onViewAttached()91     protected void onViewAttached() {
92         super.onViewAttached();
93     }
94 
95     @Override
onViewDetached()96     protected void onViewDetached() {
97         super.onViewDetached();
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         int newMaxTiles = getResources().getInteger(R.integer.quick_qs_panel_max_tiles);
108         if (newMaxTiles != mView.getNumQuickTiles()) {
109             setMaxTiles(newMaxTiles);
110         }
111         updateMediaExpansion();
112     }
113 
114     @Override
setTiles()115     public void setTiles() {
116         List<QSTile> tiles = new ArrayList<>();
117         for (QSTile tile : mHost.getTiles()) {
118             tiles.add(tile);
119             if (tiles.size() == mView.getNumQuickTiles()) {
120                 break;
121             }
122         }
123         super.setTiles(tiles, /* collapsedView */ true);
124     }
125 
setContentMargins(int marginStart, int marginEnd)126     public void setContentMargins(int marginStart, int marginEnd) {
127         mView.setContentMargins(marginStart, marginEnd, mMediaHost.getHostView());
128     }
129 
getNumQuickTiles()130     public int getNumQuickTiles() {
131         return mView.getNumQuickTiles();
132     }
133 }
134