blob: 9787d73f2ee026065131c5b80221508da67eaf83 [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
Adrian Roosedfab3b2018-03-08 18:39:20 +0100208 public WindowInsets onApplyWindowInsets(WindowInsets insets) {
Adrian Roos13836052018-03-15 21:06:37 +0100209 mLayoutState = LAYOUT_NONE;
Adrian Roosedfab3b2018-03-08 18:39:20 +0100210 if (updateLayoutConsideringCutout()) {
211 requestLayout();
212 }
213 return super.onApplyWindowInsets(insets);
214 }
215
216 private boolean updateLayoutConsideringCutout() {
Evan Laird264275e2018-03-01 19:39:39 -0500217 DisplayCutout dc = getRootWindowInsets().getDisplayCutout();
Adrian Roos13836052018-03-15 21:06:37 +0100218 Pair<Integer, Integer> cornerCutoutMargins =
219 PhoneStatusBarView.cornerCutoutMargins(dc, getDisplay());
220 updateCornerCutoutPadding(cornerCutoutMargins);
221 if (dc == null || cornerCutoutMargins != null) {
Adrian Roosedfab3b2018-03-08 18:39:20 +0100222 return updateLayoutParamsNoCutout();
Evan Laird264275e2018-03-01 19:39:39 -0500223 } else {
Adrian Roosedfab3b2018-03-08 18:39:20 +0100224 return updateLayoutParamsForCutout(dc);
Evan Laird264275e2018-03-01 19:39:39 -0500225 }
226 }
227
Adrian Roos13836052018-03-15 21:06:37 +0100228 private void updateCornerCutoutPadding(Pair<Integer, Integer> cornerCutoutMargins) {
229 if (cornerCutoutMargins != null) {
230 setPadding(cornerCutoutMargins.first, 0, cornerCutoutMargins.second, 0);
231 } else {
232 setPadding(0, 0, 0, 0);
233 }
234 }
235
Adrian Roosedfab3b2018-03-08 18:39:20 +0100236 private boolean updateLayoutParamsNoCutout() {
Evan Laird264275e2018-03-01 19:39:39 -0500237 if (mLayoutState == LAYOUT_NO_CUTOUT) {
Adrian Roosedfab3b2018-03-08 18:39:20 +0100238 return false;
Evan Laird264275e2018-03-01 19:39:39 -0500239 }
240 mLayoutState = LAYOUT_NO_CUTOUT;
241
242 if (mCutoutSpace != null) {
243 mCutoutSpace.setVisibility(View.GONE);
244 }
245
246 RelativeLayout.LayoutParams lp = (LayoutParams) mCarrierLabel.getLayoutParams();
247 lp.addRule(RelativeLayout.START_OF, R.id.status_icon_area);
248
249 lp = (LayoutParams) mStatusIconArea.getLayoutParams();
250 lp.removeRule(RelativeLayout.RIGHT_OF);
251 lp.width = LayoutParams.WRAP_CONTENT;
252
253 LinearLayout.LayoutParams llp =
254 (LinearLayout.LayoutParams) mSystemIconsContainer.getLayoutParams();
255 llp.setMarginStart(getResources().getDimensionPixelSize(
256 R.dimen.system_icons_super_container_margin_start));
Adrian Roosedfab3b2018-03-08 18:39:20 +0100257 return true;
Evan Laird264275e2018-03-01 19:39:39 -0500258 }
259
Adrian Roosedfab3b2018-03-08 18:39:20 +0100260 private boolean updateLayoutParamsForCutout(DisplayCutout dc) {
Evan Laird264275e2018-03-01 19:39:39 -0500261 if (mLayoutState == LAYOUT_CUTOUT) {
Adrian Roosedfab3b2018-03-08 18:39:20 +0100262 return false;
Evan Laird264275e2018-03-01 19:39:39 -0500263 }
264 mLayoutState = LAYOUT_CUTOUT;
265
266 if (mCutoutSpace == null) {
267 updateLayoutParamsNoCutout();
268 }
269
Adrian Roos6a4fa0e2018-03-05 19:50:16 +0100270 Rect bounds = new Rect();
271 boundsFromDirection(dc, Gravity.TOP, bounds);
272
Evan Laird264275e2018-03-01 19:39:39 -0500273 mCutoutSpace.setVisibility(View.VISIBLE);
274 RelativeLayout.LayoutParams lp = (LayoutParams) mCutoutSpace.getLayoutParams();
Adrian Roos6a4fa0e2018-03-05 19:50:16 +0100275 lp.width = bounds.width();
276 lp.height = bounds.height();
Evan Laird264275e2018-03-01 19:39:39 -0500277 lp.addRule(RelativeLayout.CENTER_IN_PARENT);
278
279 lp = (LayoutParams) mCarrierLabel.getLayoutParams();
280 lp.addRule(RelativeLayout.START_OF, R.id.cutout_space_view);
281
282 lp = (LayoutParams) mStatusIconArea.getLayoutParams();
283 lp.addRule(RelativeLayout.RIGHT_OF, R.id.cutout_space_view);
284 lp.width = LayoutParams.MATCH_PARENT;
285
286 LinearLayout.LayoutParams llp =
287 (LinearLayout.LayoutParams) mSystemIconsContainer.getLayoutParams();
288 llp.setMarginStart(0);
Adrian Roosedfab3b2018-03-08 18:39:20 +0100289 return true;
Evan Laird264275e2018-03-01 19:39:39 -0500290 }
291
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200292 public void setListening(boolean listening) {
293 if (listening == mBatteryListening) {
294 return;
295 }
296 mBatteryListening = listening;
297 if (mBatteryListening) {
Jason Monk88529052016-11-04 13:29:58 -0400298 mBatteryController.addCallback(this);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200299 } else {
Jason Monk88529052016-11-04 13:29:58 -0400300 mBatteryController.removeCallback(this);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200301 }
302 }
303
304 private void updateUserSwitcher() {
305 boolean keyguardSwitcherAvailable = mKeyguardUserSwitcher != null;
306 mMultiUserSwitch.setClickable(keyguardSwitcherAvailable);
307 mMultiUserSwitch.setFocusable(keyguardSwitcherAvailable);
308 mMultiUserSwitch.setKeyguardMode(keyguardSwitcherAvailable);
309 }
310
Jason Monk9c7844c2017-01-18 15:21:53 -0500311 @Override
312 protected void onAttachedToWindow() {
313 super.onAttachedToWindow();
314 UserInfoController userInfoController = Dependency.get(UserInfoController.class);
315 userInfoController.addCallback(this);
316 mUserSwitcherController = Dependency.get(UserSwitcherController.class);
317 mMultiUserSwitch.setUserSwitcherController(mUserSwitcherController);
318 userInfoController.reloadUserInfo();
Jason Monk9cac5ff2017-06-02 11:35:50 -0400319 Dependency.get(ConfigurationController.class).addCallback(this);
320 mIconManager = new TintedIconManager(findViewById(R.id.statusIcons));
321 Dependency.get(StatusBarIconController.class).addIconGroup(mIconManager);
Lucas Dupina39d5b22018-02-26 15:53:43 -0800322 onThemeChanged();
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200323 }
324
Jason Monk9c7844c2017-01-18 15:21:53 -0500325 @Override
326 protected void onDetachedFromWindow() {
327 super.onDetachedFromWindow();
328 Dependency.get(UserInfoController.class).removeCallback(this);
Jason Monk9cac5ff2017-06-02 11:35:50 -0400329 Dependency.get(StatusBarIconController.class).removeIconGroup(mIconManager);
330 Dependency.get(ConfigurationController.class).removeCallback(this);
Adrian Roosffc90972015-06-09 18:09:49 -0700331 }
332
Jason Monk9c7844c2017-01-18 15:21:53 -0500333 @Override
334 public void onUserInfoChanged(String name, Drawable picture, String userAccount) {
335 mMultiUserAvatar.setImageDrawable(picture);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200336 }
337
Kaori Katouccf08d72015-05-26 16:25:04 +0900338 public void setQSPanel(QSPanel qsp) {
339 mMultiUserSwitch.setQsPanel(qsp);
340 }
341
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200342 @Override
343 public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
Dan Sandlerdf14c202017-02-21 14:51:11 -0500344 if (mBatteryCharging != charging) {
345 mBatteryCharging = charging;
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200346 updateVisibilities();
347 }
348 }
349
350 @Override
Jason Monkc06fbb12016-01-08 14:12:18 -0500351 public void onPowerSaveChanged(boolean isPowerSave) {
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200352 // could not care less
353 }
354
355 public void setKeyguardUserSwitcher(KeyguardUserSwitcher keyguardUserSwitcher) {
356 mKeyguardUserSwitcher = keyguardUserSwitcher;
357 mMultiUserSwitch.setKeyguardUserSwitcher(keyguardUserSwitcher);
358 updateUserSwitcher();
359 }
360
Jorim Jaggi98f85302014-08-07 17:45:04 +0200361 public void setKeyguardUserSwitcherShowing(boolean showing, boolean animate) {
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200362 mKeyguardUserSwitcherShowing = showing;
Jorim Jaggi98f85302014-08-07 17:45:04 +0200363 if (animate) {
364 animateNextLayoutChange();
365 }
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200366 updateVisibilities();
Evan Laird264275e2018-03-01 19:39:39 -0500367 updateLayoutConsideringCutout();
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200368 updateSystemIconsLayoutParams();
369 }
370
Jorim Jaggi98f85302014-08-07 17:45:04 +0200371 private void animateNextLayoutChange() {
Evan Laird264275e2018-03-01 19:39:39 -0500372 final int systemIconsCurrentX = mSystemIconsContainer.getLeft();
373 final boolean userSwitcherVisible = mMultiUserSwitch.getParent() == mStatusIconArea;
Jorim Jaggi98f85302014-08-07 17:45:04 +0200374 getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
375 @Override
376 public boolean onPreDraw() {
377 getViewTreeObserver().removeOnPreDrawListener(this);
378 boolean userSwitcherHiding = userSwitcherVisible
Evan Laird264275e2018-03-01 19:39:39 -0500379 && mMultiUserSwitch.getParent() != mStatusIconArea;
380 mSystemIconsContainer.setX(systemIconsCurrentX);
381 mSystemIconsContainer.animate()
Jorim Jaggi98f85302014-08-07 17:45:04 +0200382 .translationX(0)
383 .setDuration(400)
384 .setStartDelay(userSwitcherHiding ? 300 : 0)
Selim Cinekc18010f2016-01-20 13:41:30 -0800385 .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
Jorim Jaggi98f85302014-08-07 17:45:04 +0200386 .start();
387 if (userSwitcherHiding) {
388 getOverlay().add(mMultiUserSwitch);
389 mMultiUserSwitch.animate()
390 .alpha(0f)
391 .setDuration(300)
392 .setStartDelay(0)
Selim Cinekc18010f2016-01-20 13:41:30 -0800393 .setInterpolator(Interpolators.ALPHA_OUT)
Lucas Dupina39d5b22018-02-26 15:53:43 -0800394 .withEndAction(() -> {
395 mMultiUserSwitch.setAlpha(1f);
396 getOverlay().remove(mMultiUserSwitch);
Jorim Jaggi98f85302014-08-07 17:45:04 +0200397 })
398 .start();
399
400 } else {
401 mMultiUserSwitch.setAlpha(0f);
402 mMultiUserSwitch.animate()
403 .alpha(1f)
404 .setDuration(300)
405 .setStartDelay(200)
Selim Cinekc18010f2016-01-20 13:41:30 -0800406 .setInterpolator(Interpolators.ALPHA_IN);
Jorim Jaggi98f85302014-08-07 17:45:04 +0200407 }
408 return true;
409 }
410 });
411
412 }
413
414 @Override
415 public void setVisibility(int visibility) {
416 super.setVisibility(visibility);
417 if (visibility != View.VISIBLE) {
Evan Laird264275e2018-03-01 19:39:39 -0500418 mSystemIconsContainer.animate().cancel();
419 mSystemIconsContainer.setTranslationX(0);
Jorim Jaggi98f85302014-08-07 17:45:04 +0200420 mMultiUserSwitch.animate().cancel();
421 mMultiUserSwitch.setAlpha(1f);
Daniel Nishi8ba446c2016-06-20 18:56:35 -0700422 } else {
423 updateVisibilities();
Daniel Nishif79cd872016-06-27 11:44:01 -0700424 updateSystemIconsLayoutParams();
Jorim Jaggi98f85302014-08-07 17:45:04 +0200425 }
426 }
427
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200428 @Override
429 public boolean hasOverlappingRendering() {
430 return false;
431 }
Lucas Dupin987f1932017-05-13 21:02:52 -0700432
Lucas Dupin8c51ce22017-11-21 13:21:05 -0800433 public void onThemeChanged() {
Lucas Dupina360e1e72017-07-17 17:25:20 -0700434 @ColorInt int textColor = Utils.getColorAttr(mContext, R.attr.wallpaperTextColor);
Lucas Dupin6ebc2182017-07-18 12:15:41 -0700435 @ColorInt int iconColor = Utils.getDefaultColor(mContext, Color.luminance(textColor) < 0.5 ?
436 R.color.dark_mode_icon_color_single_tone :
437 R.color.light_mode_icon_color_single_tone);
Jason Monk9cac5ff2017-06-02 11:35:50 -0400438 float intensity = textColor == Color.WHITE ? 0 : 1;
Lucas Dupin6ebc2182017-07-18 12:15:41 -0700439 mCarrierLabel.setTextColor(iconColor);
440 mBatteryView.setFillColor(iconColor);
441 mIconManager.setTint(iconColor);
Jason Monk9cac5ff2017-06-02 11:35:50 -0400442 Rect tintArea = new Rect(0, 0, 0, 0);
443
Lucas Dupin6ebc2182017-07-18 12:15:41 -0700444 applyDarkness(R.id.battery, tintArea, intensity, iconColor);
445 applyDarkness(R.id.clock, tintArea, intensity, iconColor);
Lucas Dupin542aebc2017-08-04 11:24:06 -0700446 // Reload user avatar
447 ((UserInfoControllerImpl) Dependency.get(UserInfoController.class))
448 .onDensityOrFontScaleChanged();
Jason Monk9cac5ff2017-06-02 11:35:50 -0400449 }
450
451 private void applyDarkness(int id, Rect tintArea, float intensity, int color) {
452 View v = findViewById(id);
453 if (v instanceof DarkReceiver) {
454 ((DarkReceiver) v).onDarkChanged(tintArea, intensity, color);
455 }
Lucas Dupin987f1932017-05-13 21:02:52 -0700456 }
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200457}