2 * Copyright (C) 2014 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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
17 package com.android.systemui.statusbar.phone;
19 import android.content.Context;
20 import android.content.res.Configuration;
21 import android.graphics.drawable.Drawable;
22 import android.util.AttributeSet;
23 import android.util.TypedValue;
24 import android.view.View;
25 import android.view.ViewTreeObserver;
26 import android.widget.ImageView;
27 import android.widget.RelativeLayout;
28 import android.widget.TextView;
30 import com.android.systemui.BatteryMeterView;
31 import com.android.systemui.Interpolators;
32 import com.android.systemui.R;
33 import com.android.systemui.qs.QSPanel;
34 import com.android.systemui.statusbar.policy.BatteryController;
35 import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
36 import com.android.systemui.statusbar.policy.UserInfoController;
37 import com.android.systemui.statusbar.policy.UserSwitcherController;
39 import java.text.NumberFormat;
42 * The header group on Keyguard.
44 public class KeyguardStatusBarView extends RelativeLayout
45 implements BatteryController.BatteryStateChangeCallback {
47 private boolean mBatteryCharging;
48 private boolean mKeyguardUserSwitcherShowing;
49 private boolean mBatteryListening;
51 private TextView mCarrierLabel;
52 private View mSystemIconsSuperContainer;
53 private MultiUserSwitch mMultiUserSwitch;
54 private ImageView mMultiUserAvatar;
55 private TextView mBatteryLevel;
57 private BatteryController mBatteryController;
58 private KeyguardUserSwitcher mKeyguardUserSwitcher;
60 private int mSystemIconsSwitcherHiddenExpandedMargin;
61 private View mSystemIconsContainer;
63 public KeyguardStatusBarView(Context context, AttributeSet attrs) {
64 super(context, attrs);
68 protected void onFinishInflate() {
69 super.onFinishInflate();
70 mSystemIconsSuperContainer = findViewById(R.id.system_icons_super_container);
71 mSystemIconsContainer = findViewById(R.id.system_icons_container);
72 mMultiUserSwitch = (MultiUserSwitch) findViewById(R.id.multi_user_switch);
73 mMultiUserAvatar = (ImageView) findViewById(R.id.multi_user_avatar);
74 mBatteryLevel = (TextView) findViewById(R.id.battery_level);
75 mCarrierLabel = (TextView) findViewById(R.id.keyguard_carrier_text);
81 protected void onConfigurationChanged(Configuration newConfig) {
82 super.onConfigurationChanged(newConfig);
84 MarginLayoutParams lp = (MarginLayoutParams) mMultiUserAvatar.getLayoutParams();
85 lp.width = lp.height = getResources().getDimensionPixelSize(
86 R.dimen.multi_user_avatar_keyguard_size);
87 mMultiUserAvatar.setLayoutParams(lp);
89 lp = (MarginLayoutParams) mMultiUserSwitch.getLayoutParams();
90 lp.width = getResources().getDimensionPixelSize(
91 R.dimen.multi_user_switch_width_keyguard);
92 lp.setMarginEnd(getResources().getDimensionPixelSize(
93 R.dimen.multi_user_switch_keyguard_margin));
94 mMultiUserSwitch.setLayoutParams(lp);
96 lp = (MarginLayoutParams) mSystemIconsSuperContainer.getLayoutParams();
97 lp.height = getResources().getDimensionPixelSize(
98 R.dimen.status_bar_header_height);
99 lp.setMarginStart(getResources().getDimensionPixelSize(
100 R.dimen.system_icons_super_container_margin_start));
101 mSystemIconsSuperContainer.setLayoutParams(lp);
102 mSystemIconsSuperContainer.setPaddingRelative(mSystemIconsSuperContainer.getPaddingStart(),
103 mSystemIconsSuperContainer.getPaddingTop(),
104 getResources().getDimensionPixelSize(R.dimen.system_icons_keyguard_padding_end),
105 mSystemIconsSuperContainer.getPaddingBottom());
107 lp = (MarginLayoutParams) mSystemIconsContainer.getLayoutParams();
108 lp.height = getResources().getDimensionPixelSize(
109 R.dimen.status_bar_height);
110 mSystemIconsContainer.setLayoutParams(lp);
112 lp = (MarginLayoutParams) mBatteryLevel.getLayoutParams();
114 getResources().getDimensionPixelSize(R.dimen.header_battery_margin_keyguard));
115 mBatteryLevel.setLayoutParams(lp);
116 mBatteryLevel.setPaddingRelative(mBatteryLevel.getPaddingStart(),
117 mBatteryLevel.getPaddingTop(),
118 getResources().getDimensionPixelSize(R.dimen.battery_level_padding_end),
119 mBatteryLevel.getPaddingBottom());
120 mBatteryLevel.setTextSize(TypedValue.COMPLEX_UNIT_PX,
121 getResources().getDimensionPixelSize(R.dimen.battery_level_text_size));
123 // Respect font size setting.
124 mCarrierLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX,
125 getResources().getDimensionPixelSize(
126 com.android.internal.R.dimen.text_size_small_material));
127 lp = (MarginLayoutParams) mCarrierLabel.getLayoutParams();
129 getResources().getDimensionPixelSize(R.dimen.keyguard_carrier_text_margin));
130 mCarrierLabel.setLayoutParams(lp);
132 lp = (MarginLayoutParams) getLayoutParams();
133 lp.height = getResources().getDimensionPixelSize(
134 R.dimen.status_bar_header_height_keyguard);
138 private void loadDimens() {
139 mSystemIconsSwitcherHiddenExpandedMargin = getResources().getDimensionPixelSize(
140 R.dimen.system_icons_switcher_hidden_expanded_margin);
143 private void updateVisibilities() {
144 if (mMultiUserSwitch.getParent() != this && !mKeyguardUserSwitcherShowing) {
145 if (mMultiUserSwitch.getParent() != null) {
146 getOverlay().remove(mMultiUserSwitch);
148 addView(mMultiUserSwitch, 0);
149 } else if (mMultiUserSwitch.getParent() == this && mKeyguardUserSwitcherShowing) {
150 removeView(mMultiUserSwitch);
152 mBatteryLevel.setVisibility(mBatteryCharging ? View.VISIBLE : View.GONE);
155 private void updateSystemIconsLayoutParams() {
156 RelativeLayout.LayoutParams lp =
157 (LayoutParams) mSystemIconsSuperContainer.getLayoutParams();
158 int marginEnd = mKeyguardUserSwitcherShowing ? mSystemIconsSwitcherHiddenExpandedMargin : 0;
159 if (marginEnd != lp.getMarginEnd()) {
160 lp.setMarginEnd(marginEnd);
161 mSystemIconsSuperContainer.setLayoutParams(lp);
165 public void setListening(boolean listening) {
166 if (listening == mBatteryListening) {
169 mBatteryListening = listening;
170 if (mBatteryListening) {
171 mBatteryController.addStateChangedCallback(this);
173 mBatteryController.removeStateChangedCallback(this);
177 private void updateUserSwitcher() {
178 boolean keyguardSwitcherAvailable = mKeyguardUserSwitcher != null;
179 mMultiUserSwitch.setClickable(keyguardSwitcherAvailable);
180 mMultiUserSwitch.setFocusable(keyguardSwitcherAvailable);
181 mMultiUserSwitch.setKeyguardMode(keyguardSwitcherAvailable);
184 public void setBatteryController(BatteryController batteryController) {
185 mBatteryController = batteryController;
186 ((BatteryMeterView) findViewById(R.id.battery)).setBatteryController(batteryController);
189 public void setUserSwitcherController(UserSwitcherController controller) {
190 mMultiUserSwitch.setUserSwitcherController(controller);
193 public void setUserInfoController(UserInfoController userInfoController) {
194 userInfoController.addListener(new UserInfoController.OnUserInfoChangedListener() {
196 public void onUserInfoChanged(String name, Drawable picture) {
197 mMultiUserAvatar.setImageDrawable(picture);
202 public void setQSPanel(QSPanel qsp) {
203 mMultiUserSwitch.setQsPanel(qsp);
207 public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
208 String percentage = NumberFormat.getPercentInstance().format((double) level / 100.0);
209 mBatteryLevel.setText(percentage);
210 boolean changed = mBatteryCharging != charging;
211 mBatteryCharging = charging;
213 updateVisibilities();
218 public void onPowerSaveChanged(boolean isPowerSave) {
219 // could not care less
222 public void setKeyguardUserSwitcher(KeyguardUserSwitcher keyguardUserSwitcher) {
223 mKeyguardUserSwitcher = keyguardUserSwitcher;
224 mMultiUserSwitch.setKeyguardUserSwitcher(keyguardUserSwitcher);
225 updateUserSwitcher();
228 public void setKeyguardUserSwitcherShowing(boolean showing, boolean animate) {
229 mKeyguardUserSwitcherShowing = showing;
231 animateNextLayoutChange();
233 updateVisibilities();
234 updateSystemIconsLayoutParams();
237 private void animateNextLayoutChange() {
238 final int systemIconsCurrentX = mSystemIconsSuperContainer.getLeft();
239 final boolean userSwitcherVisible = mMultiUserSwitch.getParent() == this;
240 getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
242 public boolean onPreDraw() {
243 getViewTreeObserver().removeOnPreDrawListener(this);
244 boolean userSwitcherHiding = userSwitcherVisible
245 && mMultiUserSwitch.getParent() != KeyguardStatusBarView.this;
246 mSystemIconsSuperContainer.setX(systemIconsCurrentX);
247 mSystemIconsSuperContainer.animate()
250 .setStartDelay(userSwitcherHiding ? 300 : 0)
251 .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
253 if (userSwitcherHiding) {
254 getOverlay().add(mMultiUserSwitch);
255 mMultiUserSwitch.animate()
259 .setInterpolator(Interpolators.ALPHA_OUT)
260 .withEndAction(new Runnable() {
263 mMultiUserSwitch.setAlpha(1f);
264 getOverlay().remove(mMultiUserSwitch);
270 mMultiUserSwitch.setAlpha(0f);
271 mMultiUserSwitch.animate()
275 .setInterpolator(Interpolators.ALPHA_IN);
284 public void setVisibility(int visibility) {
285 super.setVisibility(visibility);
286 if (visibility != View.VISIBLE) {
287 mSystemIconsSuperContainer.animate().cancel();
288 mMultiUserSwitch.animate().cancel();
289 mMultiUserSwitch.setAlpha(1f);
294 public boolean hasOverlappingRendering() {