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