• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
17 package com.android.systemui.statusbar.phone;
18 
19 import android.animation.LayoutTransition;
20 import android.content.Context;
21 import android.content.res.Configuration;
22 import android.graphics.drawable.Drawable;
23 import android.util.AttributeSet;
24 import android.util.TypedValue;
25 import android.view.View;
26 import android.view.ViewTreeObserver;
27 import android.view.animation.AnimationUtils;
28 import android.view.animation.Interpolator;
29 import android.widget.ImageView;
30 import android.widget.RelativeLayout;
31 import android.widget.TextView;
32 
33 import com.android.systemui.BatteryMeterView;
34 import com.android.systemui.R;
35 import com.android.systemui.statusbar.policy.BatteryController;
36 import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
37 import com.android.systemui.statusbar.policy.UserInfoController;
38 
39 import java.text.NumberFormat;
40 
41 /**
42  * The header group on Keyguard.
43  */
44 public class KeyguardStatusBarView extends RelativeLayout
45         implements BatteryController.BatteryStateChangeCallback {
46 
47     private boolean mBatteryCharging;
48     private boolean mKeyguardUserSwitcherShowing;
49     private boolean mBatteryListening;
50 
51     private TextView mCarrierLabel;
52     private View mSystemIconsSuperContainer;
53     private MultiUserSwitch mMultiUserSwitch;
54     private ImageView mMultiUserAvatar;
55     private TextView mBatteryLevel;
56 
57     private BatteryController mBatteryController;
58     private KeyguardUserSwitcher mKeyguardUserSwitcher;
59 
60     private int mSystemIconsSwitcherHiddenExpandedMargin;
61     private Interpolator mFastOutSlowInInterpolator;
62 
KeyguardStatusBarView(Context context, AttributeSet attrs)63     public KeyguardStatusBarView(Context context, AttributeSet attrs) {
64         super(context, attrs);
65     }
66 
67     @Override
onFinishInflate()68     protected void onFinishInflate() {
69         super.onFinishInflate();
70         mSystemIconsSuperContainer = findViewById(R.id.system_icons_super_container);
71         mMultiUserSwitch = (MultiUserSwitch) findViewById(R.id.multi_user_switch);
72         mMultiUserAvatar = (ImageView) findViewById(R.id.multi_user_avatar);
73         mBatteryLevel = (TextView) findViewById(R.id.battery_level);
74         mCarrierLabel = (TextView) findViewById(R.id.keyguard_carrier_text);
75         loadDimens();
76         mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(getContext(),
77                 android.R.interpolator.fast_out_slow_in);
78         updateUserSwitcher();
79     }
80 
81     @Override
onConfigurationChanged(Configuration newConfig)82     protected void onConfigurationChanged(Configuration newConfig) {
83         super.onConfigurationChanged(newConfig);
84 
85         // Respect font size setting.
86         mCarrierLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX,
87                 getResources().getDimensionPixelSize(
88                         com.android.internal.R.dimen.text_size_small_material));
89         mBatteryLevel.setTextSize(TypedValue.COMPLEX_UNIT_PX,
90                 getResources().getDimensionPixelSize(R.dimen.battery_level_text_size));
91     }
92 
loadDimens()93     private void loadDimens() {
94         mSystemIconsSwitcherHiddenExpandedMargin = getResources().getDimensionPixelSize(
95                 R.dimen.system_icons_switcher_hidden_expanded_margin);
96     }
97 
updateVisibilities()98     private void updateVisibilities() {
99         if (mMultiUserSwitch.getParent() != this && !mKeyguardUserSwitcherShowing) {
100             if (mMultiUserSwitch.getParent() != null) {
101                 getOverlay().remove(mMultiUserSwitch);
102             }
103             addView(mMultiUserSwitch, 0);
104         } else if (mMultiUserSwitch.getParent() == this && mKeyguardUserSwitcherShowing) {
105             removeView(mMultiUserSwitch);
106         }
107         mBatteryLevel.setVisibility(mBatteryCharging ? View.VISIBLE : View.GONE);
108     }
109 
updateSystemIconsLayoutParams()110     private void updateSystemIconsLayoutParams() {
111         RelativeLayout.LayoutParams lp =
112                 (LayoutParams) mSystemIconsSuperContainer.getLayoutParams();
113         int marginEnd = mKeyguardUserSwitcherShowing ? mSystemIconsSwitcherHiddenExpandedMargin : 0;
114         if (marginEnd != lp.getMarginEnd()) {
115             lp.setMarginEnd(marginEnd);
116             mSystemIconsSuperContainer.setLayoutParams(lp);
117         }
118     }
119 
setListening(boolean listening)120     public void setListening(boolean listening) {
121         if (listening == mBatteryListening) {
122             return;
123         }
124         mBatteryListening = listening;
125         if (mBatteryListening) {
126             mBatteryController.addStateChangedCallback(this);
127         } else {
128             mBatteryController.removeStateChangedCallback(this);
129         }
130     }
131 
updateUserSwitcher()132     private void updateUserSwitcher() {
133         boolean keyguardSwitcherAvailable = mKeyguardUserSwitcher != null;
134         mMultiUserSwitch.setClickable(keyguardSwitcherAvailable);
135         mMultiUserSwitch.setFocusable(keyguardSwitcherAvailable);
136         mMultiUserSwitch.setKeyguardMode(keyguardSwitcherAvailable);
137     }
138 
setBatteryController(BatteryController batteryController)139     public void setBatteryController(BatteryController batteryController) {
140         mBatteryController = batteryController;
141         ((BatteryMeterView) findViewById(R.id.battery)).setBatteryController(batteryController);
142     }
143 
setUserInfoController(UserInfoController userInfoController)144     public void setUserInfoController(UserInfoController userInfoController) {
145         userInfoController.addListener(new UserInfoController.OnUserInfoChangedListener() {
146             @Override
147             public void onUserInfoChanged(String name, Drawable picture) {
148                 mMultiUserAvatar.setImageDrawable(picture);
149             }
150         });
151     }
152 
153     @Override
onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging)154     public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
155         String percentage = NumberFormat.getPercentInstance().format((double) level / 100.0);
156         mBatteryLevel.setText(percentage);
157         boolean changed = mBatteryCharging != charging;
158         mBatteryCharging = charging;
159         if (changed) {
160             updateVisibilities();
161         }
162     }
163 
164     @Override
onPowerSaveChanged()165     public void onPowerSaveChanged() {
166         // could not care less
167     }
168 
setKeyguardUserSwitcher(KeyguardUserSwitcher keyguardUserSwitcher)169     public void setKeyguardUserSwitcher(KeyguardUserSwitcher keyguardUserSwitcher) {
170         mKeyguardUserSwitcher = keyguardUserSwitcher;
171         mMultiUserSwitch.setKeyguardUserSwitcher(keyguardUserSwitcher);
172         updateUserSwitcher();
173     }
174 
setKeyguardUserSwitcherShowing(boolean showing, boolean animate)175     public void setKeyguardUserSwitcherShowing(boolean showing, boolean animate) {
176         mKeyguardUserSwitcherShowing = showing;
177         if (animate) {
178             animateNextLayoutChange();
179         }
180         updateVisibilities();
181         updateSystemIconsLayoutParams();
182     }
183 
animateNextLayoutChange()184     private void animateNextLayoutChange() {
185         final int systemIconsCurrentX = mSystemIconsSuperContainer.getLeft();
186         final boolean userSwitcherVisible = mMultiUserSwitch.getParent() == this;
187         getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
188             @Override
189             public boolean onPreDraw() {
190                 getViewTreeObserver().removeOnPreDrawListener(this);
191                 boolean userSwitcherHiding = userSwitcherVisible
192                         && mMultiUserSwitch.getParent() != KeyguardStatusBarView.this;
193                 mSystemIconsSuperContainer.setX(systemIconsCurrentX);
194                 mSystemIconsSuperContainer.animate()
195                         .translationX(0)
196                         .setDuration(400)
197                         .setStartDelay(userSwitcherHiding ? 300 : 0)
198                         .setInterpolator(mFastOutSlowInInterpolator)
199                         .start();
200                 if (userSwitcherHiding) {
201                     getOverlay().add(mMultiUserSwitch);
202                     mMultiUserSwitch.animate()
203                             .alpha(0f)
204                             .setDuration(300)
205                             .setStartDelay(0)
206                             .setInterpolator(PhoneStatusBar.ALPHA_OUT)
207                             .withEndAction(new Runnable() {
208                                 @Override
209                                 public void run() {
210                                     mMultiUserSwitch.setAlpha(1f);
211                                     getOverlay().remove(mMultiUserSwitch);
212                                 }
213                             })
214                             .start();
215 
216                 } else {
217                     mMultiUserSwitch.setAlpha(0f);
218                     mMultiUserSwitch.animate()
219                             .alpha(1f)
220                             .setDuration(300)
221                             .setStartDelay(200)
222                             .setInterpolator(PhoneStatusBar.ALPHA_IN);
223                 }
224                 return true;
225             }
226         });
227 
228     }
229 
230     @Override
setVisibility(int visibility)231     public void setVisibility(int visibility) {
232         super.setVisibility(visibility);
233         if (visibility != View.VISIBLE) {
234             mSystemIconsSuperContainer.animate().cancel();
235             mMultiUserSwitch.animate().cancel();
236             mMultiUserSwitch.setAlpha(1f);
237         }
238     }
239 
240     @Override
hasOverlappingRendering()241     public boolean hasOverlappingRendering() {
242         return false;
243     }
244 }
245