blob: f7c3c670ac4dfc8ae57bb1cbcc0f99d4805efcee [file] [log] [blame]
Christian Robertson2e347422011-08-11 14:01:04 -07001/*
2 * Copyright (C) 2011 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
17package com.android.systemui.statusbar;
18
19import android.content.Context;
Jorim Jaggidd0107a2015-01-21 22:23:48 +010020import android.content.res.ColorStateList;
21import android.graphics.Color;
22import android.graphics.PorterDuff;
Andrew Flynna478d702015-04-14 23:33:45 -040023import android.graphics.drawable.Animatable;
24import android.graphics.drawable.Drawable;
Jason Monkb5746272014-11-12 16:50:31 -050025import android.telephony.SubscriptionInfo;
Jason Monk5e745172015-06-02 19:14:44 -040026import android.util.ArraySet;
Christian Robertson2e347422011-08-11 14:01:04 -070027import android.util.AttributeSet;
John Spurlockcd686b52013-06-05 10:13:46 -040028import android.util.Log;
Jason Monkb5746272014-11-12 16:50:31 -050029import android.view.LayoutInflater;
Christian Robertson2e347422011-08-11 14:01:04 -070030import android.view.View;
31import android.view.ViewGroup;
John Spurlock2f7dfa72012-05-16 20:20:59 -040032import android.view.accessibility.AccessibilityEvent;
Christian Robertson2e347422011-08-11 14:01:04 -070033import android.widget.ImageView;
34import android.widget.LinearLayout;
Christian Robertson2e347422011-08-11 14:01:04 -070035
Christian Robertson2e347422011-08-11 14:01:04 -070036import com.android.systemui.R;
Jason Monk3b230072015-05-29 11:11:29 -040037import com.android.systemui.statusbar.phone.StatusBarIconController;
Jason Monk07b75fe2015-05-14 16:47:03 -040038import com.android.systemui.statusbar.policy.NetworkController.IconState;
John Spurlockaf8d6c42014-05-07 17:49:08 -040039import com.android.systemui.statusbar.policy.NetworkControllerImpl;
Jason Monk3128f122014-09-03 13:18:57 -040040import com.android.systemui.statusbar.policy.SecurityController;
Jason Monk5e745172015-06-02 19:14:44 -040041import com.android.systemui.tuner.TunerService;
42import com.android.systemui.tuner.TunerService.Tunable;
Christian Robertson2e347422011-08-11 14:01:04 -070043
Jason Monkb5746272014-11-12 16:50:31 -050044import java.util.ArrayList;
45import java.util.List;
46
Daniel Sandler5ccff812011-09-13 15:17:58 -040047// Intimately tied to the design of res/layout/signal_cluster_view.xml
Christian Robertson2e347422011-08-11 14:01:04 -070048public class SignalClusterView
John Spurlock2f7dfa72012-05-16 20:20:59 -040049 extends LinearLayout
Jason Monk07b75fe2015-05-14 16:47:03 -040050 implements NetworkControllerImpl.SignalCallback,
Jason Monk5e745172015-06-02 19:14:44 -040051 SecurityController.SecurityControllerCallback, Tunable {
Christian Robertson2e347422011-08-11 14:01:04 -070052
Daniel Sandler28f89d42011-08-15 14:04:15 -040053 static final String TAG = "SignalClusterView";
John Spurlockb3eb8912014-07-30 11:03:03 -040054 static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
John Spurlock2f7dfa72012-05-16 20:20:59 -040055
Jason Monk3b230072015-05-29 11:11:29 -040056 private static final String SLOT_AIRPLANE = "airplane";
57 private static final String SLOT_MOBILE = "mobile";
58 private static final String SLOT_WIFI = "wifi";
59 private static final String SLOT_ETHERNET = "ethernet";
60
John Spurlockaf8d6c42014-05-07 17:49:08 -040061 NetworkControllerImpl mNC;
Jason Monk3128f122014-09-03 13:18:57 -040062 SecurityController mSC;
Christian Robertson2e347422011-08-11 14:01:04 -070063
Jason Monkb5746272014-11-12 16:50:31 -050064 private boolean mNoSimsVisible = false;
Jason Monk3128f122014-09-03 13:18:57 -040065 private boolean mVpnVisible = false;
Lorenzo Colittid46bb582015-04-27 20:32:01 +090066 private boolean mEthernetVisible = false;
67 private int mEthernetIconId = 0;
Jorim Jaggi06302c22015-05-20 17:05:23 -070068 private int mLastEthernetIconId = -1;
Daniel Sandler28f89d42011-08-15 14:04:15 -040069 private boolean mWifiVisible = false;
John Spurlockfcc901c2013-09-04 10:36:27 -040070 private int mWifiStrengthId = 0;
Jorim Jaggi06302c22015-05-20 17:05:23 -070071 private int mLastWifiStrengthId = -1;
Daniel Sandler5ccff812011-09-13 15:17:58 -040072 private boolean mIsAirplaneMode = false;
Andrew Flynn061d43c2012-05-04 10:57:58 -070073 private int mAirplaneIconId = 0;
Jorim Jaggi06302c22015-05-20 17:05:23 -070074 private int mLastAirplaneIconId = -1;
Jason Monk07b75fe2015-05-14 16:47:03 -040075 private String mAirplaneContentDescription;
Jason Monkb5746272014-11-12 16:50:31 -050076 private String mWifiDescription;
Lorenzo Colittid46bb582015-04-27 20:32:01 +090077 private String mEthernetDescription;
Jason Monkb5746272014-11-12 16:50:31 -050078 private ArrayList<PhoneState> mPhoneStates = new ArrayList<PhoneState>();
Jorim Jaggidd0107a2015-01-21 22:23:48 +010079 private int mIconTint = Color.WHITE;
Jorim Jaggi5443cc52015-03-20 14:39:24 -070080 private float mDarkIntensity;
Daniel Sandler28f89d42011-08-15 14:04:15 -040081
Lorenzo Colittid46bb582015-04-27 20:32:01 +090082 ViewGroup mEthernetGroup, mWifiGroup;
Adrian Roos1b5eb972015-06-11 18:22:52 -070083 View mNoSimsCombo;
Lorenzo Colittid46bb582015-04-27 20:32:01 +090084 ImageView mVpn, mEthernet, mWifi, mAirplane, mNoSims, mEthernetDark, mWifiDark, mNoSimsDark;
Jorim Jaggi5172dc22014-09-02 14:59:06 +020085 View mWifiAirplaneSpacer;
Jorim Jaggic737b9b2014-09-08 23:57:20 +020086 View mWifiSignalSpacer;
Jason Monkb5746272014-11-12 16:50:31 -050087 LinearLayout mMobileSignalGroup;
Jorim Jaggic737b9b2014-09-08 23:57:20 +020088
89 private int mWideTypeIconStartPadding;
Jason Monkb5746272014-11-12 16:50:31 -050090 private int mSecondaryTelephonyPadding;
Jorim Jaggi6d035f12014-10-17 18:43:43 +020091 private int mEndPadding;
92 private int mEndPaddingNothingVisible;
Christian Robertson2e347422011-08-11 14:01:04 -070093
Jason Monk3b230072015-05-29 11:11:29 -040094 private boolean mBlockAirplane;
95 private boolean mBlockMobile;
96 private boolean mBlockWifi;
97 private boolean mBlockEthernet;
98
Christian Robertson2e347422011-08-11 14:01:04 -070099 public SignalClusterView(Context context) {
100 this(context, null);
101 }
102
103 public SignalClusterView(Context context, AttributeSet attrs) {
104 this(context, attrs, 0);
105 }
106
107 public SignalClusterView(Context context, AttributeSet attrs, int defStyle) {
108 super(context, attrs, defStyle);
Jason Monk3b230072015-05-29 11:11:29 -0400109 }
110
Jason Monk5e745172015-06-02 19:14:44 -0400111 @Override
112 public void onTuningChanged(String key, String newValue) {
113 if (!StatusBarIconController.ICON_BLACKLIST.equals(key)) {
114 return;
115 }
116 ArraySet<String> blockList = StatusBarIconController.getIconBlacklist(newValue);
Jason Monkf3d17152015-06-15 15:02:56 -0400117 boolean blockAirplane = blockList.contains(SLOT_AIRPLANE);
118 boolean blockMobile = blockList.contains(SLOT_MOBILE);
119 boolean blockWifi = blockList.contains(SLOT_WIFI);
120 boolean blockEthernet = blockList.contains(SLOT_ETHERNET);
Jason Monk5e745172015-06-02 19:14:44 -0400121
Jason Monkf3d17152015-06-15 15:02:56 -0400122 if (blockAirplane != mBlockAirplane || blockMobile != mBlockMobile
123 || blockEthernet != mBlockEthernet || blockWifi != mBlockWifi) {
124 mBlockAirplane = blockAirplane;
125 mBlockMobile = blockMobile;
126 mBlockEthernet = blockEthernet;
127 mBlockWifi = blockWifi;
128 // Re-register to get new callbacks.
129 mNC.removeSignalCallback(this);
130 mNC.addSignalCallback(this);
131 }
Christian Robertson2e347422011-08-11 14:01:04 -0700132 }
133
John Spurlockaf8d6c42014-05-07 17:49:08 -0400134 public void setNetworkController(NetworkControllerImpl nc) {
John Spurlockcd686b52013-06-05 10:13:46 -0400135 if (DEBUG) Log.d(TAG, "NetworkController=" + nc);
Christian Robertson2e347422011-08-11 14:01:04 -0700136 mNC = nc;
137 }
138
Jason Monk3128f122014-09-03 13:18:57 -0400139 public void setSecurityController(SecurityController sc) {
140 if (DEBUG) Log.d(TAG, "SecurityController=" + sc);
141 mSC = sc;
142 mSC.addCallback(this);
143 mVpnVisible = mSC.isVpnEnabled();
144 }
145
Christian Robertson2e347422011-08-11 14:01:04 -0700146 @Override
Jorim Jaggic737b9b2014-09-08 23:57:20 +0200147 protected void onFinishInflate() {
148 super.onFinishInflate();
149 mWideTypeIconStartPadding = getContext().getResources().getDimensionPixelSize(
150 R.dimen.wide_type_icon_start_padding);
Jason Monkb5746272014-11-12 16:50:31 -0500151 mSecondaryTelephonyPadding = getContext().getResources().getDimensionPixelSize(
152 R.dimen.secondary_telephony_padding);
Jorim Jaggi6d035f12014-10-17 18:43:43 +0200153 mEndPadding = getContext().getResources().getDimensionPixelSize(
154 R.dimen.signal_cluster_battery_padding);
155 mEndPaddingNothingVisible = getContext().getResources().getDimensionPixelSize(
156 R.dimen.no_signal_cluster_battery_padding);
Jorim Jaggic737b9b2014-09-08 23:57:20 +0200157 }
158
159 @Override
Christian Robertson2e347422011-08-11 14:01:04 -0700160 protected void onAttachedToWindow() {
161 super.onAttachedToWindow();
162
Jason Monk3128f122014-09-03 13:18:57 -0400163 mVpn = (ImageView) findViewById(R.id.vpn);
Lorenzo Colittid46bb582015-04-27 20:32:01 +0900164 mEthernetGroup = (ViewGroup) findViewById(R.id.ethernet_combo);
165 mEthernet = (ImageView) findViewById(R.id.ethernet);
166 mEthernetDark = (ImageView) findViewById(R.id.ethernet_dark);
Christian Robertson2e347422011-08-11 14:01:04 -0700167 mWifiGroup = (ViewGroup) findViewById(R.id.wifi_combo);
168 mWifi = (ImageView) findViewById(R.id.wifi_signal);
Jorim Jaggi5443cc52015-03-20 14:39:24 -0700169 mWifiDark = (ImageView) findViewById(R.id.wifi_signal_dark);
Andrew Flynn061d43c2012-05-04 10:57:58 -0700170 mAirplane = (ImageView) findViewById(R.id.airplane);
Jason Monkb5746272014-11-12 16:50:31 -0500171 mNoSims = (ImageView) findViewById(R.id.no_sims);
Jorim Jaggi5443cc52015-03-20 14:39:24 -0700172 mNoSimsDark = (ImageView) findViewById(R.id.no_sims_dark);
Adrian Roos1b5eb972015-06-11 18:22:52 -0700173 mNoSimsCombo = findViewById(R.id.no_sims_combo);
Jorim Jaggi5172dc22014-09-02 14:59:06 +0200174 mWifiAirplaneSpacer = findViewById(R.id.wifi_airplane_spacer);
Jorim Jaggic737b9b2014-09-08 23:57:20 +0200175 mWifiSignalSpacer = findViewById(R.id.wifi_signal_spacer);
Jason Monkb5746272014-11-12 16:50:31 -0500176 mMobileSignalGroup = (LinearLayout) findViewById(R.id.mobile_signal_group);
177 for (PhoneState state : mPhoneStates) {
178 mMobileSignalGroup.addView(state.mMobileGroup);
179 }
Jason Monk5e745172015-06-02 19:14:44 -0400180 TunerService.get(mContext).addTunable(this, StatusBarIconController.ICON_BLACKLIST);
Daniel Sandler28f89d42011-08-15 14:04:15 -0400181
182 apply();
Jorim Jaggidd0107a2015-01-21 22:23:48 +0100183 applyIconTint();
Christian Robertson2e347422011-08-11 14:01:04 -0700184 }
185
186 @Override
187 protected void onDetachedFromWindow() {
Jason Monk3128f122014-09-03 13:18:57 -0400188 mVpn = null;
Lorenzo Colittid46bb582015-04-27 20:32:01 +0900189 mEthernetGroup = null;
190 mEthernet = null;
Daniel Sandler28f89d42011-08-15 14:04:15 -0400191 mWifiGroup = null;
192 mWifi = null;
Andrew Flynn061d43c2012-05-04 10:57:58 -0700193 mAirplane = null;
Jason Monkb5746272014-11-12 16:50:31 -0500194 mMobileSignalGroup.removeAllViews();
195 mMobileSignalGroup = null;
Jason Monk5e745172015-06-02 19:14:44 -0400196 TunerService.get(mContext).removeTunable(this);
Daniel Sandler28f89d42011-08-15 14:04:15 -0400197
Christian Robertson2e347422011-08-11 14:01:04 -0700198 super.onDetachedFromWindow();
199 }
200
Jason Monk3128f122014-09-03 13:18:57 -0400201 // From SecurityController.
202 @Override
203 public void onStateChanged() {
204 post(new Runnable() {
205 @Override
206 public void run() {
207 mVpnVisible = mSC.isVpnEnabled();
208 apply();
209 }
210 });
211 }
212
Andrew Flynn061d43c2012-05-04 10:57:58 -0700213 @Override
Jason Monk07b75fe2015-05-14 16:47:03 -0400214 public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
215 boolean activityIn, boolean activityOut, String description) {
Jason Monk3b230072015-05-29 11:11:29 -0400216 mWifiVisible = statusIcon.visible && !mBlockWifi;
Jason Monk07b75fe2015-05-14 16:47:03 -0400217 mWifiStrengthId = statusIcon.icon;
218 mWifiDescription = statusIcon.contentDescription;
Christian Robertson2e347422011-08-11 14:01:04 -0700219
Daniel Sandler28f89d42011-08-15 14:04:15 -0400220 apply();
Christian Robertson2e347422011-08-11 14:01:04 -0700221 }
222
Andrew Flynn061d43c2012-05-04 10:57:58 -0700223 @Override
Andrew Flynn2fdbe122015-06-01 16:34:21 -0400224 public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
225 int qsType, boolean activityIn, boolean activityOut, String typeContentDescription,
226 String description, boolean isWide, int subId) {
Jason Monk8fcab352015-06-29 10:57:00 -0400227 PhoneState state = getState(subId);
228 if (state == null) {
229 return;
230 }
Jason Monk3b230072015-05-29 11:11:29 -0400231 state.mMobileVisible = statusIcon.visible && !mBlockMobile;
Jason Monk07b75fe2015-05-14 16:47:03 -0400232 state.mMobileStrengthId = statusIcon.icon;
Jason Monk07b75fe2015-05-14 16:47:03 -0400233 state.mMobileTypeId = statusType;
234 state.mMobileDescription = statusIcon.contentDescription;
Jason Monkb5746272014-11-12 16:50:31 -0500235 state.mMobileTypeDescription = typeContentDescription;
Jason Monk07b75fe2015-05-14 16:47:03 -0400236 state.mIsMobileTypeIconWide = statusType != 0 && isWide;
Christian Robertson2e347422011-08-11 14:01:04 -0700237
Daniel Sandler28f89d42011-08-15 14:04:15 -0400238 apply();
239 }
240
Andrew Flynn061d43c2012-05-04 10:57:58 -0700241 @Override
Jason Monk07b75fe2015-05-14 16:47:03 -0400242 public void setEthernetIndicators(IconState state) {
Jason Monk3b230072015-05-29 11:11:29 -0400243 mEthernetVisible = state.visible && !mBlockEthernet;
Jason Monk07b75fe2015-05-14 16:47:03 -0400244 mEthernetIconId = state.icon;
245 mEthernetDescription = state.contentDescription;
Lorenzo Colittid46bb582015-04-27 20:32:01 +0900246
247 apply();
248 }
249
250 @Override
Jason Monkb5746272014-11-12 16:50:31 -0500251 public void setNoSims(boolean show) {
Jason Monk3b230072015-05-29 11:11:29 -0400252 mNoSimsVisible = show && !mBlockMobile;
Jason Monkb5746272014-11-12 16:50:31 -0500253 }
254
255 @Override
256 public void setSubs(List<SubscriptionInfo> subs) {
Jason Monkf535cf02015-06-17 12:52:43 -0400257 if (hasCorrectSubs(subs)) {
258 return;
259 }
Jason Monkb5746272014-11-12 16:50:31 -0500260 // Clear out all old subIds.
261 mPhoneStates.clear();
262 if (mMobileSignalGroup != null) {
263 mMobileSignalGroup.removeAllViews();
264 }
265 final int n = subs.size();
266 for (int i = 0; i < n; i++) {
267 inflatePhoneState(subs.get(i).getSubscriptionId());
268 }
Jorim Jaggidd0107a2015-01-21 22:23:48 +0100269 if (isAttachedToWindow()) {
270 applyIconTint();
271 }
Jason Monkb5746272014-11-12 16:50:31 -0500272 }
273
Jason Monkf535cf02015-06-17 12:52:43 -0400274 private boolean hasCorrectSubs(List<SubscriptionInfo> subs) {
275 final int N = subs.size();
276 if (N != mPhoneStates.size()) {
277 return false;
278 }
279 for (int i = 0; i < N; i++) {
280 if (mPhoneStates.get(i).mSubId != subs.get(i).getSubscriptionId()) {
281 return false;
282 }
283 }
284 return true;
285 }
286
Jason Monk8fcab352015-06-29 10:57:00 -0400287 private PhoneState getState(int subId) {
Jason Monkb5746272014-11-12 16:50:31 -0500288 for (PhoneState state : mPhoneStates) {
289 if (state.mSubId == subId) {
290 return state;
291 }
292 }
Jason Monk8fcab352015-06-29 10:57:00 -0400293 Log.e(TAG, "Unexpected subscription " + subId);
294 return null;
Jason Monkb5746272014-11-12 16:50:31 -0500295 }
296
297 private PhoneState inflatePhoneState(int subId) {
298 PhoneState state = new PhoneState(subId, mContext);
299 if (mMobileSignalGroup != null) {
300 mMobileSignalGroup.addView(state.mMobileGroup);
301 }
302 mPhoneStates.add(state);
303 return state;
304 }
305
306 @Override
Jason Monk07b75fe2015-05-14 16:47:03 -0400307 public void setIsAirplaneMode(IconState icon) {
Jason Monk3b230072015-05-29 11:11:29 -0400308 mIsAirplaneMode = icon.visible && !mBlockAirplane;
Jason Monk07b75fe2015-05-14 16:47:03 -0400309 mAirplaneIconId = icon.icon;
310 mAirplaneContentDescription = icon.contentDescription;
Andrew Flynn061d43c2012-05-04 10:57:58 -0700311
312 apply();
Daniel Sandler5ccff812011-09-13 15:17:58 -0400313 }
314
John Spurlock2f7dfa72012-05-16 20:20:59 -0400315 @Override
Jason Monk07b75fe2015-05-14 16:47:03 -0400316 public void setMobileDataEnabled(boolean enabled) {
317 // Don't care.
318 }
319
320 @Override
Alan Viverettea54956a2015-01-07 16:05:02 -0800321 public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
John Spurlock2f7dfa72012-05-16 20:20:59 -0400322 // Standard group layout onPopulateAccessibilityEvent() implementations
323 // ignore content description, so populate manually
Lorenzo Colittid46bb582015-04-27 20:32:01 +0900324 if (mEthernetVisible && mEthernetGroup != null &&
325 mEthernetGroup.getContentDescription() != null)
326 event.getText().add(mEthernetGroup.getContentDescription());
Daniel Sandler24e028e2013-08-13 20:18:01 -0700327 if (mWifiVisible && mWifiGroup != null && mWifiGroup.getContentDescription() != null)
John Spurlock2f7dfa72012-05-16 20:20:59 -0400328 event.getText().add(mWifiGroup.getContentDescription());
Jason Monkb5746272014-11-12 16:50:31 -0500329 for (PhoneState state : mPhoneStates) {
330 state.populateAccessibilityEvent(event);
331 }
Alan Viverettea54956a2015-01-07 16:05:02 -0800332 return super.dispatchPopulateAccessibilityEventInternal(event);
John Spurlock2f7dfa72012-05-16 20:20:59 -0400333 }
334
Fabrice Di Meglio46626112013-05-07 11:32:51 -0700335 @Override
336 public void onRtlPropertiesChanged(int layoutDirection) {
337 super.onRtlPropertiesChanged(layoutDirection);
338
Lorenzo Colittid46bb582015-04-27 20:32:01 +0900339 if (mEthernet != null) {
340 mEthernet.setImageDrawable(null);
Jorim Jaggi06302c22015-05-20 17:05:23 -0700341 mEthernetDark.setImageDrawable(null);
342 mLastEthernetIconId = -1;
Lorenzo Colittid46bb582015-04-27 20:32:01 +0900343 }
344
Fabrice Di Meglio46626112013-05-07 11:32:51 -0700345 if (mWifi != null) {
346 mWifi.setImageDrawable(null);
Jorim Jaggi06302c22015-05-20 17:05:23 -0700347 mWifiDark.setImageDrawable(null);
348 mLastWifiStrengthId = -1;
Fabrice Di Meglio46626112013-05-07 11:32:51 -0700349 }
Fabrice Di Meglio46626112013-05-07 11:32:51 -0700350
Jason Monkb5746272014-11-12 16:50:31 -0500351 for (PhoneState state : mPhoneStates) {
352 if (state.mMobile != null) {
353 state.mMobile.setImageDrawable(null);
354 }
355 if (state.mMobileType != null) {
356 state.mMobileType.setImageDrawable(null);
357 }
Fabrice Di Meglio46626112013-05-07 11:32:51 -0700358 }
359
Jorim Jaggi06302c22015-05-20 17:05:23 -0700360 if (mAirplane != null) {
Fabrice Di Meglio46626112013-05-07 11:32:51 -0700361 mAirplane.setImageDrawable(null);
Jorim Jaggi06302c22015-05-20 17:05:23 -0700362 mLastAirplaneIconId = -1;
Fabrice Di Meglio46626112013-05-07 11:32:51 -0700363 }
364
365 apply();
366 }
367
Jorim Jaggi0d266892014-07-28 14:49:13 +0200368 @Override
369 public boolean hasOverlappingRendering() {
370 return false;
371 }
372
Daniel Sandler28f89d42011-08-15 14:04:15 -0400373 // Run after each indicator change.
374 private void apply() {
375 if (mWifiGroup == null) return;
376
Jason Monk3128f122014-09-03 13:18:57 -0400377 mVpn.setVisibility(mVpnVisible ? View.VISIBLE : View.GONE);
378 if (DEBUG) Log.d(TAG, String.format("vpn: %s", mVpnVisible ? "VISIBLE" : "GONE"));
Lorenzo Colittid46bb582015-04-27 20:32:01 +0900379
380 if (mEthernetVisible) {
Jorim Jaggi06302c22015-05-20 17:05:23 -0700381 if (mLastEthernetIconId != mEthernetIconId) {
382 mEthernet.setImageResource(mEthernetIconId);
383 mEthernetDark.setImageResource(mEthernetIconId);
384 mLastEthernetIconId = mEthernetIconId;
385 }
Lorenzo Colittid46bb582015-04-27 20:32:01 +0900386 mEthernetGroup.setContentDescription(mEthernetDescription);
387 mEthernetGroup.setVisibility(View.VISIBLE);
388 } else {
389 mEthernetGroup.setVisibility(View.GONE);
390 }
391
392 if (DEBUG) Log.d(TAG,
393 String.format("ethernet: %s",
394 (mEthernetVisible ? "VISIBLE" : "GONE")));
395
396
Daniel Sandler28f89d42011-08-15 14:04:15 -0400397 if (mWifiVisible) {
Jorim Jaggi06302c22015-05-20 17:05:23 -0700398 if (mWifiStrengthId != mLastWifiStrengthId) {
399 mWifi.setImageResource(mWifiStrengthId);
400 mWifiDark.setImageResource(mWifiStrengthId);
401 mLastWifiStrengthId = mWifiStrengthId;
402 }
Daniel Sandlerbcf6ef0b2011-09-30 11:43:36 -0400403 mWifiGroup.setContentDescription(mWifiDescription);
Fabrice Di Megliocda096e2012-12-26 17:11:13 -0800404 mWifiGroup.setVisibility(View.VISIBLE);
Daniel Sandler28f89d42011-08-15 14:04:15 -0400405 } else {
406 mWifiGroup.setVisibility(View.GONE);
407 }
408
John Spurlockcd686b52013-06-05 10:13:46 -0400409 if (DEBUG) Log.d(TAG,
John Spurlockfcc901c2013-09-04 10:36:27 -0400410 String.format("wifi: %s sig=%d",
Daniel Sandler28f89d42011-08-15 14:04:15 -0400411 (mWifiVisible ? "VISIBLE" : "GONE"),
John Spurlockfcc901c2013-09-04 10:36:27 -0400412 mWifiStrengthId));
Daniel Sandler28f89d42011-08-15 14:04:15 -0400413
Jason Monkb5746272014-11-12 16:50:31 -0500414 boolean anyMobileVisible = false;
Dan Sandlere912c9c2014-12-08 15:00:09 -0500415 int firstMobileTypeId = 0;
Jason Monkb5746272014-11-12 16:50:31 -0500416 for (PhoneState state : mPhoneStates) {
417 if (state.apply(anyMobileVisible)) {
Dan Sandlere912c9c2014-12-08 15:00:09 -0500418 if (!anyMobileVisible) {
419 firstMobileTypeId = state.mMobileTypeId;
420 anyMobileVisible = true;
421 }
Jason Monkb5746272014-11-12 16:50:31 -0500422 }
Christian Robertson2e347422011-08-11 14:01:04 -0700423 }
Daniel Sandler28f89d42011-08-15 14:04:15 -0400424
Andrew Flynn061d43c2012-05-04 10:57:58 -0700425 if (mIsAirplaneMode) {
Jorim Jaggi06302c22015-05-20 17:05:23 -0700426 if (mLastAirplaneIconId != mAirplaneIconId) {
427 mAirplane.setImageResource(mAirplaneIconId);
428 mLastAirplaneIconId = mAirplaneIconId;
429 }
Jason Monk07b75fe2015-05-14 16:47:03 -0400430 mAirplane.setContentDescription(mAirplaneContentDescription);
Fabrice Di Meglio8afcd142012-07-27 18:27:11 -0700431 mAirplane.setVisibility(View.VISIBLE);
Andrew Flynn061d43c2012-05-04 10:57:58 -0700432 } else {
433 mAirplane.setVisibility(View.GONE);
434 }
435
Jorim Jaggi5172dc22014-09-02 14:59:06 +0200436 if (mIsAirplaneMode && mWifiVisible) {
437 mWifiAirplaneSpacer.setVisibility(View.VISIBLE);
Daniel Sandler5ccff812011-09-13 15:17:58 -0400438 } else {
Jorim Jaggi5172dc22014-09-02 14:59:06 +0200439 mWifiAirplaneSpacer.setVisibility(View.GONE);
Daniel Sandler5ccff812011-09-13 15:17:58 -0400440 }
441
Dan Sandlere912c9c2014-12-08 15:00:09 -0500442 if (((anyMobileVisible && firstMobileTypeId != 0) || mNoSimsVisible) && mWifiVisible) {
Jorim Jaggic737b9b2014-09-08 23:57:20 +0200443 mWifiSignalSpacer.setVisibility(View.VISIBLE);
444 } else {
445 mWifiSignalSpacer.setVisibility(View.GONE);
446 }
447
Adrian Roos1b5eb972015-06-11 18:22:52 -0700448 mNoSimsCombo.setVisibility(mNoSimsVisible ? View.VISIBLE : View.GONE);
Jorim Jaggic737b9b2014-09-08 23:57:20 +0200449
Jason Monkb5746272014-11-12 16:50:31 -0500450 boolean anythingVisible = mNoSimsVisible || mWifiVisible || mIsAirplaneMode
Lorenzo Colittid46bb582015-04-27 20:32:01 +0900451 || anyMobileVisible || mVpnVisible || mEthernetVisible;
Jorim Jaggi6d035f12014-10-17 18:43:43 +0200452 setPaddingRelative(0, 0, anythingVisible ? mEndPadding : mEndPaddingNothingVisible, 0);
Christian Robertson2e347422011-08-11 14:01:04 -0700453 }
Jason Monkb5746272014-11-12 16:50:31 -0500454
Jorim Jaggi5443cc52015-03-20 14:39:24 -0700455 public void setIconTint(int tint, float darkIntensity) {
456 boolean changed = tint != mIconTint || darkIntensity != mDarkIntensity;
Jorim Jaggidd0107a2015-01-21 22:23:48 +0100457 mIconTint = tint;
Jorim Jaggi5443cc52015-03-20 14:39:24 -0700458 mDarkIntensity = darkIntensity;
Jorim Jaggidd0107a2015-01-21 22:23:48 +0100459 if (changed && isAttachedToWindow()) {
460 applyIconTint();
461 }
462 }
463
464 private void applyIconTint() {
465 setTint(mVpn, mIconTint);
Jorim Jaggidd0107a2015-01-21 22:23:48 +0100466 setTint(mAirplane, mIconTint);
Jorim Jaggi5443cc52015-03-20 14:39:24 -0700467 applyDarkIntensity(mDarkIntensity, mNoSims, mNoSimsDark);
468 applyDarkIntensity(mDarkIntensity, mWifi, mWifiDark);
Lorenzo Colittid46bb582015-04-27 20:32:01 +0900469 applyDarkIntensity(mDarkIntensity, mEthernet, mEthernetDark);
Jorim Jaggidd0107a2015-01-21 22:23:48 +0100470 for (int i = 0; i < mPhoneStates.size(); i++) {
Jorim Jaggi5443cc52015-03-20 14:39:24 -0700471 mPhoneStates.get(i).setIconTint(mIconTint, mDarkIntensity);
Jorim Jaggidd0107a2015-01-21 22:23:48 +0100472 }
473 }
474
Jorim Jaggi5443cc52015-03-20 14:39:24 -0700475 private void applyDarkIntensity(float darkIntensity, View lightIcon, View darkIcon) {
476 lightIcon.setAlpha(1 - darkIntensity);
477 darkIcon.setAlpha(darkIntensity);
478 }
479
Jorim Jaggidd0107a2015-01-21 22:23:48 +0100480 private void setTint(ImageView v, int tint) {
Jorim Jaggidd0107a2015-01-21 22:23:48 +0100481 v.setImageTintList(ColorStateList.valueOf(tint));
482 }
483
Jason Monkb5746272014-11-12 16:50:31 -0500484 private class PhoneState {
485 private final int mSubId;
486 private boolean mMobileVisible = false;
Andrew Flynn2fdbe122015-06-01 16:34:21 -0400487 private int mMobileStrengthId = 0, mMobileTypeId = 0;
Jason Monkb5746272014-11-12 16:50:31 -0500488 private boolean mIsMobileTypeIconWide;
489 private String mMobileDescription, mMobileTypeDescription;
490
491 private ViewGroup mMobileGroup;
Jorim Jaggi5443cc52015-03-20 14:39:24 -0700492 private ImageView mMobile, mMobileDark, mMobileType;
Jason Monkb5746272014-11-12 16:50:31 -0500493
494 public PhoneState(int subId, Context context) {
495 ViewGroup root = (ViewGroup) LayoutInflater.from(context)
496 .inflate(R.layout.mobile_signal_group, null);
497 setViews(root);
498 mSubId = subId;
499 }
500
501 public void setViews(ViewGroup root) {
502 mMobileGroup = root;
503 mMobile = (ImageView) root.findViewById(R.id.mobile_signal);
Jorim Jaggi5443cc52015-03-20 14:39:24 -0700504 mMobileDark = (ImageView) root.findViewById(R.id.mobile_signal_dark);
Jason Monkb5746272014-11-12 16:50:31 -0500505 mMobileType = (ImageView) root.findViewById(R.id.mobile_type);
506 }
507
508 public boolean apply(boolean isSecondaryIcon) {
509 if (mMobileVisible && !mIsAirplaneMode) {
510 mMobile.setImageResource(mMobileStrengthId);
Andrew Flynna478d702015-04-14 23:33:45 -0400511 Drawable mobileDrawable = mMobile.getDrawable();
512 if (mobileDrawable instanceof Animatable) {
513 Animatable ad = (Animatable) mobileDrawable;
514 if (!ad.isRunning()) {
515 ad.start();
516 }
517 }
518
Jorim Jaggi5443cc52015-03-20 14:39:24 -0700519 mMobileDark.setImageResource(mMobileStrengthId);
Andrew Flynna478d702015-04-14 23:33:45 -0400520 Drawable mobileDarkDrawable = mMobileDark.getDrawable();
521 if (mobileDarkDrawable instanceof Animatable) {
522 Animatable ad = (Animatable) mobileDarkDrawable;
523 if (!ad.isRunning()) {
524 ad.start();
525 }
526 }
527
Jason Monkb5746272014-11-12 16:50:31 -0500528 mMobileType.setImageResource(mMobileTypeId);
529 mMobileGroup.setContentDescription(mMobileTypeDescription
530 + " " + mMobileDescription);
531 mMobileGroup.setVisibility(View.VISIBLE);
532 } else {
533 mMobileGroup.setVisibility(View.GONE);
534 }
535
536 // When this isn't next to wifi, give it some extra padding between the signals.
537 mMobileGroup.setPaddingRelative(isSecondaryIcon ? mSecondaryTelephonyPadding : 0,
538 0, 0, 0);
539 mMobile.setPaddingRelative(mIsMobileTypeIconWide ? mWideTypeIconStartPadding : 0,
540 0, 0, 0);
Jorim Jaggi5443cc52015-03-20 14:39:24 -0700541 mMobileDark.setPaddingRelative(mIsMobileTypeIconWide ? mWideTypeIconStartPadding : 0,
542 0, 0, 0);
Jason Monkb5746272014-11-12 16:50:31 -0500543
Andrew Flynn2fdbe122015-06-01 16:34:21 -0400544 if (DEBUG) Log.d(TAG, String.format("mobile: %s sig=%d typ=%d",
545 (mMobileVisible ? "VISIBLE" : "GONE"), mMobileStrengthId, mMobileTypeId));
Jason Monkb5746272014-11-12 16:50:31 -0500546
547 mMobileType.setVisibility(mMobileTypeId != 0 ? View.VISIBLE : View.GONE);
548
549 return mMobileVisible;
550 }
551
552 public void populateAccessibilityEvent(AccessibilityEvent event) {
553 if (mMobileVisible && mMobileGroup != null
554 && mMobileGroup.getContentDescription() != null) {
555 event.getText().add(mMobileGroup.getContentDescription());
556 }
557 }
Jorim Jaggidd0107a2015-01-21 22:23:48 +0100558
Jorim Jaggi5443cc52015-03-20 14:39:24 -0700559 public void setIconTint(int tint, float darkIntensity) {
560 applyDarkIntensity(darkIntensity, mMobile, mMobileDark);
Jorim Jaggidd0107a2015-01-21 22:23:48 +0100561 setTint(mMobileType, tint);
562 }
Jason Monkb5746272014-11-12 16:50:31 -0500563 }
Christian Robertson2e347422011-08-11 14:01:04 -0700564}
565