blob: 0bd3cc795bc3f0808a9c0d63f25f200f6f93f493 [file] [log] [blame]
Jorim Jaggi4538027d2014-07-30 15:43:13 +02001/*
2 * Copyright (C) 2014 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
17package com.android.systemui.statusbar.phone;
18
Adrian Roos6a4fa0e2018-03-05 19:50:16 +010019import static com.android.systemui.ScreenDecorations.DisplayCutoutView.boundsFromDirection;
20
Lucas Dupin987f1932017-05-13 21:02:52 -070021import android.annotation.ColorInt;
Jorim Jaggi4538027d2014-07-30 15:43:13 +020022import android.content.Context;
Jorim Jaggie210cc82014-08-12 23:44:59 +020023import android.content.res.Configuration;
Daniel Nishif79cd872016-06-27 11:44:01 -070024import android.content.res.Resources;
Lucas Dupin987f1932017-05-13 21:02:52 -070025import android.graphics.Color;
Jason Monk9cac5ff2017-06-02 11:35:50 -040026import android.graphics.Rect;
Jorim Jaggi4538027d2014-07-30 15:43:13 +020027import android.graphics.drawable.Drawable;
28import android.util.AttributeSet;
Adrian Roos13836052018-03-15 21:06:37 +010029import android.util.Pair;
Jorim Jaggie210cc82014-08-12 23:44:59 +020030import android.util.TypedValue;
Evan Laird264275e2018-03-01 19:39:39 -050031import android.view.DisplayCutout;
Adrian Roos6a4fa0e2018-03-05 19:50:16 +010032import android.view.Gravity;
Jorim Jaggi4538027d2014-07-30 15:43:13 +020033import android.view.View;
Jason Monk9cac5ff2017-06-02 11:35:50 -040034import android.view.ViewGroup;
Jorim Jaggi98f85302014-08-07 17:45:04 +020035import android.view.ViewTreeObserver;
Adrian Roosedfab3b2018-03-08 18:39:20 +010036import android.view.WindowInsets;
Jorim Jaggi4538027d2014-07-30 15:43:13 +020037import android.widget.ImageView;
Evan Laird264275e2018-03-01 19:39:39 -050038import android.widget.LinearLayout;
Jorim Jaggi4538027d2014-07-30 15:43:13 +020039import android.widget.RelativeLayout;
40import android.widget.TextView;
41
Lucas Dupin987f1932017-05-13 21:02:52 -070042import com.android.settingslib.Utils;
Dan Sandlerdf14c202017-02-21 14:51:11 -050043import com.android.systemui.BatteryMeterView;
Jason Monk9c7844c2017-01-18 15:21:53 -050044import com.android.systemui.Dependency;
Winsonc0d70582016-01-29 10:24:39 -080045import com.android.systemui.Interpolators;
Jorim Jaggi4538027d2014-07-30 15:43:13 +020046import com.android.systemui.R;
Kaori Katouccf08d72015-05-26 16:25:04 +090047import com.android.systemui.qs.QSPanel;
Jason Monk9cac5ff2017-06-02 11:35:50 -040048import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager;
Jorim Jaggi4538027d2014-07-30 15:43:13 +020049import com.android.systemui.statusbar.policy.BatteryController;
Jason Monk9c7844c2017-01-18 15:21:53 -050050import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
Jason Monk9cac5ff2017-06-02 11:35:50 -040051import com.android.systemui.statusbar.policy.ConfigurationController;
52import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
53import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;
Jorim Jaggi4538027d2014-07-30 15:43:13 +020054import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
55import com.android.systemui.statusbar.policy.UserInfoController;
Jason Monk9c7844c2017-01-18 15:21:53 -050056import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener;
Lucas Dupin542aebc2017-08-04 11:24:06 -070057import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
Adrian Roosffc90972015-06-09 18:09:49 -070058import com.android.systemui.statusbar.policy.UserSwitcherController;
Jorim Jaggi4538027d2014-07-30 15:43:13 +020059
60/**
61 * The header group on Keyguard.
62 */
63public class KeyguardStatusBarView extends RelativeLayout
Jason Monk9cac5ff2017-06-02 11:35:50 -040064 implements BatteryStateChangeCallback, OnUserInfoChangedListener, ConfigurationListener {
Jorim Jaggi4538027d2014-07-30 15:43:13 +020065
Evan Laird264275e2018-03-01 19:39:39 -050066 private static final int LAYOUT_NONE = 0;
67 private static final int LAYOUT_CUTOUT = 1;
68 private static final int LAYOUT_NO_CUTOUT = 2;
69
Jorim Jaggi4538027d2014-07-30 15:43:13 +020070 private boolean mBatteryCharging;
71 private boolean mKeyguardUserSwitcherShowing;
72 private boolean mBatteryListening;
73
Jorim Jaggie210cc82014-08-12 23:44:59 +020074 private TextView mCarrierLabel;
Jorim Jaggi4538027d2014-07-30 15:43:13 +020075 private View mSystemIconsSuperContainer;
76 private MultiUserSwitch mMultiUserSwitch;
77 private ImageView mMultiUserAvatar;
Dan Sandlerdf14c202017-02-21 14:51:11 -050078 private BatteryMeterView mBatteryView;
Jorim Jaggi4538027d2014-07-30 15:43:13 +020079
80 private BatteryController mBatteryController;
81 private KeyguardUserSwitcher mKeyguardUserSwitcher;
Daniel Nishi8ba446c2016-06-20 18:56:35 -070082 private UserSwitcherController mUserSwitcherController;
Jorim Jaggi4538027d2014-07-30 15:43:13 +020083
84 private int mSystemIconsSwitcherHiddenExpandedMargin;
Daniel Nishif79cd872016-06-27 11:44:01 -070085 private int mSystemIconsBaseMargin;
Selim Cinek6ebba592016-05-31 15:28:28 -070086 private View mSystemIconsContainer;
Jason Monk9cac5ff2017-06-02 11:35:50 -040087 private TintedIconManager mIconManager;
Jorim Jaggi4538027d2014-07-30 15:43:13 +020088
Evan Laird264275e2018-03-01 19:39:39 -050089 private View mCutoutSpace;
90 private ViewGroup mStatusIconArea;
91 private int mLayoutState = LAYOUT_NONE;
92
Evan Laird17a96ba2018-05-23 18:21:56 -040093 /**
94 * Draw this many pixels into the left/right side of the cutout to optimally use the space
95 */
96 private int mCutoutSideNudge = 0;
97
Jorim Jaggi4538027d2014-07-30 15:43:13 +020098 public KeyguardStatusBarView(Context context, AttributeSet attrs) {
99 super(context, attrs);
100 }
101
102 @Override
103 protected void onFinishInflate() {
104 super.onFinishInflate();
Selim Cinek6ebba592016-05-31 15:28:28 -0700105 mSystemIconsContainer = findViewById(R.id.system_icons_container);
Lucas Dupina39d5b22018-02-26 15:53:43 -0800106 mMultiUserSwitch = findViewById(R.id.multi_user_switch);
107 mMultiUserAvatar = findViewById(R.id.multi_user_avatar);
108 mCarrierLabel = findViewById(R.id.keyguard_carrier_text);
109 mBatteryView = mSystemIconsContainer.findViewById(R.id.battery);
Evan Laird264275e2018-03-01 19:39:39 -0500110 mCutoutSpace = findViewById(R.id.cutout_space_view);
111 mStatusIconArea = findViewById(R.id.status_icon_area);
Dan Sandlerdf14c202017-02-21 14:51:11 -0500112
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200113 loadDimens();
114 updateUserSwitcher();
Jason Monk9c7844c2017-01-18 15:21:53 -0500115 mBatteryController = Dependency.get(BatteryController.class);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200116 }
117
Jorim Jaggie210cc82014-08-12 23:44:59 +0200118 @Override
119 protected void onConfigurationChanged(Configuration newConfig) {
120 super.onConfigurationChanged(newConfig);
121
Adrian Roosd390b892016-05-05 10:50:49 -0400122 MarginLayoutParams lp = (MarginLayoutParams) mMultiUserAvatar.getLayoutParams();
123 lp.width = lp.height = getResources().getDimensionPixelSize(
124 R.dimen.multi_user_avatar_keyguard_size);
125 mMultiUserAvatar.setLayoutParams(lp);
Selim Cinek6ebba592016-05-31 15:28:28 -0700126
Evan Laird264275e2018-03-01 19:39:39 -0500127 // Multi-user switch
Selim Cinek6ebba592016-05-31 15:28:28 -0700128 lp = (MarginLayoutParams) mMultiUserSwitch.getLayoutParams();
129 lp.width = getResources().getDimensionPixelSize(
130 R.dimen.multi_user_switch_width_keyguard);
131 lp.setMarginEnd(getResources().getDimensionPixelSize(
132 R.dimen.multi_user_switch_keyguard_margin));
133 mMultiUserSwitch.setLayoutParams(lp);
134
Evan Laird264275e2018-03-01 19:39:39 -0500135 // System icons
Selim Cinek6ebba592016-05-31 15:28:28 -0700136 lp = (MarginLayoutParams) mSystemIconsContainer.getLayoutParams();
Evan Laird264275e2018-03-01 19:39:39 -0500137 lp.setMarginStart(getResources().getDimensionPixelSize(
138 R.dimen.system_icons_super_container_margin_start));
Selim Cinek6ebba592016-05-31 15:28:28 -0700139 mSystemIconsContainer.setLayoutParams(lp);
Evan Laird264275e2018-03-01 19:39:39 -0500140 mSystemIconsContainer.setPaddingRelative(mSystemIconsContainer.getPaddingStart(),
141 mSystemIconsContainer.getPaddingTop(),
142 getResources().getDimensionPixelSize(R.dimen.system_icons_keyguard_padding_end),
143 mSystemIconsContainer.getPaddingBottom());
Selim Cinek6ebba592016-05-31 15:28:28 -0700144
Selim Cinek6ebba592016-05-31 15:28:28 -0700145 // Respect font size setting.
146 mCarrierLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX,
147 getResources().getDimensionPixelSize(
148 com.android.internal.R.dimen.text_size_small_material));
149 lp = (MarginLayoutParams) mCarrierLabel.getLayoutParams();
150 lp.setMarginStart(
151 getResources().getDimensionPixelSize(R.dimen.keyguard_carrier_text_margin));
152 mCarrierLabel.setLayoutParams(lp);
153
154 lp = (MarginLayoutParams) getLayoutParams();
155 lp.height = getResources().getDimensionPixelSize(
156 R.dimen.status_bar_header_height_keyguard);
157 setLayoutParams(lp);
Jorim Jaggie210cc82014-08-12 23:44:59 +0200158 }
159
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200160 private void loadDimens() {
Daniel Nishif79cd872016-06-27 11:44:01 -0700161 Resources res = getResources();
162 mSystemIconsSwitcherHiddenExpandedMargin = res.getDimensionPixelSize(
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200163 R.dimen.system_icons_switcher_hidden_expanded_margin);
Daniel Nishif79cd872016-06-27 11:44:01 -0700164 mSystemIconsBaseMargin = res.getDimensionPixelSize(
165 R.dimen.system_icons_super_container_avatarless_margin_end);
Evan Laird17a96ba2018-05-23 18:21:56 -0400166 mCutoutSideNudge = getResources().getDimensionPixelSize(
167 R.dimen.display_cutout_margin_consumption);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200168 }
169
170 private void updateVisibilities() {
Evan Laird264275e2018-03-01 19:39:39 -0500171 if (mMultiUserSwitch.getParent() != mStatusIconArea && !mKeyguardUserSwitcherShowing) {
Jorim Jaggi98f85302014-08-07 17:45:04 +0200172 if (mMultiUserSwitch.getParent() != null) {
173 getOverlay().remove(mMultiUserSwitch);
174 }
Evan Laird264275e2018-03-01 19:39:39 -0500175 mStatusIconArea.addView(mMultiUserSwitch, 0);
176 } else if (mMultiUserSwitch.getParent() == mStatusIconArea && mKeyguardUserSwitcherShowing) {
177 mStatusIconArea.removeView(mMultiUserSwitch);
Jorim Jaggi98f85302014-08-07 17:45:04 +0200178 }
Daniel Nishi8ba446c2016-06-20 18:56:35 -0700179 if (mKeyguardUserSwitcher == null) {
180 // If we have no keyguard switcher, the screen width is under 600dp. In this case,
181 // we don't show the multi-user avatar unless there is more than 1 user on the device.
Amith Yamasanib75fc2b2016-06-22 15:50:06 -0700182 if (mUserSwitcherController != null
183 && mUserSwitcherController.getSwitchableUserCount() > 1) {
Daniel Nishi8ba446c2016-06-20 18:56:35 -0700184 mMultiUserSwitch.setVisibility(View.VISIBLE);
185 } else {
186 mMultiUserSwitch.setVisibility(View.GONE);
187 }
188 }
Dan Sandlerdf14c202017-02-21 14:51:11 -0500189 mBatteryView.setForceShowPercent(mBatteryCharging);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200190 }
191
192 private void updateSystemIconsLayoutParams() {
Evan Laird264275e2018-03-01 19:39:39 -0500193 LinearLayout.LayoutParams lp =
194 (LinearLayout.LayoutParams) mSystemIconsContainer.getLayoutParams();
Daniel Nishif79cd872016-06-27 11:44:01 -0700195 // If the avatar icon is gone, we need to have some end margin to display the system icons
196 // correctly.
197 int baseMarginEnd = mMultiUserSwitch.getVisibility() == View.GONE
198 ? mSystemIconsBaseMargin
199 : 0;
200 int marginEnd = mKeyguardUserSwitcherShowing ? mSystemIconsSwitcherHiddenExpandedMargin :
201 baseMarginEnd;
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200202 if (marginEnd != lp.getMarginEnd()) {
203 lp.setMarginEnd(marginEnd);
Evan Laird264275e2018-03-01 19:39:39 -0500204 mSystemIconsContainer.setLayoutParams(lp);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200205 }
206 }
207
Evan Laird264275e2018-03-01 19:39:39 -0500208 @Override
Adrian Roosedfab3b2018-03-08 18:39:20 +0100209 public WindowInsets onApplyWindowInsets(WindowInsets insets) {
Adrian Roos13836052018-03-15 21:06:37 +0100210 mLayoutState = LAYOUT_NONE;
Adrian Roosedfab3b2018-03-08 18:39:20 +0100211 if (updateLayoutConsideringCutout()) {
212 requestLayout();
213 }
214 return super.onApplyWindowInsets(insets);
215 }
216
217 private boolean updateLayoutConsideringCutout() {
Evan Laird264275e2018-03-01 19:39:39 -0500218 DisplayCutout dc = getRootWindowInsets().getDisplayCutout();
Adrian Roos13836052018-03-15 21:06:37 +0100219 Pair<Integer, Integer> cornerCutoutMargins =
220 PhoneStatusBarView.cornerCutoutMargins(dc, getDisplay());
221 updateCornerCutoutPadding(cornerCutoutMargins);
222 if (dc == null || cornerCutoutMargins != null) {
Adrian Roosedfab3b2018-03-08 18:39:20 +0100223 return updateLayoutParamsNoCutout();
Evan Laird264275e2018-03-01 19:39:39 -0500224 } else {
Adrian Roosedfab3b2018-03-08 18:39:20 +0100225 return updateLayoutParamsForCutout(dc);
Evan Laird264275e2018-03-01 19:39:39 -0500226 }
227 }
228
Adrian Roos13836052018-03-15 21:06:37 +0100229 private void updateCornerCutoutPadding(Pair<Integer, Integer> cornerCutoutMargins) {
230 if (cornerCutoutMargins != null) {
231 setPadding(cornerCutoutMargins.first, 0, cornerCutoutMargins.second, 0);
232 } else {
233 setPadding(0, 0, 0, 0);
234 }
235 }
236
Adrian Roosedfab3b2018-03-08 18:39:20 +0100237 private boolean updateLayoutParamsNoCutout() {
Evan Laird264275e2018-03-01 19:39:39 -0500238 if (mLayoutState == LAYOUT_NO_CUTOUT) {
Adrian Roosedfab3b2018-03-08 18:39:20 +0100239 return false;
Evan Laird264275e2018-03-01 19:39:39 -0500240 }
241 mLayoutState = LAYOUT_NO_CUTOUT;
242
243 if (mCutoutSpace != null) {
244 mCutoutSpace.setVisibility(View.GONE);
245 }
246
247 RelativeLayout.LayoutParams lp = (LayoutParams) mCarrierLabel.getLayoutParams();
248 lp.addRule(RelativeLayout.START_OF, R.id.status_icon_area);
249
250 lp = (LayoutParams) mStatusIconArea.getLayoutParams();
251 lp.removeRule(RelativeLayout.RIGHT_OF);
252 lp.width = LayoutParams.WRAP_CONTENT;
253
254 LinearLayout.LayoutParams llp =
255 (LinearLayout.LayoutParams) mSystemIconsContainer.getLayoutParams();
256 llp.setMarginStart(getResources().getDimensionPixelSize(
257 R.dimen.system_icons_super_container_margin_start));
Adrian Roosedfab3b2018-03-08 18:39:20 +0100258 return true;
Evan Laird264275e2018-03-01 19:39:39 -0500259 }
260
Adrian Roosedfab3b2018-03-08 18:39:20 +0100261 private boolean updateLayoutParamsForCutout(DisplayCutout dc) {
Evan Laird264275e2018-03-01 19:39:39 -0500262 if (mLayoutState == LAYOUT_CUTOUT) {
Adrian Roosedfab3b2018-03-08 18:39:20 +0100263 return false;
Evan Laird264275e2018-03-01 19:39:39 -0500264 }
265 mLayoutState = LAYOUT_CUTOUT;
266
267 if (mCutoutSpace == null) {
268 updateLayoutParamsNoCutout();
269 }
270
Adrian Roos6a4fa0e2018-03-05 19:50:16 +0100271 Rect bounds = new Rect();
272 boundsFromDirection(dc, Gravity.TOP, bounds);
273
Evan Laird264275e2018-03-01 19:39:39 -0500274 mCutoutSpace.setVisibility(View.VISIBLE);
275 RelativeLayout.LayoutParams lp = (LayoutParams) mCutoutSpace.getLayoutParams();
Evan Laird17a96ba2018-05-23 18:21:56 -0400276 bounds.left = bounds.left + mCutoutSideNudge;
277 bounds.right = bounds.right - mCutoutSideNudge;
Adrian Roos6a4fa0e2018-03-05 19:50:16 +0100278 lp.width = bounds.width();
279 lp.height = bounds.height();
Evan Laird264275e2018-03-01 19:39:39 -0500280 lp.addRule(RelativeLayout.CENTER_IN_PARENT);
281
282 lp = (LayoutParams) mCarrierLabel.getLayoutParams();
283 lp.addRule(RelativeLayout.START_OF, R.id.cutout_space_view);
284
285 lp = (LayoutParams) mStatusIconArea.getLayoutParams();
286 lp.addRule(RelativeLayout.RIGHT_OF, R.id.cutout_space_view);
287 lp.width = LayoutParams.MATCH_PARENT;
288
289 LinearLayout.LayoutParams llp =
290 (LinearLayout.LayoutParams) mSystemIconsContainer.getLayoutParams();
291 llp.setMarginStart(0);
Adrian Roosedfab3b2018-03-08 18:39:20 +0100292 return true;
Evan Laird264275e2018-03-01 19:39:39 -0500293 }
294
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200295 public void setListening(boolean listening) {
296 if (listening == mBatteryListening) {
297 return;
298 }
299 mBatteryListening = listening;
300 if (mBatteryListening) {
Jason Monk88529052016-11-04 13:29:58 -0400301 mBatteryController.addCallback(this);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200302 } else {
Jason Monk88529052016-11-04 13:29:58 -0400303 mBatteryController.removeCallback(this);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200304 }
305 }
306
307 private void updateUserSwitcher() {
308 boolean keyguardSwitcherAvailable = mKeyguardUserSwitcher != null;
309 mMultiUserSwitch.setClickable(keyguardSwitcherAvailable);
310 mMultiUserSwitch.setFocusable(keyguardSwitcherAvailable);
311 mMultiUserSwitch.setKeyguardMode(keyguardSwitcherAvailable);
312 }
313
Jason Monk9c7844c2017-01-18 15:21:53 -0500314 @Override
315 protected void onAttachedToWindow() {
316 super.onAttachedToWindow();
317 UserInfoController userInfoController = Dependency.get(UserInfoController.class);
318 userInfoController.addCallback(this);
319 mUserSwitcherController = Dependency.get(UserSwitcherController.class);
320 mMultiUserSwitch.setUserSwitcherController(mUserSwitcherController);
321 userInfoController.reloadUserInfo();
Jason Monk9cac5ff2017-06-02 11:35:50 -0400322 Dependency.get(ConfigurationController.class).addCallback(this);
323 mIconManager = new TintedIconManager(findViewById(R.id.statusIcons));
324 Dependency.get(StatusBarIconController.class).addIconGroup(mIconManager);
Lucas Dupina39d5b22018-02-26 15:53:43 -0800325 onThemeChanged();
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200326 }
327
Jason Monk9c7844c2017-01-18 15:21:53 -0500328 @Override
329 protected void onDetachedFromWindow() {
330 super.onDetachedFromWindow();
331 Dependency.get(UserInfoController.class).removeCallback(this);
Jason Monk9cac5ff2017-06-02 11:35:50 -0400332 Dependency.get(StatusBarIconController.class).removeIconGroup(mIconManager);
333 Dependency.get(ConfigurationController.class).removeCallback(this);
Adrian Roosffc90972015-06-09 18:09:49 -0700334 }
335
Jason Monk9c7844c2017-01-18 15:21:53 -0500336 @Override
337 public void onUserInfoChanged(String name, Drawable picture, String userAccount) {
338 mMultiUserAvatar.setImageDrawable(picture);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200339 }
340
Kaori Katouccf08d72015-05-26 16:25:04 +0900341 public void setQSPanel(QSPanel qsp) {
342 mMultiUserSwitch.setQsPanel(qsp);
343 }
344
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200345 @Override
346 public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
Dan Sandlerdf14c202017-02-21 14:51:11 -0500347 if (mBatteryCharging != charging) {
348 mBatteryCharging = charging;
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200349 updateVisibilities();
350 }
351 }
352
353 @Override
Jason Monkc06fbb12016-01-08 14:12:18 -0500354 public void onPowerSaveChanged(boolean isPowerSave) {
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200355 // could not care less
356 }
357
358 public void setKeyguardUserSwitcher(KeyguardUserSwitcher keyguardUserSwitcher) {
359 mKeyguardUserSwitcher = keyguardUserSwitcher;
360 mMultiUserSwitch.setKeyguardUserSwitcher(keyguardUserSwitcher);
361 updateUserSwitcher();
362 }
363
Jorim Jaggi98f85302014-08-07 17:45:04 +0200364 public void setKeyguardUserSwitcherShowing(boolean showing, boolean animate) {
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200365 mKeyguardUserSwitcherShowing = showing;
Jorim Jaggi98f85302014-08-07 17:45:04 +0200366 if (animate) {
367 animateNextLayoutChange();
368 }
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200369 updateVisibilities();
Evan Laird264275e2018-03-01 19:39:39 -0500370 updateLayoutConsideringCutout();
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200371 updateSystemIconsLayoutParams();
372 }
373
Jorim Jaggi98f85302014-08-07 17:45:04 +0200374 private void animateNextLayoutChange() {
Evan Laird264275e2018-03-01 19:39:39 -0500375 final int systemIconsCurrentX = mSystemIconsContainer.getLeft();
376 final boolean userSwitcherVisible = mMultiUserSwitch.getParent() == mStatusIconArea;
Jorim Jaggi98f85302014-08-07 17:45:04 +0200377 getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
378 @Override
379 public boolean onPreDraw() {
380 getViewTreeObserver().removeOnPreDrawListener(this);
381 boolean userSwitcherHiding = userSwitcherVisible
Evan Laird264275e2018-03-01 19:39:39 -0500382 && mMultiUserSwitch.getParent() != mStatusIconArea;
383 mSystemIconsContainer.setX(systemIconsCurrentX);
384 mSystemIconsContainer.animate()
Jorim Jaggi98f85302014-08-07 17:45:04 +0200385 .translationX(0)
386 .setDuration(400)
387 .setStartDelay(userSwitcherHiding ? 300 : 0)
Selim Cinekc18010f2016-01-20 13:41:30 -0800388 .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
Jorim Jaggi98f85302014-08-07 17:45:04 +0200389 .start();
390 if (userSwitcherHiding) {
391 getOverlay().add(mMultiUserSwitch);
392 mMultiUserSwitch.animate()
393 .alpha(0f)
394 .setDuration(300)
395 .setStartDelay(0)
Selim Cinekc18010f2016-01-20 13:41:30 -0800396 .setInterpolator(Interpolators.ALPHA_OUT)
Lucas Dupina39d5b22018-02-26 15:53:43 -0800397 .withEndAction(() -> {
398 mMultiUserSwitch.setAlpha(1f);
399 getOverlay().remove(mMultiUserSwitch);
Jorim Jaggi98f85302014-08-07 17:45:04 +0200400 })
401 .start();
402
403 } else {
404 mMultiUserSwitch.setAlpha(0f);
405 mMultiUserSwitch.animate()
406 .alpha(1f)
407 .setDuration(300)
408 .setStartDelay(200)
Selim Cinekc18010f2016-01-20 13:41:30 -0800409 .setInterpolator(Interpolators.ALPHA_IN);
Jorim Jaggi98f85302014-08-07 17:45:04 +0200410 }
411 return true;
412 }
413 });
414
415 }
416
417 @Override
418 public void setVisibility(int visibility) {
419 super.setVisibility(visibility);
420 if (visibility != View.VISIBLE) {
Evan Laird264275e2018-03-01 19:39:39 -0500421 mSystemIconsContainer.animate().cancel();
422 mSystemIconsContainer.setTranslationX(0);
Jorim Jaggi98f85302014-08-07 17:45:04 +0200423 mMultiUserSwitch.animate().cancel();
424 mMultiUserSwitch.setAlpha(1f);
Daniel Nishi8ba446c2016-06-20 18:56:35 -0700425 } else {
426 updateVisibilities();
Daniel Nishif79cd872016-06-27 11:44:01 -0700427 updateSystemIconsLayoutParams();
Jorim Jaggi98f85302014-08-07 17:45:04 +0200428 }
429 }
430
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200431 @Override
432 public boolean hasOverlappingRendering() {
433 return false;
434 }
Lucas Dupin987f1932017-05-13 21:02:52 -0700435
Lucas Dupin8c51ce22017-11-21 13:21:05 -0800436 public void onThemeChanged() {
Lucas Dupina360e1e72017-07-17 17:25:20 -0700437 @ColorInt int textColor = Utils.getColorAttr(mContext, R.attr.wallpaperTextColor);
Lucas Dupin6ebc2182017-07-18 12:15:41 -0700438 @ColorInt int iconColor = Utils.getDefaultColor(mContext, Color.luminance(textColor) < 0.5 ?
439 R.color.dark_mode_icon_color_single_tone :
440 R.color.light_mode_icon_color_single_tone);
Jason Monk9cac5ff2017-06-02 11:35:50 -0400441 float intensity = textColor == Color.WHITE ? 0 : 1;
Lucas Dupin6ebc2182017-07-18 12:15:41 -0700442 mCarrierLabel.setTextColor(iconColor);
443 mBatteryView.setFillColor(iconColor);
444 mIconManager.setTint(iconColor);
Jason Monk9cac5ff2017-06-02 11:35:50 -0400445 Rect tintArea = new Rect(0, 0, 0, 0);
446
Lucas Dupin6ebc2182017-07-18 12:15:41 -0700447 applyDarkness(R.id.battery, tintArea, intensity, iconColor);
448 applyDarkness(R.id.clock, tintArea, intensity, iconColor);
Lucas Dupin542aebc2017-08-04 11:24:06 -0700449 // Reload user avatar
450 ((UserInfoControllerImpl) Dependency.get(UserInfoController.class))
451 .onDensityOrFontScaleChanged();
Jason Monk9cac5ff2017-06-02 11:35:50 -0400452 }
453
454 private void applyDarkness(int id, Rect tintArea, float intensity, int color) {
455 View v = findViewById(id);
456 if (v instanceof DarkReceiver) {
457 ((DarkReceiver) v).onDarkChanged(tintArea, intensity, color);
458 }
Lucas Dupin987f1932017-05-13 21:02:52 -0700459 }
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200460}