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