1 /*
2  * Copyright (C) 2019 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 android.os.Bundle;
20 
21 import com.android.internal.colorextraction.ColorExtractor;
22 import com.android.systemui.R;
23 import com.android.systemui.battery.BatteryMeterViewController;
24 import com.android.systemui.colorextraction.SysuiColorExtractor;
25 import com.android.systemui.demomode.DemoMode;
26 import com.android.systemui.demomode.DemoModeController;
27 import com.android.systemui.flags.FeatureFlags;
28 import com.android.systemui.qs.carrier.QSCarrierGroupController;
29 import com.android.systemui.qs.dagger.QSScope;
30 import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider;
31 import com.android.systemui.statusbar.phone.StatusBarIconController;
32 import com.android.systemui.statusbar.phone.StatusIconContainer;
33 import com.android.systemui.statusbar.policy.Clock;
34 import com.android.systemui.statusbar.policy.VariableDateViewController;
35 import com.android.systemui.util.ViewController;
36 
37 import java.util.List;
38 
39 import javax.inject.Inject;
40 
41 /**
42  * Controller for {@link QuickStatusBarHeader}.
43  */
44 @QSScope
45 class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader> implements
46         ChipVisibilityListener {
47 
48     private final QSCarrierGroupController mQSCarrierGroupController;
49     private final QuickQSPanelController mQuickQSPanelController;
50     private final Clock mClockView;
51     private final StatusBarIconController mStatusBarIconController;
52     private final DemoModeController mDemoModeController;
53     private final StatusIconContainer mIconContainer;
54     private final StatusBarIconController.TintedIconManager mIconManager;
55     private final DemoMode mDemoModeReceiver;
56     private final QSExpansionPathInterpolator mQSExpansionPathInterpolator;
57     private final BatteryMeterViewController mBatteryMeterViewController;
58     private final FeatureFlags mFeatureFlags;
59     private final StatusBarContentInsetsProvider mInsetsProvider;
60 
61     private final VariableDateViewController mVariableDateViewControllerDateView;
62     private final VariableDateViewController mVariableDateViewControllerClockDateView;
63     private final HeaderPrivacyIconsController mPrivacyIconsController;
64 
65     private boolean mListening;
66 
67     private SysuiColorExtractor mColorExtractor;
68     private ColorExtractor.OnColorsChangedListener mOnColorsChangedListener;
69 
70     @Inject
QuickStatusBarHeaderController(QuickStatusBarHeader view, HeaderPrivacyIconsController headerPrivacyIconsController, StatusBarIconController statusBarIconController, DemoModeController demoModeController, QuickQSPanelController quickQSPanelController, QSCarrierGroupController.Builder qsCarrierGroupControllerBuilder, SysuiColorExtractor colorExtractor, QSExpansionPathInterpolator qsExpansionPathInterpolator, BatteryMeterViewController batteryMeterViewController, FeatureFlags featureFlags, VariableDateViewController.Factory variableDateViewControllerFactory, StatusBarContentInsetsProvider statusBarContentInsetsProvider)71     QuickStatusBarHeaderController(QuickStatusBarHeader view,
72             HeaderPrivacyIconsController headerPrivacyIconsController,
73             StatusBarIconController statusBarIconController,
74             DemoModeController demoModeController,
75             QuickQSPanelController quickQSPanelController,
76             QSCarrierGroupController.Builder qsCarrierGroupControllerBuilder,
77             SysuiColorExtractor colorExtractor,
78             QSExpansionPathInterpolator qsExpansionPathInterpolator,
79             BatteryMeterViewController batteryMeterViewController,
80             FeatureFlags featureFlags,
81             VariableDateViewController.Factory variableDateViewControllerFactory,
82             StatusBarContentInsetsProvider statusBarContentInsetsProvider) {
83         super(view);
84         mPrivacyIconsController = headerPrivacyIconsController;
85         mStatusBarIconController = statusBarIconController;
86         mDemoModeController = demoModeController;
87         mQuickQSPanelController = quickQSPanelController;
88         mQSExpansionPathInterpolator = qsExpansionPathInterpolator;
89         mBatteryMeterViewController = batteryMeterViewController;
90         mFeatureFlags = featureFlags;
91         mInsetsProvider = statusBarContentInsetsProvider;
92 
93         mQSCarrierGroupController = qsCarrierGroupControllerBuilder
94                 .setQSCarrierGroup(mView.findViewById(R.id.carrier_group))
95                 .build();
96         mClockView = mView.findViewById(R.id.clock);
97         mIconContainer = mView.findViewById(R.id.statusIcons);
98         mVariableDateViewControllerDateView = variableDateViewControllerFactory.create(
99                 mView.requireViewById(R.id.date)
100         );
101         mVariableDateViewControllerClockDateView = variableDateViewControllerFactory.create(
102                 mView.requireViewById(R.id.date_clock)
103         );
104 
105         mIconManager = new StatusBarIconController.TintedIconManager(mIconContainer, featureFlags);
106         mDemoModeReceiver = new ClockDemoModeReceiver(mClockView);
107         mColorExtractor = colorExtractor;
108         mOnColorsChangedListener = (extractor, which) -> {
109             final boolean lightTheme = mColorExtractor.getNeutralColors().supportsDarkText();
110             mClockView.onColorsChanged(lightTheme);
111         };
112         mColorExtractor.addOnColorsChangedListener(mOnColorsChangedListener);
113 
114         // Don't need to worry about tuner settings for this icon
115         mBatteryMeterViewController.ignoreTunerUpdates();
116     }
117 
118     @Override
onInit()119     protected void onInit() {
120         mBatteryMeterViewController.init();
121     }
122 
123     @Override
onViewAttached()124     protected void onViewAttached() {
125         mPrivacyIconsController.onParentVisible();
126         mPrivacyIconsController.setChipVisibilityListener(this);
127         mIconContainer.addIgnoredSlot(
128                 getResources().getString(com.android.internal.R.string.status_bar_managed_profile));
129         mIconContainer.setShouldRestrictIcons(false);
130         mStatusBarIconController.addIconGroup(mIconManager);
131 
132         mView.setIsSingleCarrier(mQSCarrierGroupController.isSingleCarrier());
133         mQSCarrierGroupController
134                 .setOnSingleCarrierChangedListener(mView::setIsSingleCarrier);
135 
136         List<String> rssiIgnoredSlots;
137 
138         if (mFeatureFlags.isCombinedStatusBarSignalIconsEnabled()) {
139             rssiIgnoredSlots = List.of(
140                     getResources().getString(com.android.internal.R.string.status_bar_no_calling),
141                     getResources().getString(com.android.internal.R.string.status_bar_call_strength)
142             );
143         } else {
144             rssiIgnoredSlots = List.of(
145                     getResources().getString(com.android.internal.R.string.status_bar_mobile)
146             );
147         }
148 
149         mView.onAttach(mIconManager, mQSExpansionPathInterpolator, rssiIgnoredSlots,
150                 mFeatureFlags.useCombinedQSHeaders(), mInsetsProvider);
151 
152         mDemoModeController.addCallback(mDemoModeReceiver);
153 
154         mVariableDateViewControllerDateView.init();
155         mVariableDateViewControllerClockDateView.init();
156     }
157 
158     @Override
onViewDetached()159     protected void onViewDetached() {
160         mColorExtractor.removeOnColorsChangedListener(mOnColorsChangedListener);
161         mPrivacyIconsController.onParentInvisible();
162         mStatusBarIconController.removeIconGroup(mIconManager);
163         mQSCarrierGroupController.setOnSingleCarrierChangedListener(null);
164         mDemoModeController.removeCallback(mDemoModeReceiver);
165         setListening(false);
166     }
167 
setListening(boolean listening)168     public void setListening(boolean listening) {
169         mQSCarrierGroupController.setListening(listening);
170 
171         if (listening == mListening) {
172             return;
173         }
174         mListening = listening;
175 
176         mQuickQSPanelController.setListening(listening);
177         if (mQuickQSPanelController.isListening()) {
178             mQuickQSPanelController.refreshAllTiles();
179         }
180 
181         if (mQuickQSPanelController.switchTileLayout(false)) {
182             mView.updateResources();
183         }
184 
185         if (listening) {
186             mPrivacyIconsController.startListening();
187         } else {
188             mPrivacyIconsController.stopListening();
189         }
190     }
191 
192     @Override
onChipVisibilityRefreshed(boolean visible)193     public void onChipVisibilityRefreshed(boolean visible) {
194         mView.setChipVisibility(visible);
195     }
196 
setContentMargins(int marginStart, int marginEnd)197     public void setContentMargins(int marginStart, int marginEnd) {
198         mQuickQSPanelController.setContentMargins(marginStart, marginEnd);
199     }
200 
201     private static class ClockDemoModeReceiver implements DemoMode {
202         private Clock mClockView;
203 
204         @Override
demoCommands()205         public List<String> demoCommands() {
206             return List.of(COMMAND_CLOCK);
207         }
208 
ClockDemoModeReceiver(Clock clockView)209         ClockDemoModeReceiver(Clock clockView) {
210             mClockView = clockView;
211         }
212 
213         @Override
dispatchDemoCommand(String command, Bundle args)214         public void dispatchDemoCommand(String command, Bundle args) {
215             mClockView.dispatchDemoCommand(command, args);
216         }
217 
218         @Override
onDemoModeStarted()219         public void onDemoModeStarted() {
220             mClockView.onDemoModeStarted();
221         }
222 
223         @Override
onDemoModeFinished()224         public void onDemoModeFinished() {
225             mClockView.onDemoModeFinished();
226         }
227     }
228 }
229