Home | History | Annotate | Download | only in phone
      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 
     63     public KeyguardStatusBarView(Context context, AttributeSet attrs) {
     64         super(context, attrs);
     65     }
     66 
     67     @Override
     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
     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 
     93     private void loadDimens() {
     94         mSystemIconsSwitcherHiddenExpandedMargin = getResources().getDimensionPixelSize(
     95                 R.dimen.system_icons_switcher_hidden_expanded_margin);
     96     }
     97 
     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 
    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 
    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 
    132     private void updateUserSwitcher() {
    133         boolean keyguardSwitcherAvailable = mKeyguardUserSwitcher != null;
    134         mMultiUserSwitch.setClickable(keyguardSwitcherAvailable);
    135         mMultiUserSwitch.setFocusable(keyguardSwitcherAvailable);
    136         mMultiUserSwitch.setKeyguardMode(keyguardSwitcherAvailable);
    137     }
    138 
    139     public void setBatteryController(BatteryController batteryController) {
    140         mBatteryController = batteryController;
    141         ((BatteryMeterView) findViewById(R.id.battery)).setBatteryController(batteryController);
    142     }
    143 
    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
    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
    165     public void onPowerSaveChanged() {
    166         // could not care less
    167     }
    168 
    169     public void setKeyguardUserSwitcher(KeyguardUserSwitcher keyguardUserSwitcher) {
    170         mKeyguardUserSwitcher = keyguardUserSwitcher;
    171         mMultiUserSwitch.setKeyguardUserSwitcher(keyguardUserSwitcher);
    172         updateUserSwitcher();
    173     }
    174 
    175     public void setKeyguardUserSwitcherShowing(boolean showing, boolean animate) {
    176         mKeyguardUserSwitcherShowing = showing;
    177         if (animate) {
    178             animateNextLayoutChange();
    179         }
    180         updateVisibilities();
    181         updateSystemIconsLayoutParams();
    182     }
    183 
    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
    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
    241     public boolean hasOverlappingRendering() {
    242         return false;
    243     }
    244 }
    245