blob: b81780962f08d668b9da45922d38fa13de454502 [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
Jorim Jaggi4538027d2014-07-30 15:43:13 +020093 public KeyguardStatusBarView(Context context, AttributeSet attrs) {
94 super(context, attrs);
95 }
96
97 @Override
98 protected void onFinishInflate() {
99 super.onFinishInflate();
Selim Cinek6ebba592016-05-31 15:28:28 -0700100 mSystemIconsContainer = findViewById(R.id.system_icons_container);
Lucas Dupina39d5b22018-02-26 15:53:43 -0800101 mMultiUserSwitch = findViewById(R.id.multi_user_switch);
102 mMultiUserAvatar = findViewById(R.id.multi_user_avatar);
103 mCarrierLabel = findViewById(R.id.keyguard_carrier_text);
104 mBatteryView = mSystemIconsContainer.findViewById(R.id.battery);
Evan Laird264275e2018-03-01 19:39:39 -0500105 mCutoutSpace = findViewById(R.id.cutout_space_view);
106 mStatusIconArea = findViewById(R.id.status_icon_area);
Dan Sandlerdf14c202017-02-21 14:51:11 -0500107
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200108 loadDimens();
109 updateUserSwitcher();
Jason Monk9c7844c2017-01-18 15:21:53 -0500110 mBatteryController = Dependency.get(BatteryController.class);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200111 }
112
Jorim Jaggie210cc82014-08-12 23:44:59 +0200113 @Override
114 protected void onConfigurationChanged(Configuration newConfig) {
115 super.onConfigurationChanged(newConfig);
116
Adrian Roosd390b892016-05-05 10:50:49 -0400117 MarginLayoutParams lp = (MarginLayoutParams) mMultiUserAvatar.getLayoutParams();
118 lp.width = lp.height = getResources().getDimensionPixelSize(
119 R.dimen.multi_user_avatar_keyguard_size);
120 mMultiUserAvatar.setLayoutParams(lp);
Selim Cinek6ebba592016-05-31 15:28:28 -0700121
Evan Laird264275e2018-03-01 19:39:39 -0500122 // Multi-user switch
Selim Cinek6ebba592016-05-31 15:28:28 -0700123 lp = (MarginLayoutParams) mMultiUserSwitch.getLayoutParams();
124 lp.width = getResources().getDimensionPixelSize(
125 R.dimen.multi_user_switch_width_keyguard);
126 lp.setMarginEnd(getResources().getDimensionPixelSize(
127 R.dimen.multi_user_switch_keyguard_margin));
128 mMultiUserSwitch.setLayoutParams(lp);
129
Evan Laird264275e2018-03-01 19:39:39 -0500130 // System icons
131 lp = (MarginLayoutParams) mStatusIconArea.getLayoutParams();
Selim Cinek6ebba592016-05-31 15:28:28 -0700132 lp.height = getResources().getDimensionPixelSize(
Evan Laird264275e2018-03-01 19:39:39 -0500133 com.android.internal.R.dimen.status_bar_height);
Selim Cinek6ebba592016-05-31 15:28:28 -0700134
135 lp = (MarginLayoutParams) mSystemIconsContainer.getLayoutParams();
136 lp.height = getResources().getDimensionPixelSize(
137 R.dimen.status_bar_height);
Evan Laird264275e2018-03-01 19:39:39 -0500138 lp.setMarginStart(getResources().getDimensionPixelSize(
139 R.dimen.system_icons_super_container_margin_start));
Selim Cinek6ebba592016-05-31 15:28:28 -0700140 mSystemIconsContainer.setLayoutParams(lp);
Evan Laird264275e2018-03-01 19:39:39 -0500141 mSystemIconsContainer.setPaddingRelative(mSystemIconsContainer.getPaddingStart(),
142 mSystemIconsContainer.getPaddingTop(),
143 getResources().getDimensionPixelSize(R.dimen.system_icons_keyguard_padding_end),
144 mSystemIconsContainer.getPaddingBottom());
Selim Cinek6ebba592016-05-31 15:28:28 -0700145
Selim Cinek6ebba592016-05-31 15:28:28 -0700146 // Respect font size setting.
147 mCarrierLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX,
148 getResources().getDimensionPixelSize(
149 com.android.internal.R.dimen.text_size_small_material));
150 lp = (MarginLayoutParams) mCarrierLabel.getLayoutParams();
151 lp.setMarginStart(
152 getResources().getDimensionPixelSize(R.dimen.keyguard_carrier_text_margin));
153 mCarrierLabel.setLayoutParams(lp);
154
155 lp = (MarginLayoutParams) getLayoutParams();
156 lp.height = getResources().getDimensionPixelSize(
157 R.dimen.status_bar_header_height_keyguard);
158 setLayoutParams(lp);
Jorim Jaggie210cc82014-08-12 23:44:59 +0200159 }
160
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200161 private void loadDimens() {
Daniel Nishif79cd872016-06-27 11:44:01 -0700162 Resources res = getResources();
163 mSystemIconsSwitcherHiddenExpandedMargin = res.getDimensionPixelSize(
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200164 R.dimen.system_icons_switcher_hidden_expanded_margin);
Daniel Nishif79cd872016-06-27 11:44:01 -0700165 mSystemIconsBaseMargin = res.getDimensionPixelSize(
166 R.dimen.system_icons_super_container_avatarless_margin_end);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200167 }
168
169 private void updateVisibilities() {
Evan Laird264275e2018-03-01 19:39:39 -0500170 if (mMultiUserSwitch.getParent() != mStatusIconArea && !mKeyguardUserSwitcherShowing) {
Jorim Jaggi98f85302014-08-07 17:45:04 +0200171 if (mMultiUserSwitch.getParent() != null) {
172 getOverlay().remove(mMultiUserSwitch);
173 }
Evan Laird264275e2018-03-01 19:39:39 -0500174 mStatusIconArea.addView(mMultiUserSwitch, 0);
175 } else if (mMultiUserSwitch.getParent() == mStatusIconArea && mKeyguardUserSwitcherShowing) {
176 mStatusIconArea.removeView(mMultiUserSwitch);
Jorim Jaggi98f85302014-08-07 17:45:04 +0200177 }
Daniel Nishi8ba446c2016-06-20 18:56:35 -0700178 if (mKeyguardUserSwitcher == null) {
179 // If we have no keyguard switcher, the screen width is under 600dp. In this case,
180 // 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 -0700181 if (mUserSwitcherController != null
182 && mUserSwitcherController.getSwitchableUserCount() > 1) {
Daniel Nishi8ba446c2016-06-20 18:56:35 -0700183 mMultiUserSwitch.setVisibility(View.VISIBLE);
184 } else {
185 mMultiUserSwitch.setVisibility(View.GONE);
186 }
187 }
Dan Sandlerdf14c202017-02-21 14:51:11 -0500188 mBatteryView.setForceShowPercent(mBatteryCharging);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200189 }
190
191 private void updateSystemIconsLayoutParams() {
Evan Laird264275e2018-03-01 19:39:39 -0500192 LinearLayout.LayoutParams lp =
193 (LinearLayout.LayoutParams) mSystemIconsContainer.getLayoutParams();
Daniel Nishif79cd872016-06-27 11:44:01 -0700194 // If the avatar icon is gone, we need to have some end margin to display the system icons
195 // correctly.
196 int baseMarginEnd = mMultiUserSwitch.getVisibility() == View.GONE
197 ? mSystemIconsBaseMargin
198 : 0;
199 int marginEnd = mKeyguardUserSwitcherShowing ? mSystemIconsSwitcherHiddenExpandedMargin :
200 baseMarginEnd;
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200201 if (marginEnd != lp.getMarginEnd()) {
202 lp.setMarginEnd(marginEnd);
Evan Laird264275e2018-03-01 19:39:39 -0500203 mSystemIconsContainer.setLayoutParams(lp);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200204 }
205 }
206
Evan Laird264275e2018-03-01 19:39:39 -0500207 @Override
208 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
209 updateLayoutConsideringCutout();
Evan Laird264275e2018-03-01 19:39:39 -0500210 super.onMeasure(widthMeasureSpec, heightMeasureSpec);
211 }
212
Adrian Roosedfab3b2018-03-08 18:39:20 +0100213 @Override
214 public WindowInsets onApplyWindowInsets(WindowInsets insets) {
Adrian Roos13836052018-03-15 21:06:37 +0100215 mLayoutState = LAYOUT_NONE;
Adrian Roosedfab3b2018-03-08 18:39:20 +0100216 if (updateLayoutConsideringCutout()) {
217 requestLayout();
218 }
219 return super.onApplyWindowInsets(insets);
220 }
221
222 private boolean updateLayoutConsideringCutout() {
Evan Laird264275e2018-03-01 19:39:39 -0500223 DisplayCutout dc = getRootWindowInsets().getDisplayCutout();
Adrian Roos13836052018-03-15 21:06:37 +0100224 Pair<Integer, Integer> cornerCutoutMargins =
225 PhoneStatusBarView.cornerCutoutMargins(dc, getDisplay());
226 updateCornerCutoutPadding(cornerCutoutMargins);
227 if (dc == null || cornerCutoutMargins != null) {
Adrian Roosedfab3b2018-03-08 18:39:20 +0100228 return updateLayoutParamsNoCutout();
Evan Laird264275e2018-03-01 19:39:39 -0500229 } else {
Adrian Roosedfab3b2018-03-08 18:39:20 +0100230 return updateLayoutParamsForCutout(dc);
Evan Laird264275e2018-03-01 19:39:39 -0500231 }
232 }
233
Adrian Roos13836052018-03-15 21:06:37 +0100234 private void updateCornerCutoutPadding(Pair<Integer, Integer> cornerCutoutMargins) {
235 if (cornerCutoutMargins != null) {
236 setPadding(cornerCutoutMargins.first, 0, cornerCutoutMargins.second, 0);
237 } else {
238 setPadding(0, 0, 0, 0);
239 }
240 }
241
Adrian Roosedfab3b2018-03-08 18:39:20 +0100242 private boolean updateLayoutParamsNoCutout() {
Evan Laird264275e2018-03-01 19:39:39 -0500243 if (mLayoutState == LAYOUT_NO_CUTOUT) {
Adrian Roosedfab3b2018-03-08 18:39:20 +0100244 return false;
Evan Laird264275e2018-03-01 19:39:39 -0500245 }
246 mLayoutState = LAYOUT_NO_CUTOUT;
247
248 if (mCutoutSpace != null) {
249 mCutoutSpace.setVisibility(View.GONE);
250 }
251
252 RelativeLayout.LayoutParams lp = (LayoutParams) mCarrierLabel.getLayoutParams();
253 lp.addRule(RelativeLayout.START_OF, R.id.status_icon_area);
254
255 lp = (LayoutParams) mStatusIconArea.getLayoutParams();
256 lp.removeRule(RelativeLayout.RIGHT_OF);
257 lp.width = LayoutParams.WRAP_CONTENT;
258
259 LinearLayout.LayoutParams llp =
260 (LinearLayout.LayoutParams) mSystemIconsContainer.getLayoutParams();
261 llp.setMarginStart(getResources().getDimensionPixelSize(
262 R.dimen.system_icons_super_container_margin_start));
Adrian Roosedfab3b2018-03-08 18:39:20 +0100263 return true;
Evan Laird264275e2018-03-01 19:39:39 -0500264 }
265
Adrian Roosedfab3b2018-03-08 18:39:20 +0100266 private boolean updateLayoutParamsForCutout(DisplayCutout dc) {
Evan Laird264275e2018-03-01 19:39:39 -0500267 if (mLayoutState == LAYOUT_CUTOUT) {
Adrian Roosedfab3b2018-03-08 18:39:20 +0100268 return false;
Evan Laird264275e2018-03-01 19:39:39 -0500269 }
270 mLayoutState = LAYOUT_CUTOUT;
271
272 if (mCutoutSpace == null) {
273 updateLayoutParamsNoCutout();
274 }
275
Adrian Roos6a4fa0e2018-03-05 19:50:16 +0100276 Rect bounds = new Rect();
277 boundsFromDirection(dc, Gravity.TOP, bounds);
278
Evan Laird264275e2018-03-01 19:39:39 -0500279 mCutoutSpace.setVisibility(View.VISIBLE);
280 RelativeLayout.LayoutParams lp = (LayoutParams) mCutoutSpace.getLayoutParams();
Adrian Roos6a4fa0e2018-03-05 19:50:16 +0100281 lp.width = bounds.width();
282 lp.height = bounds.height();
Evan Laird264275e2018-03-01 19:39:39 -0500283 lp.addRule(RelativeLayout.CENTER_IN_PARENT);
284
285 lp = (LayoutParams) mCarrierLabel.getLayoutParams();
286 lp.addRule(RelativeLayout.START_OF, R.id.cutout_space_view);
287
288 lp = (LayoutParams) mStatusIconArea.getLayoutParams();
289 lp.addRule(RelativeLayout.RIGHT_OF, R.id.cutout_space_view);
290 lp.width = LayoutParams.MATCH_PARENT;
291
292 LinearLayout.LayoutParams llp =
293 (LinearLayout.LayoutParams) mSystemIconsContainer.getLayoutParams();
294 llp.setMarginStart(0);
Adrian Roosedfab3b2018-03-08 18:39:20 +0100295 return true;
Evan Laird264275e2018-03-01 19:39:39 -0500296 }
297
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200298 public void setListening(boolean listening) {
299 if (listening == mBatteryListening) {
300 return;
301 }
302 mBatteryListening = listening;
303 if (mBatteryListening) {
Jason Monk88529052016-11-04 13:29:58 -0400304 mBatteryController.addCallback(this);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200305 } else {
Jason Monk88529052016-11-04 13:29:58 -0400306 mBatteryController.removeCallback(this);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200307 }
308 }
309
310 private void updateUserSwitcher() {
311 boolean keyguardSwitcherAvailable = mKeyguardUserSwitcher != null;
312 mMultiUserSwitch.setClickable(keyguardSwitcherAvailable);
313 mMultiUserSwitch.setFocusable(keyguardSwitcherAvailable);
314 mMultiUserSwitch.setKeyguardMode(keyguardSwitcherAvailable);
315 }
316
Jason Monk9c7844c2017-01-18 15:21:53 -0500317 @Override
318 protected void onAttachedToWindow() {
319 super.onAttachedToWindow();
320 UserInfoController userInfoController = Dependency.get(UserInfoController.class);
321 userInfoController.addCallback(this);
322 mUserSwitcherController = Dependency.get(UserSwitcherController.class);
323 mMultiUserSwitch.setUserSwitcherController(mUserSwitcherController);
324 userInfoController.reloadUserInfo();
Jason Monk9cac5ff2017-06-02 11:35:50 -0400325 Dependency.get(ConfigurationController.class).addCallback(this);
326 mIconManager = new TintedIconManager(findViewById(R.id.statusIcons));
327 Dependency.get(StatusBarIconController.class).addIconGroup(mIconManager);
Lucas Dupina39d5b22018-02-26 15:53:43 -0800328 onThemeChanged();
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200329 }
330
Jason Monk9c7844c2017-01-18 15:21:53 -0500331 @Override
332 protected void onDetachedFromWindow() {
333 super.onDetachedFromWindow();
334 Dependency.get(UserInfoController.class).removeCallback(this);
Jason Monk9cac5ff2017-06-02 11:35:50 -0400335 Dependency.get(StatusBarIconController.class).removeIconGroup(mIconManager);
336 Dependency.get(ConfigurationController.class).removeCallback(this);
Adrian Roosffc90972015-06-09 18:09:49 -0700337 }
338
Jason Monk9c7844c2017-01-18 15:21:53 -0500339 @Override
340 public void onUserInfoChanged(String name, Drawable picture, String userAccount) {
341 mMultiUserAvatar.setImageDrawable(picture);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200342 }
343
Kaori Katouccf08d72015-05-26 16:25:04 +0900344 public void setQSPanel(QSPanel qsp) {
345 mMultiUserSwitch.setQsPanel(qsp);
346 }
347
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200348 @Override
349 public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
Dan Sandlerdf14c202017-02-21 14:51:11 -0500350 if (mBatteryCharging != charging) {
351 mBatteryCharging = charging;
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200352 updateVisibilities();
353 }
354 }
355
356 @Override
Jason Monkc06fbb12016-01-08 14:12:18 -0500357 public void onPowerSaveChanged(boolean isPowerSave) {
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200358 // could not care less
359 }
360
361 public void setKeyguardUserSwitcher(KeyguardUserSwitcher keyguardUserSwitcher) {
362 mKeyguardUserSwitcher = keyguardUserSwitcher;
363 mMultiUserSwitch.setKeyguardUserSwitcher(keyguardUserSwitcher);
364 updateUserSwitcher();
365 }
366
Jorim Jaggi98f85302014-08-07 17:45:04 +0200367 public void setKeyguardUserSwitcherShowing(boolean showing, boolean animate) {
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200368 mKeyguardUserSwitcherShowing = showing;
Jorim Jaggi98f85302014-08-07 17:45:04 +0200369 if (animate) {
370 animateNextLayoutChange();
371 }
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200372 updateVisibilities();
Evan Laird264275e2018-03-01 19:39:39 -0500373 updateLayoutConsideringCutout();
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200374 updateSystemIconsLayoutParams();
375 }
376
Jorim Jaggi98f85302014-08-07 17:45:04 +0200377 private void animateNextLayoutChange() {
Evan Laird264275e2018-03-01 19:39:39 -0500378 final int systemIconsCurrentX = mSystemIconsContainer.getLeft();
379 final boolean userSwitcherVisible = mMultiUserSwitch.getParent() == mStatusIconArea;
Jorim Jaggi98f85302014-08-07 17:45:04 +0200380 getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
381 @Override
382 public boolean onPreDraw() {
383 getViewTreeObserver().removeOnPreDrawListener(this);
384 boolean userSwitcherHiding = userSwitcherVisible
Evan Laird264275e2018-03-01 19:39:39 -0500385 && mMultiUserSwitch.getParent() != mStatusIconArea;
386 mSystemIconsContainer.setX(systemIconsCurrentX);
387 mSystemIconsContainer.animate()
Jorim Jaggi98f85302014-08-07 17:45:04 +0200388 .translationX(0)
389 .setDuration(400)
390 .setStartDelay(userSwitcherHiding ? 300 : 0)
Selim Cinekc18010f2016-01-20 13:41:30 -0800391 .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
Jorim Jaggi98f85302014-08-07 17:45:04 +0200392 .start();
393 if (userSwitcherHiding) {
394 getOverlay().add(mMultiUserSwitch);
395 mMultiUserSwitch.animate()
396 .alpha(0f)
397 .setDuration(300)
398 .setStartDelay(0)
Selim Cinekc18010f2016-01-20 13:41:30 -0800399 .setInterpolator(Interpolators.ALPHA_OUT)
Lucas Dupina39d5b22018-02-26 15:53:43 -0800400 .withEndAction(() -> {
401 mMultiUserSwitch.setAlpha(1f);
402 getOverlay().remove(mMultiUserSwitch);
Jorim Jaggi98f85302014-08-07 17:45:04 +0200403 })
404 .start();
405
406 } else {
407 mMultiUserSwitch.setAlpha(0f);
408 mMultiUserSwitch.animate()
409 .alpha(1f)
410 .setDuration(300)
411 .setStartDelay(200)
Selim Cinekc18010f2016-01-20 13:41:30 -0800412 .setInterpolator(Interpolators.ALPHA_IN);
Jorim Jaggi98f85302014-08-07 17:45:04 +0200413 }
414 return true;
415 }
416 });
417
418 }
419
420 @Override
421 public void setVisibility(int visibility) {
422 super.setVisibility(visibility);
423 if (visibility != View.VISIBLE) {
Evan Laird264275e2018-03-01 19:39:39 -0500424 mSystemIconsContainer.animate().cancel();
425 mSystemIconsContainer.setTranslationX(0);
Jorim Jaggi98f85302014-08-07 17:45:04 +0200426 mMultiUserSwitch.animate().cancel();
427 mMultiUserSwitch.setAlpha(1f);
Daniel Nishi8ba446c2016-06-20 18:56:35 -0700428 } else {
429 updateVisibilities();
Daniel Nishif79cd872016-06-27 11:44:01 -0700430 updateSystemIconsLayoutParams();
Jorim Jaggi98f85302014-08-07 17:45:04 +0200431 }
432 }
433
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200434 @Override
435 public boolean hasOverlappingRendering() {
436 return false;
437 }
Lucas Dupin987f1932017-05-13 21:02:52 -0700438
Lucas Dupin8c51ce22017-11-21 13:21:05 -0800439 public void onThemeChanged() {
Lucas Dupina360e1e72017-07-17 17:25:20 -0700440 @ColorInt int textColor = Utils.getColorAttr(mContext, R.attr.wallpaperTextColor);
Lucas Dupin6ebc2182017-07-18 12:15:41 -0700441 @ColorInt int iconColor = Utils.getDefaultColor(mContext, Color.luminance(textColor) < 0.5 ?
442 R.color.dark_mode_icon_color_single_tone :
443 R.color.light_mode_icon_color_single_tone);
Jason Monk9cac5ff2017-06-02 11:35:50 -0400444 float intensity = textColor == Color.WHITE ? 0 : 1;
Lucas Dupin6ebc2182017-07-18 12:15:41 -0700445 mCarrierLabel.setTextColor(iconColor);
446 mBatteryView.setFillColor(iconColor);
447 mIconManager.setTint(iconColor);
Jason Monk9cac5ff2017-06-02 11:35:50 -0400448 Rect tintArea = new Rect(0, 0, 0, 0);
449
Lucas Dupin6ebc2182017-07-18 12:15:41 -0700450 applyDarkness(R.id.battery, tintArea, intensity, iconColor);
451 applyDarkness(R.id.clock, tintArea, intensity, iconColor);
Lucas Dupin542aebc2017-08-04 11:24:06 -0700452 // Reload user avatar
453 ((UserInfoControllerImpl) Dependency.get(UserInfoController.class))
454 .onDensityOrFontScaleChanged();
Jason Monk9cac5ff2017-06-02 11:35:50 -0400455 }
456
457 private void applyDarkness(int id, Rect tintArea, float intensity, int color) {
458 View v = findViewById(id);
459 if (v instanceof DarkReceiver) {
460 ((DarkReceiver) v).onDarkChanged(tintArea, intensity, color);
461 }
Lucas Dupin987f1932017-05-13 21:02:52 -0700462 }
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200463}