Home | History | Annotate | Download | only in statusbar
      1 /*
      2  * Copyright (C) 2018 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;
     18 
     19 import static com.android.systemui.plugins.DarkIconDispatcher.getTint;
     20 import static com.android.systemui.plugins.DarkIconDispatcher.isInArea;
     21 import static com.android.systemui.statusbar.StatusBarIconView.STATE_DOT;
     22 import static com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN;
     23 import static com.android.systemui.statusbar.StatusBarIconView.STATE_ICON;
     24 
     25 import android.content.Context;
     26 import android.content.res.ColorStateList;
     27 import android.graphics.Rect;
     28 import android.util.AttributeSet;
     29 import android.view.Gravity;
     30 import android.view.LayoutInflater;
     31 import android.view.View;
     32 import android.widget.FrameLayout;
     33 import android.widget.ImageView;
     34 import android.widget.LinearLayout;
     35 
     36 import com.android.systemui.R;
     37 import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
     38 import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.WifiIconState;
     39 
     40 /**
     41  * Start small: StatusBarWifiView will be able to layout from a WifiIconState
     42  */
     43 public class StatusBarWifiView extends FrameLayout implements DarkReceiver,
     44         StatusIconDisplayable {
     45     private static final String TAG = "StatusBarWifiView";
     46 
     47     /// Used to show etc dots
     48     private StatusBarIconView mDotView;
     49     /// Contains the main icon layout
     50     private LinearLayout mWifiGroup;
     51     private ImageView mWifiIcon;
     52     private ImageView mIn;
     53     private ImageView mOut;
     54     private View mInoutContainer;
     55     private View mSignalSpacer;
     56     private View mAirplaneSpacer;
     57     private WifiIconState mState;
     58     private String mSlot;
     59     private int mVisibleState = -1;
     60 
     61     public static StatusBarWifiView fromContext(Context context, String slot) {
     62         LayoutInflater inflater = LayoutInflater.from(context);
     63         StatusBarWifiView v = (StatusBarWifiView) inflater.inflate(R.layout.status_bar_wifi_group, null);
     64         v.setSlot(slot);
     65         v.init();
     66         v.setVisibleState(STATE_ICON);
     67         return v;
     68     }
     69 
     70     public StatusBarWifiView(Context context) {
     71         super(context);
     72     }
     73 
     74     public StatusBarWifiView(Context context, AttributeSet attrs) {
     75         super(context, attrs);
     76     }
     77 
     78     public StatusBarWifiView(Context context, AttributeSet attrs, int defStyleAttr) {
     79         super(context, attrs, defStyleAttr);
     80     }
     81 
     82     public StatusBarWifiView(Context context, AttributeSet attrs, int defStyleAttr,
     83             int defStyleRes) {
     84         super(context, attrs, defStyleAttr, defStyleRes);
     85     }
     86 
     87     public void setSlot(String slot) {
     88         mSlot = slot;
     89     }
     90 
     91     @Override
     92     public void setStaticDrawableColor(int color) {
     93         ColorStateList list = ColorStateList.valueOf(color);
     94         mWifiIcon.setImageTintList(list);
     95         mIn.setImageTintList(list);
     96         mOut.setImageTintList(list);
     97         mDotView.setDecorColor(color);
     98     }
     99 
    100     @Override
    101     public void setDecorColor(int color) {
    102         mDotView.setDecorColor(color);
    103     }
    104 
    105     @Override
    106     public String getSlot() {
    107         return mSlot;
    108     }
    109 
    110     @Override
    111     public boolean isIconVisible() {
    112         return mState != null && mState.visible;
    113     }
    114 
    115     @Override
    116     public void setVisibleState(int state, boolean animate) {
    117         if (state == mVisibleState) {
    118             return;
    119         }
    120         mVisibleState = state;
    121 
    122         switch (state) {
    123             case STATE_ICON:
    124                 mWifiGroup.setVisibility(View.VISIBLE);
    125                 mDotView.setVisibility(View.GONE);
    126                 break;
    127             case STATE_DOT:
    128                 mWifiGroup.setVisibility(View.GONE);
    129                 mDotView.setVisibility(View.VISIBLE);
    130                 break;
    131             case STATE_HIDDEN:
    132             default:
    133                 mWifiGroup.setVisibility(View.GONE);
    134                 mDotView.setVisibility(View.GONE);
    135                 break;
    136         }
    137     }
    138 
    139     @Override
    140     public int getVisibleState() {
    141         return mVisibleState;
    142     }
    143 
    144     @Override
    145     public void getDrawingRect(Rect outRect) {
    146         super.getDrawingRect(outRect);
    147         float translationX = getTranslationX();
    148         float translationY = getTranslationY();
    149         outRect.left += translationX;
    150         outRect.right += translationX;
    151         outRect.top += translationY;
    152         outRect.bottom += translationY;
    153     }
    154 
    155     private void init() {
    156         mWifiGroup = findViewById(R.id.wifi_group);
    157         mWifiIcon = findViewById(R.id.wifi_signal);
    158         mIn = findViewById(R.id.wifi_in);
    159         mOut = findViewById(R.id.wifi_out);
    160         mSignalSpacer = findViewById(R.id.wifi_signal_spacer);
    161         mAirplaneSpacer = findViewById(R.id.wifi_airplane_spacer);
    162         mInoutContainer = findViewById(R.id.inout_container);
    163 
    164         initDotView();
    165     }
    166 
    167     private void initDotView() {
    168         mDotView = new StatusBarIconView(mContext, mSlot, null);
    169         mDotView.setVisibleState(STATE_DOT);
    170 
    171         int width = mContext.getResources().getDimensionPixelSize(R.dimen.status_bar_icon_size);
    172         LayoutParams lp = new LayoutParams(width, width);
    173         lp.gravity = Gravity.CENTER_VERTICAL | Gravity.START;
    174         addView(mDotView, lp);
    175     }
    176 
    177     public void applyWifiState(WifiIconState state) {
    178         boolean requestLayout = false;
    179 
    180         if (state == null) {
    181             requestLayout = getVisibility() != View.GONE;
    182             setVisibility(View.GONE);
    183             mState = null;
    184         } else if (mState == null) {
    185             requestLayout = true;
    186             mState = state.copy();
    187             initViewState();
    188         } else if (!mState.equals(state)) {
    189             requestLayout = updateState(state.copy());
    190         }
    191 
    192         if (requestLayout) {
    193             requestLayout();
    194         }
    195     }
    196 
    197     private boolean updateState(WifiIconState state) {
    198         setContentDescription(state.contentDescription);
    199         if (mState.resId != state.resId && state.resId >= 0) {
    200             mWifiIcon.setImageDrawable(mContext.getDrawable(state.resId));
    201         }
    202 
    203         mIn.setVisibility(state.activityIn ? View.VISIBLE : View.GONE);
    204         mOut.setVisibility(state.activityOut ? View.VISIBLE : View.GONE);
    205         mInoutContainer.setVisibility(
    206                 (state.activityIn || state.activityOut) ? View.VISIBLE : View.GONE);
    207         mAirplaneSpacer.setVisibility(state.airplaneSpacerVisible ? View.VISIBLE : View.GONE);
    208         mSignalSpacer.setVisibility(state.signalSpacerVisible ? View.VISIBLE : View.GONE);
    209 
    210         boolean needsLayout = state.activityIn != mState.activityIn
    211                 ||state.activityOut != mState.activityOut;
    212 
    213         if (mState.visible != state.visible) {
    214             needsLayout |= true;
    215             setVisibility(state.visible ? View.VISIBLE : View.GONE);
    216         }
    217 
    218         mState = state;
    219         return needsLayout;
    220     }
    221 
    222     private void initViewState() {
    223         setContentDescription(mState.contentDescription);
    224         if (mState.resId >= 0) {
    225             mWifiIcon.setImageDrawable(mContext.getDrawable(mState.resId));
    226         }
    227 
    228         mIn.setVisibility(mState.activityIn ? View.VISIBLE : View.GONE);
    229         mOut.setVisibility(mState.activityOut ? View.VISIBLE : View.GONE);
    230         mInoutContainer.setVisibility(
    231                 (mState.activityIn || mState.activityOut) ? View.VISIBLE : View.GONE);
    232         mAirplaneSpacer.setVisibility(mState.airplaneSpacerVisible ? View.VISIBLE : View.GONE);
    233         mSignalSpacer.setVisibility(mState.signalSpacerVisible ? View.VISIBLE : View.GONE);
    234         setVisibility(mState.visible ? View.VISIBLE : View.GONE);
    235     }
    236 
    237     @Override
    238     public void onDarkChanged(Rect area, float darkIntensity, int tint) {
    239         if (!isInArea(area, this)) {
    240             return;
    241         }
    242 
    243         mWifiIcon.setImageTintList(ColorStateList.valueOf(getTint(area, this, tint)));
    244         mIn.setImageTintList(ColorStateList.valueOf(getTint(area, this, tint)));
    245         mOut.setImageTintList(ColorStateList.valueOf(getTint(area, this, tint)));
    246         mDotView.setDecorColor(tint);
    247         mDotView.setIconColor(tint, false);
    248     }
    249 
    250 
    251     @Override
    252     public String toString() {
    253         return "StatusBarWifiView(slot=" + mSlot + " state=" + mState + ")";
    254     }
    255 }
    256