blob: ea7235dd88f63d74ac7eb378e6f9a39e5d5c2d38 [file] [log] [blame]
Joe Onoratofd52b182010-11-10 18:00:52 -08001/*
2 * Copyright (C) 2010 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.policy;
18
Joe Onorato933464d2011-01-05 15:53:36 -080019import java.io.FileDescriptor;
20import java.io.PrintWriter;
Joe Onoratofd52b182010-11-10 18:00:52 -080021import java.util.ArrayList;
22import java.util.List;
23
24import android.content.BroadcastReceiver;
25import android.content.Context;
26import android.content.Intent;
27import android.content.IntentFilter;
Joe Onorato933464d2011-01-05 15:53:36 -080028import android.content.res.Resources;
Joe Onoratofd52b182010-11-10 18:00:52 -080029import android.net.ConnectivityManager;
30import android.net.NetworkInfo;
Joe Onoratofd52b182010-11-10 18:00:52 -080031import android.net.wifi.WifiConfiguration;
32import android.net.wifi.WifiInfo;
33import android.net.wifi.WifiManager;
tk.mun148c7d02011-10-13 22:51:57 +090034import android.net.wimax.WimaxManagerConstants;
Joe Onoratofd52b182010-11-10 18:00:52 -080035import android.os.Binder;
Irfan Sheriff227bec42011-02-15 19:30:27 -080036import android.os.Handler;
Irfan Sheriff227bec42011-02-15 19:30:27 -080037import android.os.Message;
38import android.os.Messenger;
Joe Onoratofd52b182010-11-10 18:00:52 -080039import android.os.RemoteException;
Daniel Sandler9a7c7122011-02-25 12:28:57 -050040import android.os.SystemProperties;
Joe Onoratofd52b182010-11-10 18:00:52 -080041import android.provider.Settings;
Joe Onorato355ebc02010-12-01 17:37:00 -080042import android.provider.Telephony;
Joe Onoratofd52b182010-11-10 18:00:52 -080043import android.telephony.PhoneStateListener;
44import android.telephony.ServiceState;
45import android.telephony.SignalStrength;
46import android.telephony.TelephonyManager;
47import android.util.Slog;
Joe Onoratoddbba422010-11-23 15:42:28 -080048import android.view.View;
Joe Onoratofd52b182010-11-10 18:00:52 -080049import android.widget.ImageView;
50import android.widget.TextView;
51
52import com.android.internal.app.IBatteryStats;
53import com.android.internal.telephony.IccCard;
Wink Savillea639b312012-07-10 12:37:54 -070054import com.android.internal.telephony.IccCardConstants;
Joe Onoratofd52b182010-11-10 18:00:52 -080055import com.android.internal.telephony.TelephonyIntents;
56import com.android.internal.telephony.cdma.EriInfo;
57import com.android.server.am.BatteryStatsService;
Irfan Sheriff227bec42011-02-15 19:30:27 -080058import com.android.internal.util.AsyncChannel;
Joe Onoratofd52b182010-11-10 18:00:52 -080059
60import com.android.systemui.R;
61
62public class NetworkController extends BroadcastReceiver {
63 // debug
64 static final String TAG = "StatusBar.NetworkController";
65 static final boolean DEBUG = false;
Daniel Sandler7c351742011-10-17 10:48:06 -040066 static final boolean CHATTY = false; // additional diagnostics, but not logspew
Joe Onoratofd52b182010-11-10 18:00:52 -080067
68 // telephony
69 boolean mHspaDataDistinguishable;
70 final TelephonyManager mPhone;
71 boolean mDataConnected;
Wink Savillea639b312012-07-10 12:37:54 -070072 IccCardConstants.State mSimState = IccCardConstants.State.READY;
Joe Onoratofd52b182010-11-10 18:00:52 -080073 int mPhoneState = TelephonyManager.CALL_STATE_IDLE;
Joe Onorato933464d2011-01-05 15:53:36 -080074 int mDataNetType = TelephonyManager.NETWORK_TYPE_UNKNOWN;
Joe Onoratofd52b182010-11-10 18:00:52 -080075 int mDataState = TelephonyManager.DATA_DISCONNECTED;
76 int mDataActivity = TelephonyManager.DATA_ACTIVITY_NONE;
77 ServiceState mServiceState;
78 SignalStrength mSignalStrength;
79 int[] mDataIconList = TelephonyIcons.DATA_G[0];
Joe Onorato355ebc02010-12-01 17:37:00 -080080 String mNetworkName;
81 String mNetworkNameDefault;
82 String mNetworkNameSeparator;
Joe Onoratoddbba422010-11-23 15:42:28 -080083 int mPhoneSignalIconId;
Daniel Sandler28f89d42011-08-15 14:04:15 -040084 int mDataDirectionIconId; // data + data direction on phones
Joe Onoratoddbba422010-11-23 15:42:28 -080085 int mDataSignalIconId;
86 int mDataTypeIconId;
Andrew Flynn061d43c2012-05-04 10:57:58 -070087 int mAirplaneIconId;
Joe Onoratoc198bb12011-01-31 20:28:59 -080088 boolean mDataActive;
Daniel Sandler28f89d42011-08-15 14:04:15 -040089 int mMobileActivityIconId; // overlay arrows for data direction
Daniel Sandlerc49e1952011-09-20 10:45:53 -040090 int mLastSignalLevel;
Daniel Sandler9b5ae0c2011-08-25 17:29:26 -070091 boolean mShowPhoneRSSIForData = false;
92 boolean mShowAtLeastThreeGees = false;
John Wangd55cde12012-02-13 17:16:41 -080093 boolean mAlwaysShowCdmaRssi = false;
Jaikumar Ganeshfde7f0e2011-01-10 10:05:58 -080094
Svetoslav Ganov6179ea32011-06-28 01:12:41 -070095 String mContentDescriptionPhoneSignal;
96 String mContentDescriptionWifi;
tk.mun148c7d02011-10-13 22:51:57 +090097 String mContentDescriptionWimax;
Svetoslav Ganov6179ea32011-06-28 01:12:41 -070098 String mContentDescriptionCombinedSignal;
99 String mContentDescriptionDataType;
100
Joe Onoratofd52b182010-11-10 18:00:52 -0800101 // wifi
102 final WifiManager mWifiManager;
Irfan Sheriff227bec42011-02-15 19:30:27 -0800103 AsyncChannel mWifiChannel;
Joe Onoratofd52b182010-11-10 18:00:52 -0800104 boolean mWifiEnabled, mWifiConnected;
Daniel Sandler0d6ff0102011-10-19 21:02:37 -0400105 int mWifiRssi, mWifiLevel;
Joe Onoratofd52b182010-11-10 18:00:52 -0800106 String mWifiSsid;
Daniel Sandler9a7c7122011-02-25 12:28:57 -0500107 int mWifiIconId = 0;
Daniel Sandler28f89d42011-08-15 14:04:15 -0400108 int mWifiActivityIconId = 0; // overlay arrows for wifi direction
Joe Onoratof32621a2011-03-10 15:29:49 -0800109 int mWifiActivity = WifiManager.DATA_ACTIVITY_NONE;
Joe Onoratofd52b182010-11-10 18:00:52 -0800110
Jaikumar Ganeshfde7f0e2011-01-10 10:05:58 -0800111 // bluetooth
112 private boolean mBluetoothTethered = false;
113 private int mBluetoothTetherIconId =
114 com.android.internal.R.drawable.stat_sys_tether_bluetooth;
115
tk.mun148c7d02011-10-13 22:51:57 +0900116 //wimax
Daniel Sandler0fee2172011-11-10 00:15:38 -0500117 private boolean mWimaxSupported = false;
tk.mun148c7d02011-10-13 22:51:57 +0900118 private boolean mIsWimaxEnabled = false;
119 private boolean mWimaxConnected = false;
120 private boolean mWimaxIdle = false;
121 private int mWimaxIconId = 0;
122 private int mWimaxSignal = 0;
123 private int mWimaxState = 0;
124 private int mWimaxExtraState = 0;
Daniel Sandler67234c42012-06-15 13:17:39 -0400125
Joe Onoratofd52b182010-11-10 18:00:52 -0800126 // data connectivity (regardless of state, can we access the internet?)
127 // state of inet connection - 0 not connected, 100 connected
Daniel Sandler67234c42012-06-15 13:17:39 -0400128 private boolean mConnected = false;
129 private int mConnectedNetworkType = ConnectivityManager.TYPE_NONE;
130 private String mConnectedNetworkTypeName;
Joe Onoratofd52b182010-11-10 18:00:52 -0800131 private int mInetCondition = 0;
132 private static final int INET_CONDITION_THRESHOLD = 50;
133
Mike Corriganbd151122011-02-24 15:24:47 -0600134 private boolean mAirplaneMode = false;
Andrew Flynn0fa9d2d2012-05-31 15:39:15 -0700135 private boolean mLastAirplaneMode = true;
Mike Corriganbd151122011-02-24 15:24:47 -0600136
Joe Onoratofd52b182010-11-10 18:00:52 -0800137 // our ui
138 Context mContext;
Joe Onoratoddbba422010-11-23 15:42:28 -0800139 ArrayList<ImageView> mPhoneSignalIconViews = new ArrayList<ImageView>();
140 ArrayList<ImageView> mDataDirectionIconViews = new ArrayList<ImageView>();
Joe Onoratofce2bf32011-02-01 17:00:29 -0800141 ArrayList<ImageView> mDataDirectionOverlayIconViews = new ArrayList<ImageView>();
Joe Onoratoddbba422010-11-23 15:42:28 -0800142 ArrayList<ImageView> mWifiIconViews = new ArrayList<ImageView>();
tk.mun148c7d02011-10-13 22:51:57 +0900143 ArrayList<ImageView> mWimaxIconViews = new ArrayList<ImageView>();
Joe Onoratoddbba422010-11-23 15:42:28 -0800144 ArrayList<ImageView> mCombinedSignalIconViews = new ArrayList<ImageView>();
145 ArrayList<ImageView> mDataTypeIconViews = new ArrayList<ImageView>();
Daniel Sandler5962fd52012-01-11 14:57:04 -0500146 ArrayList<TextView> mCombinedLabelViews = new ArrayList<TextView>();
147 ArrayList<TextView> mMobileLabelViews = new ArrayList<TextView>();
148 ArrayList<TextView> mWifiLabelViews = new ArrayList<TextView>();
Daniel Sandlerdd4ef492012-07-27 11:19:52 -0400149 ArrayList<TextView> mEmergencyLabelViews = new ArrayList<TextView>();
Christian Robertson2e347422011-08-11 14:01:04 -0700150 ArrayList<SignalCluster> mSignalClusters = new ArrayList<SignalCluster>();
Winson Chungd63c59782012-09-05 17:34:41 -0700151 ArrayList<NetworkSignalChangedCallback> mSignalsChangedCallbacks =
152 new ArrayList<NetworkSignalChangedCallback>();
Joe Onoratofd52b182010-11-10 18:00:52 -0800153 int mLastPhoneSignalIconId = -1;
Joe Onoratoddbba422010-11-23 15:42:28 -0800154 int mLastDataDirectionIconId = -1;
Joe Onoratofce2bf32011-02-01 17:00:29 -0800155 int mLastDataDirectionOverlayIconId = -1;
Joe Onoratoddbba422010-11-23 15:42:28 -0800156 int mLastWifiIconId = -1;
tk.mun148c7d02011-10-13 22:51:57 +0900157 int mLastWimaxIconId = -1;
Joe Onoratoddbba422010-11-23 15:42:28 -0800158 int mLastCombinedSignalIconId = -1;
159 int mLastDataTypeIconId = -1;
Daniel Sandler5962fd52012-01-11 14:57:04 -0500160 String mLastCombinedLabel = "";
Jaikumar Ganeshfde7f0e2011-01-10 10:05:58 -0800161
Robert Greenwalt9b2886e2011-08-31 11:46:42 -0700162 private boolean mHasMobileDataFeature;
163
Daniel Sandler2b697352011-07-22 16:23:09 -0400164 boolean mDataAndWifiStacked = false;
165
Joe Onoratofd52b182010-11-10 18:00:52 -0800166 // yuck -- stop doing this here and put it in the framework
167 IBatteryStats mBatteryStats;
168
Christian Robertson2e347422011-08-11 14:01:04 -0700169 public interface SignalCluster {
John Wangd55cde12012-02-13 17:16:41 -0800170 void setWifiIndicators(boolean visible, int strengthIcon, int activityIcon,
Daniel Sandlerbcf6ef0b2011-09-30 11:43:36 -0400171 String contentDescription);
Christian Robertson2e347422011-08-11 14:01:04 -0700172 void setMobileDataIndicators(boolean visible, int strengthIcon, int activityIcon,
Daniel Sandlerbcf6ef0b2011-09-30 11:43:36 -0400173 int typeIcon, String contentDescription, String typeContentDescription);
Andrew Flynn061d43c2012-05-04 10:57:58 -0700174 void setIsAirplaneMode(boolean is, int airplaneIcon);
Christian Robertson2e347422011-08-11 14:01:04 -0700175 }
176
Winson Chungd63c59782012-09-05 17:34:41 -0700177 public interface NetworkSignalChangedCallback {
178 void onWifiSignalChanged(boolean enabled, String description);
179 void onMobileDataSignalChanged(boolean enabled, String description);
180 void onAirplaneModeChanged(boolean enabled);
181 }
182
Joe Onoratofd52b182010-11-10 18:00:52 -0800183 /**
184 * Construct this controller object and register for updates.
185 */
186 public NetworkController(Context context) {
187 mContext = context;
Daniel Sandler9b5ae0c2011-08-25 17:29:26 -0700188 final Resources res = context.getResources();
Joe Onoratofd52b182010-11-10 18:00:52 -0800189
Robert Greenwalt9b2886e2011-08-31 11:46:42 -0700190 ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(
191 Context.CONNECTIVITY_SERVICE);
192 mHasMobileDataFeature = cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE);
193
Daniel Sandler9b5ae0c2011-08-25 17:29:26 -0700194 mShowPhoneRSSIForData = res.getBoolean(R.bool.config_showPhoneRSSIForData);
195 mShowAtLeastThreeGees = res.getBoolean(R.bool.config_showMin3G);
John Wangd55cde12012-02-13 17:16:41 -0800196 mAlwaysShowCdmaRssi = res.getBoolean(
197 com.android.internal.R.bool.config_alwaysUseCdmaRssi);
Daniel Sandler9b5ae0c2011-08-25 17:29:26 -0700198
Daniel Sandler9a7c7122011-02-25 12:28:57 -0500199 // set up the default wifi icon, used when no radios have ever appeared
200 updateWifiIcons();
tk.mun148c7d02011-10-13 22:51:57 +0900201 updateWimaxIcons();
Daniel Sandler9a7c7122011-02-25 12:28:57 -0500202
Joe Onoratofd52b182010-11-10 18:00:52 -0800203 // telephony
204 mPhone = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
205 mPhone.listen(mPhoneStateListener,
206 PhoneStateListener.LISTEN_SERVICE_STATE
207 | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
208 | PhoneStateListener.LISTEN_CALL_STATE
209 | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
210 | PhoneStateListener.LISTEN_DATA_ACTIVITY);
211 mHspaDataDistinguishable = mContext.getResources().getBoolean(
212 R.bool.config_hspa_data_distinguishable);
Joe Onorato355ebc02010-12-01 17:37:00 -0800213 mNetworkNameSeparator = mContext.getString(R.string.status_bar_network_name_separator);
214 mNetworkNameDefault = mContext.getString(
215 com.android.internal.R.string.lockscreen_carrier_default);
216 mNetworkName = mNetworkNameDefault;
Joe Onoratofd52b182010-11-10 18:00:52 -0800217
218 // wifi
219 mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
Joe Onoratof32621a2011-03-10 15:29:49 -0800220 Handler handler = new WifiHandler();
Irfan Sheriff227bec42011-02-15 19:30:27 -0800221 mWifiChannel = new AsyncChannel();
Irfan Sheriff07573b32012-01-27 21:00:19 -0800222 Messenger wifiMessenger = mWifiManager.getWifiServiceMessenger();
Irfan Sheriff227bec42011-02-15 19:30:27 -0800223 if (wifiMessenger != null) {
224 mWifiChannel.connect(mContext, handler, wifiMessenger);
225 }
Joe Onoratofd52b182010-11-10 18:00:52 -0800226
227 // broadcasts
228 IntentFilter filter = new IntentFilter();
229 filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
230 filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
Joe Onoratofd52b182010-11-10 18:00:52 -0800231 filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
232 filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
Wink Savillea639b312012-07-10 12:37:54 -0700233 filter.addAction(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION);
Joe Onorato355ebc02010-12-01 17:37:00 -0800234 filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
235 filter.addAction(ConnectivityManager.INET_CONDITION_ACTION);
Joe Onorato99641832011-01-30 12:12:05 -0800236 filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
Mike Corriganbd151122011-02-24 15:24:47 -0600237 filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
Daniel Sandler0fee2172011-11-10 00:15:38 -0500238 mWimaxSupported = mContext.getResources().getBoolean(
tk.mun148c7d02011-10-13 22:51:57 +0900239 com.android.internal.R.bool.config_wimaxEnabled);
Daniel Sandler0fee2172011-11-10 00:15:38 -0500240 if(mWimaxSupported) {
tk.mun148c7d02011-10-13 22:51:57 +0900241 filter.addAction(WimaxManagerConstants.WIMAX_NETWORK_STATE_CHANGED_ACTION);
242 filter.addAction(WimaxManagerConstants.SIGNAL_LEVEL_CHANGED_ACTION);
243 filter.addAction(WimaxManagerConstants.NET_4G_STATE_CHANGED_ACTION);
244 }
Joe Onoratofd52b182010-11-10 18:00:52 -0800245 context.registerReceiver(this, filter);
246
Mike Corriganbd151122011-02-24 15:24:47 -0600247 // AIRPLANE_MODE_CHANGED is sent at boot; we've probably already missed it
248 updateAirplaneMode();
249
Joe Onoratofd52b182010-11-10 18:00:52 -0800250 // yuck
251 mBatteryStats = BatteryStatsService.getService();
252 }
253
Daniel Sandler3d32a242012-06-05 13:44:14 -0400254 public boolean hasMobileDataFeature() {
255 return mHasMobileDataFeature;
256 }
257
Daniel Sandlerdd4ef492012-07-27 11:19:52 -0400258 public boolean isEmergencyOnly() {
259 return (mServiceState != null && mServiceState.isEmergencyOnly());
260 }
261
Joe Onoratoddbba422010-11-23 15:42:28 -0800262 public void addPhoneSignalIconView(ImageView v) {
263 mPhoneSignalIconViews.add(v);
Joe Onoratofd52b182010-11-10 18:00:52 -0800264 }
265
Joe Onoratoddbba422010-11-23 15:42:28 -0800266 public void addDataDirectionIconView(ImageView v) {
267 mDataDirectionIconViews.add(v);
268 }
269
Joe Onoratofce2bf32011-02-01 17:00:29 -0800270 public void addDataDirectionOverlayIconView(ImageView v) {
271 mDataDirectionOverlayIconViews.add(v);
272 }
273
Joe Onoratoddbba422010-11-23 15:42:28 -0800274 public void addWifiIconView(ImageView v) {
275 mWifiIconViews.add(v);
276 }
tk.mun148c7d02011-10-13 22:51:57 +0900277 public void addWimaxIconView(ImageView v) {
278 mWimaxIconViews.add(v);
279 }
Joe Onoratoddbba422010-11-23 15:42:28 -0800280
281 public void addCombinedSignalIconView(ImageView v) {
282 mCombinedSignalIconViews.add(v);
283 }
284
285 public void addDataTypeIconView(ImageView v) {
286 mDataTypeIconViews.add(v);
Joe Onoratofd52b182010-11-10 18:00:52 -0800287 }
288
Daniel Sandler5962fd52012-01-11 14:57:04 -0500289 public void addCombinedLabelView(TextView v) {
290 mCombinedLabelViews.add(v);
291 }
292
293 public void addMobileLabelView(TextView v) {
294 mMobileLabelViews.add(v);
295 }
296
297 public void addWifiLabelView(TextView v) {
298 mWifiLabelViews.add(v);
Joe Onoratofd52b182010-11-10 18:00:52 -0800299 }
300
Daniel Sandlerdd4ef492012-07-27 11:19:52 -0400301 public void addEmergencyLabelView(TextView v) {
302 mEmergencyLabelViews.add(v);
303 }
304
Daniel Sandler28f89d42011-08-15 14:04:15 -0400305 public void addSignalCluster(SignalCluster cluster) {
306 mSignalClusters.add(cluster);
Daniel Sandler0fee2172011-11-10 00:15:38 -0500307 refreshSignalCluster(cluster);
308 }
309
Winson Chungd63c59782012-09-05 17:34:41 -0700310 public void addNetworkSignalChangedCallback(NetworkSignalChangedCallback cb) {
311 mSignalsChangedCallbacks.add(cb);
312 notifySignalsChangedCallbacks(cb);
313 }
314
Daniel Sandler0fee2172011-11-10 00:15:38 -0500315 public void refreshSignalCluster(SignalCluster cluster) {
Daniel Sandler28f89d42011-08-15 14:04:15 -0400316 cluster.setWifiIndicators(
Daniel Sandlerd4b7e922012-05-17 12:52:51 -0400317 // only show wifi in the cluster if connected or if wifi-only
318 mWifiEnabled && (mWifiConnected || !mHasMobileDataFeature),
Daniel Sandler28f89d42011-08-15 14:04:15 -0400319 mWifiIconId,
Daniel Sandlerbcf6ef0b2011-09-30 11:43:36 -0400320 mWifiActivityIconId,
321 mContentDescriptionWifi);
Daniel Sandlerbcf6ef0b2011-09-30 11:43:36 -0400322
Daniel Sandler0fee2172011-11-10 00:15:38 -0500323 if (mIsWimaxEnabled && mWimaxConnected) {
324 // wimax is special
325 cluster.setMobileDataIndicators(
326 true,
John Wangd55cde12012-02-13 17:16:41 -0800327 mAlwaysShowCdmaRssi ? mPhoneSignalIconId : mWimaxIconId,
Daniel Sandler0fee2172011-11-10 00:15:38 -0500328 mMobileActivityIconId,
329 mDataTypeIconId,
330 mContentDescriptionWimax,
331 mContentDescriptionDataType);
332 } else {
333 // normal mobile data
334 cluster.setMobileDataIndicators(
335 mHasMobileDataFeature,
336 mShowPhoneRSSIForData ? mPhoneSignalIconId : mDataSignalIconId,
337 mMobileActivityIconId,
338 mDataTypeIconId,
339 mContentDescriptionPhoneSignal,
340 mContentDescriptionDataType);
341 }
Andrew Flynn061d43c2012-05-04 10:57:58 -0700342 cluster.setIsAirplaneMode(mAirplaneMode, mAirplaneIconId);
Christian Robertson2e347422011-08-11 14:01:04 -0700343 }
344
Winson Chungd63c59782012-09-05 17:34:41 -0700345 void notifySignalsChangedCallbacks(NetworkSignalChangedCallback cb) {
346 // only show wifi in the cluster if connected or if wifi-only
347 boolean wifiEnabled = mWifiEnabled && (mWifiConnected || !mHasMobileDataFeature);
348 String wifiDesc = wifiEnabled ?
349 mWifiSsid : null;
350 cb.onWifiSignalChanged(wifiEnabled, wifiDesc);
351
352 if (isEmergencyOnly()) {
353 cb.onMobileDataSignalChanged(false, null);
354 } else {
355 if (mIsWimaxEnabled && mWimaxConnected) {
356 // wimax is special
357 cb.onMobileDataSignalChanged(true, mNetworkName);
358 } else {
359 // normal mobile data
360 cb.onMobileDataSignalChanged(mHasMobileDataFeature, mNetworkName);
361 }
362 }
363 cb.onAirplaneModeChanged(mAirplaneMode);
364 }
365
Daniel Sandler2b697352011-07-22 16:23:09 -0400366 public void setStackedMode(boolean stacked) {
367 mDataAndWifiStacked = true;
368 }
369
Wink Saville52840902011-02-18 12:40:47 -0800370 @Override
Joe Onoratofd52b182010-11-10 18:00:52 -0800371 public void onReceive(Context context, Intent intent) {
372 final String action = intent.getAction();
373 if (action.equals(WifiManager.RSSI_CHANGED_ACTION)
374 || action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)
Joe Onoratofd52b182010-11-10 18:00:52 -0800375 || action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
376 updateWifiState(intent);
377 refreshViews();
378 } else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
379 updateSimState(intent);
380 updateDataIcon();
381 refreshViews();
Wink Savillea639b312012-07-10 12:37:54 -0700382 } else if (action.equals(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION)) {
383 updateNetworkName(intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_SPN, false),
384 intent.getStringExtra(TelephonyIntents.EXTRA_SPN),
385 intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_PLMN, false),
386 intent.getStringExtra(TelephonyIntents.EXTRA_PLMN));
Joe Onorato355ebc02010-12-01 17:37:00 -0800387 refreshViews();
Joe Onoratofd52b182010-11-10 18:00:52 -0800388 } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION) ||
389 action.equals(ConnectivityManager.INET_CONDITION_ACTION)) {
390 updateConnectivity(intent);
391 refreshViews();
Joe Onorato99641832011-01-30 12:12:05 -0800392 } else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
393 refreshViews();
Mike Corriganbd151122011-02-24 15:24:47 -0600394 } else if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {
395 updateAirplaneMode();
396 refreshViews();
tk.mun148c7d02011-10-13 22:51:57 +0900397 } else if (action.equals(WimaxManagerConstants.NET_4G_STATE_CHANGED_ACTION) ||
398 action.equals(WimaxManagerConstants.SIGNAL_LEVEL_CHANGED_ACTION) ||
399 action.equals(WimaxManagerConstants.WIMAX_NETWORK_STATE_CHANGED_ACTION)) {
Daniel Sandler0fee2172011-11-10 00:15:38 -0500400 updateWimaxState(intent);
tk.mun148c7d02011-10-13 22:51:57 +0900401 refreshViews();
Joe Onoratofd52b182010-11-10 18:00:52 -0800402 }
403 }
404
405
406 // ===== Telephony ==============================================================
407
408 PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
409 @Override
410 public void onSignalStrengthsChanged(SignalStrength signalStrength) {
Daniel Sandlerda49dac2011-09-20 15:36:50 -0400411 if (DEBUG) {
John Wangd55cde12012-02-13 17:16:41 -0800412 Slog.d(TAG, "onSignalStrengthsChanged signalStrength=" + signalStrength +
Daniel Sandlerc49e1952011-09-20 10:45:53 -0400413 ((signalStrength == null) ? "" : (" level=" + signalStrength.getLevel())));
Joe Onoratofd52b182010-11-10 18:00:52 -0800414 }
415 mSignalStrength = signalStrength;
416 updateTelephonySignalStrength();
417 refreshViews();
418 }
419
420 @Override
421 public void onServiceStateChanged(ServiceState state) {
422 if (DEBUG) {
423 Slog.d(TAG, "onServiceStateChanged state=" + state.getState());
424 }
425 mServiceState = state;
426 updateTelephonySignalStrength();
Daniel Sandler89d97132011-09-08 15:31:57 -0400427 updateDataNetType();
Joe Onoratofd52b182010-11-10 18:00:52 -0800428 updateDataIcon();
429 refreshViews();
430 }
431
432 @Override
433 public void onCallStateChanged(int state, String incomingNumber) {
434 if (DEBUG) {
435 Slog.d(TAG, "onCallStateChanged state=" + state);
436 }
437 // In cdma, if a voice call is made, RSSI should switch to 1x.
438 if (isCdma()) {
439 updateTelephonySignalStrength();
440 refreshViews();
441 }
442 }
443
444 @Override
445 public void onDataConnectionStateChanged(int state, int networkType) {
Daniel Sandlerc49e1952011-09-20 10:45:53 -0400446 if (DEBUG) {
Jaikumar Ganeshfde7f0e2011-01-10 10:05:58 -0800447 Slog.d(TAG, "onDataConnectionStateChanged: state=" + state
Joe Onoratofd52b182010-11-10 18:00:52 -0800448 + " type=" + networkType);
449 }
450 mDataState = state;
Joe Onorato933464d2011-01-05 15:53:36 -0800451 mDataNetType = networkType;
452 updateDataNetType();
Joe Onoratofd52b182010-11-10 18:00:52 -0800453 updateDataIcon();
454 refreshViews();
455 }
456
457 @Override
458 public void onDataActivity(int direction) {
459 if (DEBUG) {
460 Slog.d(TAG, "onDataActivity: direction=" + direction);
461 }
462 mDataActivity = direction;
463 updateDataIcon();
464 refreshViews();
465 }
466 };
467
468 private final void updateSimState(Intent intent) {
Wink Savillea639b312012-07-10 12:37:54 -0700469 String stateExtra = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
470 if (IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)) {
471 mSimState = IccCardConstants.State.ABSENT;
Joe Onoratofd52b182010-11-10 18:00:52 -0800472 }
Wink Savillea639b312012-07-10 12:37:54 -0700473 else if (IccCardConstants.INTENT_VALUE_ICC_READY.equals(stateExtra)) {
474 mSimState = IccCardConstants.State.READY;
Joe Onoratofd52b182010-11-10 18:00:52 -0800475 }
Wink Savillea639b312012-07-10 12:37:54 -0700476 else if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals(stateExtra)) {
477 final String lockedReason =
478 intent.getStringExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON);
479 if (IccCardConstants.INTENT_VALUE_LOCKED_ON_PIN.equals(lockedReason)) {
480 mSimState = IccCardConstants.State.PIN_REQUIRED;
Joe Onoratofd52b182010-11-10 18:00:52 -0800481 }
Wink Savillea639b312012-07-10 12:37:54 -0700482 else if (IccCardConstants.INTENT_VALUE_LOCKED_ON_PUK.equals(lockedReason)) {
483 mSimState = IccCardConstants.State.PUK_REQUIRED;
Joe Onoratofd52b182010-11-10 18:00:52 -0800484 }
485 else {
Wink Savillea639b312012-07-10 12:37:54 -0700486 mSimState = IccCardConstants.State.NETWORK_LOCKED;
Joe Onoratofd52b182010-11-10 18:00:52 -0800487 }
488 } else {
Wink Savillea639b312012-07-10 12:37:54 -0700489 mSimState = IccCardConstants.State.UNKNOWN;
Joe Onoratofd52b182010-11-10 18:00:52 -0800490 }
491 }
492
493 private boolean isCdma() {
494 return (mSignalStrength != null) && !mSignalStrength.isGsm();
495 }
496
Joe Onoratofd52b182010-11-10 18:00:52 -0800497 private boolean hasService() {
498 if (mServiceState != null) {
499 switch (mServiceState.getState()) {
500 case ServiceState.STATE_OUT_OF_SERVICE:
501 case ServiceState.STATE_POWER_OFF:
502 return false;
503 default:
504 return true;
505 }
506 } else {
507 return false;
508 }
509 }
510
Mike Corriganbd151122011-02-24 15:24:47 -0600511 private void updateAirplaneMode() {
Christopher Tatec09cdce2012-09-10 16:50:14 -0700512 mAirplaneMode = (Settings.Global.getInt(mContext.getContentResolver(),
513 Settings.Global.AIRPLANE_MODE_ON, 0) == 1);
Mike Corriganbd151122011-02-24 15:24:47 -0600514 }
515
Joe Onoratofd52b182010-11-10 18:00:52 -0800516 private final void updateTelephonySignalStrength() {
Mike Corriganbd151122011-02-24 15:24:47 -0600517 if (!hasService()) {
Daniel Sandlerc49e1952011-09-20 10:45:53 -0400518 if (CHATTY) Slog.d(TAG, "updateTelephonySignalStrength: !hasService()");
Daniel Sandlere3b86f22012-01-18 15:49:49 -0500519 mPhoneSignalIconId = R.drawable.stat_sys_signal_null;
520 mDataSignalIconId = R.drawable.stat_sys_signal_null;
Joe Onoratofd52b182010-11-10 18:00:52 -0800521 } else {
Joe Onorato801ade02010-11-15 15:33:39 -0800522 if (mSignalStrength == null) {
Daniel Sandlerc49e1952011-09-20 10:45:53 -0400523 if (CHATTY) Slog.d(TAG, "updateTelephonySignalStrength: mSignalStrength == null");
Daniel Sandlere3b86f22012-01-18 15:49:49 -0500524 mPhoneSignalIconId = R.drawable.stat_sys_signal_null;
525 mDataSignalIconId = R.drawable.stat_sys_signal_null;
Svetoslav Ganov6179ea32011-06-28 01:12:41 -0700526 mContentDescriptionPhoneSignal = mContext.getString(
527 AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0]);
Joe Onoratofd52b182010-11-10 18:00:52 -0800528 } else {
Joe Onoratofd52b182010-11-10 18:00:52 -0800529 int iconLevel;
Joe Onoratofd52b182010-11-10 18:00:52 -0800530 int[] iconList;
John Wangd55cde12012-02-13 17:16:41 -0800531 if (isCdma() && mAlwaysShowCdmaRssi) {
532 mLastSignalLevel = iconLevel = mSignalStrength.getCdmaLevel();
533 if(DEBUG) Slog.d(TAG, "mAlwaysShowCdmaRssi=" + mAlwaysShowCdmaRssi
534 + " set to cdmaLevel=" + mSignalStrength.getCdmaLevel()
535 + " instead of level=" + mSignalStrength.getLevel());
536 } else {
537 mLastSignalLevel = iconLevel = mSignalStrength.getLevel();
538 }
539
Wink Saville52840902011-02-18 12:40:47 -0800540 if (isCdma()) {
541 if (isCdmaEri()) {
542 iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[mInetCondition];
543 } else {
544 iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[mInetCondition];
545 }
Joe Onoratofd52b182010-11-10 18:00:52 -0800546 } else {
Wink Saville52840902011-02-18 12:40:47 -0800547 // Though mPhone is a Manager, this call is not an IPC
548 if (mPhone.isNetworkRoaming()) {
549 iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[mInetCondition];
550 } else {
551 iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[mInetCondition];
552 }
Joe Onoratofd52b182010-11-10 18:00:52 -0800553 }
554 mPhoneSignalIconId = iconList[iconLevel];
Svetoslav Ganov6179ea32011-06-28 01:12:41 -0700555 mContentDescriptionPhoneSignal = mContext.getString(
556 AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[iconLevel]);
Joe Onoratoddbba422010-11-23 15:42:28 -0800557 mDataSignalIconId = TelephonyIcons.DATA_SIGNAL_STRENGTH[mInetCondition][iconLevel];
Joe Onoratofd52b182010-11-10 18:00:52 -0800558 }
559 }
560 }
561
Joe Onorato933464d2011-01-05 15:53:36 -0800562 private final void updateDataNetType() {
Daniel Sandler0fee2172011-11-10 00:15:38 -0500563 if (mIsWimaxEnabled && mWimaxConnected) {
564 // wimax is a special 4g network not handled by telephony
565 mDataIconList = TelephonyIcons.DATA_4G[mInetCondition];
566 mDataTypeIconId = R.drawable.stat_sys_data_connected_4g;
567 mContentDescriptionDataType = mContext.getString(
568 R.string.accessibility_data_connection_4g);
569 } else {
570 switch (mDataNetType) {
571 case TelephonyManager.NETWORK_TYPE_UNKNOWN:
572 if (!mShowAtLeastThreeGees) {
573 mDataIconList = TelephonyIcons.DATA_G[mInetCondition];
574 mDataTypeIconId = 0;
575 mContentDescriptionDataType = mContext.getString(
576 R.string.accessibility_data_connection_gprs);
577 break;
578 } else {
579 // fall through
580 }
581 case TelephonyManager.NETWORK_TYPE_EDGE:
582 if (!mShowAtLeastThreeGees) {
583 mDataIconList = TelephonyIcons.DATA_E[mInetCondition];
584 mDataTypeIconId = R.drawable.stat_sys_data_connected_e;
585 mContentDescriptionDataType = mContext.getString(
586 R.string.accessibility_data_connection_edge);
587 break;
588 } else {
589 // fall through
590 }
591 case TelephonyManager.NETWORK_TYPE_UMTS:
Joe Onoratofd52b182010-11-10 18:00:52 -0800592 mDataIconList = TelephonyIcons.DATA_3G[mInetCondition];
Christian Robertson2e347422011-08-11 14:01:04 -0700593 mDataTypeIconId = R.drawable.stat_sys_data_connected_3g;
Svetoslav Ganov6179ea32011-06-28 01:12:41 -0700594 mContentDescriptionDataType = mContext.getString(
595 R.string.accessibility_data_connection_3g);
Daniel Sandler0fee2172011-11-10 00:15:38 -0500596 break;
597 case TelephonyManager.NETWORK_TYPE_HSDPA:
598 case TelephonyManager.NETWORK_TYPE_HSUPA:
599 case TelephonyManager.NETWORK_TYPE_HSPA:
600 case TelephonyManager.NETWORK_TYPE_HSPAP:
601 if (mHspaDataDistinguishable) {
602 mDataIconList = TelephonyIcons.DATA_H[mInetCondition];
603 mDataTypeIconId = R.drawable.stat_sys_data_connected_h;
604 mContentDescriptionDataType = mContext.getString(
605 R.string.accessibility_data_connection_3_5g);
606 } else {
607 mDataIconList = TelephonyIcons.DATA_3G[mInetCondition];
608 mDataTypeIconId = R.drawable.stat_sys_data_connected_3g;
609 mContentDescriptionDataType = mContext.getString(
610 R.string.accessibility_data_connection_3g);
611 }
612 break;
613 case TelephonyManager.NETWORK_TYPE_CDMA:
Madan Ankapura68cad3a2012-08-02 19:10:22 -0700614 if (!mShowAtLeastThreeGees) {
615 // display 1xRTT for IS95A/B
616 mDataIconList = TelephonyIcons.DATA_1X[mInetCondition];
617 mDataTypeIconId = R.drawable.stat_sys_data_connected_1x;
618 mContentDescriptionDataType = mContext.getString(
619 R.string.accessibility_data_connection_cdma);
620 break;
621 } else {
622 // fall through
623 }
Daniel Sandler0fee2172011-11-10 00:15:38 -0500624 case TelephonyManager.NETWORK_TYPE_1xRTT:
Madan Ankapura68cad3a2012-08-02 19:10:22 -0700625 if (!mShowAtLeastThreeGees) {
626 mDataIconList = TelephonyIcons.DATA_1X[mInetCondition];
627 mDataTypeIconId = R.drawable.stat_sys_data_connected_1x;
628 mContentDescriptionDataType = mContext.getString(
629 R.string.accessibility_data_connection_cdma);
630 break;
631 } else {
632 // fall through
633 }
Daniel Sandler0fee2172011-11-10 00:15:38 -0500634 case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through
635 case TelephonyManager.NETWORK_TYPE_EVDO_A:
636 case TelephonyManager.NETWORK_TYPE_EVDO_B:
637 case TelephonyManager.NETWORK_TYPE_EHRPD:
Daniel Sandler9b5ae0c2011-08-25 17:29:26 -0700638 mDataIconList = TelephonyIcons.DATA_3G[mInetCondition];
639 mDataTypeIconId = R.drawable.stat_sys_data_connected_3g;
640 mContentDescriptionDataType = mContext.getString(
641 R.string.accessibility_data_connection_3g);
Daniel Sandler0fee2172011-11-10 00:15:38 -0500642 break;
643 case TelephonyManager.NETWORK_TYPE_LTE:
644 mDataIconList = TelephonyIcons.DATA_4G[mInetCondition];
645 mDataTypeIconId = R.drawable.stat_sys_data_connected_4g;
646 mContentDescriptionDataType = mContext.getString(
647 R.string.accessibility_data_connection_4g);
648 break;
649 default:
650 if (!mShowAtLeastThreeGees) {
651 mDataIconList = TelephonyIcons.DATA_G[mInetCondition];
652 mDataTypeIconId = R.drawable.stat_sys_data_connected_g;
653 mContentDescriptionDataType = mContext.getString(
654 R.string.accessibility_data_connection_gprs);
655 } else {
656 mDataIconList = TelephonyIcons.DATA_3G[mInetCondition];
657 mDataTypeIconId = R.drawable.stat_sys_data_connected_3g;
658 mContentDescriptionDataType = mContext.getString(
659 R.string.accessibility_data_connection_3g);
660 }
661 break;
662 }
Joe Onoratofd52b182010-11-10 18:00:52 -0800663 }
Daniel Sandler0fee2172011-11-10 00:15:38 -0500664
Kazuhiro Ondobc926132012-01-27 08:57:26 -0600665 if (isCdma()) {
666 if (isCdmaEri()) {
667 mDataTypeIconId = R.drawable.stat_sys_data_connected_roam;
668 }
669 } else if (mPhone.isNetworkRoaming()) {
670 mDataTypeIconId = R.drawable.stat_sys_data_connected_roam;
Joe Onoratoddbba422010-11-23 15:42:28 -0800671 }
Joe Onoratofd52b182010-11-10 18:00:52 -0800672 }
673
674 boolean isCdmaEri() {
Robert Greenwaltacab04d2011-06-06 15:28:45 -0700675 if (mServiceState != null) {
676 final int iconIndex = mServiceState.getCdmaEriIconIndex();
677 if (iconIndex != EriInfo.ROAMING_INDICATOR_OFF) {
678 final int iconMode = mServiceState.getCdmaEriIconMode();
679 if (iconMode == EriInfo.ROAMING_ICON_MODE_NORMAL
680 || iconMode == EriInfo.ROAMING_ICON_MODE_FLASH) {
681 return true;
682 }
Joe Onoratofd52b182010-11-10 18:00:52 -0800683 }
684 }
685 return false;
686 }
687
688 private final void updateDataIcon() {
689 int iconId;
690 boolean visible = true;
691
692 if (!isCdma()) {
693 // GSM case, we have to check also the sim state
Wink Savillea639b312012-07-10 12:37:54 -0700694 if (mSimState == IccCardConstants.State.READY ||
695 mSimState == IccCardConstants.State.UNKNOWN) {
Joe Onoratofd52b182010-11-10 18:00:52 -0800696 if (hasService() && mDataState == TelephonyManager.DATA_CONNECTED) {
697 switch (mDataActivity) {
698 case TelephonyManager.DATA_ACTIVITY_IN:
699 iconId = mDataIconList[1];
700 break;
701 case TelephonyManager.DATA_ACTIVITY_OUT:
702 iconId = mDataIconList[2];
703 break;
704 case TelephonyManager.DATA_ACTIVITY_INOUT:
705 iconId = mDataIconList[3];
706 break;
707 default:
708 iconId = mDataIconList[0];
709 break;
710 }
Joe Onoratoddbba422010-11-23 15:42:28 -0800711 mDataDirectionIconId = iconId;
Joe Onoratofd52b182010-11-10 18:00:52 -0800712 } else {
713 iconId = 0;
714 visible = false;
715 }
716 } else {
717 iconId = R.drawable.stat_sys_no_sim;
Daniel Sandler1f1304a2011-08-07 16:36:39 -0400718 visible = false; // no SIM? no data
Joe Onoratofd52b182010-11-10 18:00:52 -0800719 }
720 } else {
721 // CDMA case, mDataActivity can be also DATA_ACTIVITY_DORMANT
722 if (hasService() && mDataState == TelephonyManager.DATA_CONNECTED) {
723 switch (mDataActivity) {
724 case TelephonyManager.DATA_ACTIVITY_IN:
725 iconId = mDataIconList[1];
726 break;
727 case TelephonyManager.DATA_ACTIVITY_OUT:
728 iconId = mDataIconList[2];
729 break;
730 case TelephonyManager.DATA_ACTIVITY_INOUT:
731 iconId = mDataIconList[3];
732 break;
733 case TelephonyManager.DATA_ACTIVITY_DORMANT:
734 default:
735 iconId = mDataIconList[0];
736 break;
737 }
738 } else {
739 iconId = 0;
740 visible = false;
741 }
742 }
743
744 // yuck - this should NOT be done by the status bar
745 long ident = Binder.clearCallingIdentity();
746 try {
747 mBatteryStats.notePhoneDataConnectionState(mPhone.getNetworkType(), visible);
748 } catch (RemoteException e) {
749 } finally {
750 Binder.restoreCallingIdentity(ident);
751 }
752
Joe Onoratoddbba422010-11-23 15:42:28 -0800753 mDataDirectionIconId = iconId;
Joe Onoratofd52b182010-11-10 18:00:52 -0800754 mDataConnected = visible;
755 }
756
Joe Onorato355ebc02010-12-01 17:37:00 -0800757 void updateNetworkName(boolean showSpn, String spn, boolean showPlmn, String plmn) {
758 if (false) {
759 Slog.d("CarrierLabel", "updateNetworkName showSpn=" + showSpn + " spn=" + spn
760 + " showPlmn=" + showPlmn + " plmn=" + plmn);
761 }
762 StringBuilder str = new StringBuilder();
763 boolean something = false;
764 if (showPlmn && plmn != null) {
765 str.append(plmn);
766 something = true;
767 }
768 if (showSpn && spn != null) {
769 if (something) {
770 str.append(mNetworkNameSeparator);
771 }
772 str.append(spn);
773 something = true;
774 }
775 if (something) {
776 mNetworkName = str.toString();
777 } else {
778 mNetworkName = mNetworkNameDefault;
779 }
780 }
781
Joe Onoratofd52b182010-11-10 18:00:52 -0800782 // ===== Wifi ===================================================================
783
Irfan Sheriff227bec42011-02-15 19:30:27 -0800784 class WifiHandler extends Handler {
Irfan Sheriff227bec42011-02-15 19:30:27 -0800785 @Override
786 public void handleMessage(Message msg) {
787 switch (msg.what) {
788 case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED:
789 if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) {
790 mWifiChannel.sendMessage(Message.obtain(this,
791 AsyncChannel.CMD_CHANNEL_FULL_CONNECTION));
792 } else {
793 Slog.e(TAG, "Failed to connect to wifi");
794 }
795 break;
796 case WifiManager.DATA_ACTIVITY_NOTIFICATION:
Joe Onoratof32621a2011-03-10 15:29:49 -0800797 if (msg.arg1 != mWifiActivity) {
798 mWifiActivity = msg.arg1;
799 refreshViews();
Irfan Sheriff227bec42011-02-15 19:30:27 -0800800 }
801 break;
802 default:
803 //Ignore
804 break;
805 }
806 }
807 }
808
Joe Onoratofd52b182010-11-10 18:00:52 -0800809 private void updateWifiState(Intent intent) {
810 final String action = intent.getAction();
811 if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
812 mWifiEnabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
813 WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED;
814
Irfan Sheriffb8297cf2010-11-18 12:47:29 -0800815 } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
Joe Onoratofd52b182010-11-10 18:00:52 -0800816 final NetworkInfo networkInfo = (NetworkInfo)
817 intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
818 boolean wasConnected = mWifiConnected;
819 mWifiConnected = networkInfo != null && networkInfo.isConnected();
820 // If we just connected, grab the inintial signal strength and ssid
821 if (mWifiConnected && !wasConnected) {
Daniel Sandler0d6ff0102011-10-19 21:02:37 -0400822 // try getting it out of the intent first
823 WifiInfo info = (WifiInfo) intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
824 if (info == null) {
825 info = mWifiManager.getConnectionInfo();
826 }
Joe Onoratofd52b182010-11-10 18:00:52 -0800827 if (info != null) {
Joe Onoratofd52b182010-11-10 18:00:52 -0800828 mWifiSsid = huntForSsid(info);
829 } else {
Joe Onoratofd52b182010-11-10 18:00:52 -0800830 mWifiSsid = null;
831 }
832 } else if (!mWifiConnected) {
Joe Onoratofd52b182010-11-10 18:00:52 -0800833 mWifiSsid = null;
834 }
Joe Onoratofd52b182010-11-10 18:00:52 -0800835 } else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
Irfan Sheriff07573b32012-01-27 21:00:19 -0800836 mWifiRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
837 mWifiLevel = WifiManager.calculateSignalLevel(
838 mWifiRssi, WifiIcons.WIFI_LEVEL_COUNT);
Joe Onoratofd52b182010-11-10 18:00:52 -0800839 }
840
841 updateWifiIcons();
842 }
843
844 private void updateWifiIcons() {
845 if (mWifiConnected) {
846 mWifiIconId = WifiIcons.WIFI_SIGNAL_STRENGTH[mInetCondition][mWifiLevel];
Svetoslav Ganov6179ea32011-06-28 01:12:41 -0700847 mContentDescriptionWifi = mContext.getString(
848 AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH[mWifiLevel]);
Joe Onoratofd52b182010-11-10 18:00:52 -0800849 } else {
Daniel Sandler2b697352011-07-22 16:23:09 -0400850 if (mDataAndWifiStacked) {
851 mWifiIconId = 0;
852 } else {
Daniel Sandlerd4b7e922012-05-17 12:52:51 -0400853 mWifiIconId = mWifiEnabled ? R.drawable.stat_sys_wifi_signal_null : 0;
Daniel Sandler2b697352011-07-22 16:23:09 -0400854 }
Svetoslav Ganov6179ea32011-06-28 01:12:41 -0700855 mContentDescriptionWifi = mContext.getString(R.string.accessibility_no_wifi);
Joe Onoratofd52b182010-11-10 18:00:52 -0800856 }
857 }
858
859 private String huntForSsid(WifiInfo info) {
860 String ssid = info.getSSID();
861 if (ssid != null) {
862 return ssid;
863 }
864 // OK, it's not in the connectionInfo; we have to go hunting for it
865 List<WifiConfiguration> networks = mWifiManager.getConfiguredNetworks();
866 for (WifiConfiguration net : networks) {
867 if (net.networkId == info.getNetworkId()) {
868 return net.SSID;
869 }
870 }
871 return null;
872 }
873
874
Daniel Sandler0fee2172011-11-10 00:15:38 -0500875 // ===== Wimax ===================================================================
tk.mun148c7d02011-10-13 22:51:57 +0900876 private final void updateWimaxState(Intent intent) {
877 final String action = intent.getAction();
878 boolean wasConnected = mWimaxConnected;
879 if (action.equals(WimaxManagerConstants.NET_4G_STATE_CHANGED_ACTION)) {
880 int wimaxStatus = intent.getIntExtra(WimaxManagerConstants.EXTRA_4G_STATE,
881 WimaxManagerConstants.NET_4G_STATE_UNKNOWN);
882 mIsWimaxEnabled = (wimaxStatus ==
Daniel Sandler0fee2172011-11-10 00:15:38 -0500883 WimaxManagerConstants.NET_4G_STATE_ENABLED);
tk.mun148c7d02011-10-13 22:51:57 +0900884 } else if (action.equals(WimaxManagerConstants.SIGNAL_LEVEL_CHANGED_ACTION)) {
885 mWimaxSignal = intent.getIntExtra(WimaxManagerConstants.EXTRA_NEW_SIGNAL_LEVEL, 0);
886 } else if (action.equals(WimaxManagerConstants.WIMAX_NETWORK_STATE_CHANGED_ACTION)) {
Daniel Sandler0fee2172011-11-10 00:15:38 -0500887 mWimaxState = intent.getIntExtra(WimaxManagerConstants.EXTRA_WIMAX_STATE,
tk.mun148c7d02011-10-13 22:51:57 +0900888 WimaxManagerConstants.NET_4G_STATE_UNKNOWN);
889 mWimaxExtraState = intent.getIntExtra(
890 WimaxManagerConstants.EXTRA_WIMAX_STATE_DETAIL,
891 WimaxManagerConstants.NET_4G_STATE_UNKNOWN);
892 mWimaxConnected = (mWimaxState ==
Daniel Sandler0fee2172011-11-10 00:15:38 -0500893 WimaxManagerConstants.WIMAX_STATE_CONNECTED);
894 mWimaxIdle = (mWimaxExtraState == WimaxManagerConstants.WIMAX_IDLE);
tk.mun148c7d02011-10-13 22:51:57 +0900895 }
Daniel Sandler0fee2172011-11-10 00:15:38 -0500896 updateDataNetType();
tk.mun148c7d02011-10-13 22:51:57 +0900897 updateWimaxIcons();
898 }
Daniel Sandler0fee2172011-11-10 00:15:38 -0500899
900 private void updateWimaxIcons() {
901 if (mIsWimaxEnabled) {
902 if (mWimaxConnected) {
903 if (mWimaxIdle)
904 mWimaxIconId = WimaxIcons.WIMAX_IDLE;
905 else
906 mWimaxIconId = WimaxIcons.WIMAX_SIGNAL_STRENGTH[mInetCondition][mWimaxSignal];
907 mContentDescriptionWimax = mContext.getString(
908 AccessibilityContentDescriptions.WIMAX_CONNECTION_STRENGTH[mWimaxSignal]);
909 } else {
910 mWimaxIconId = WimaxIcons.WIMAX_DISCONNECTED;
911 mContentDescriptionWimax = mContext.getString(R.string.accessibility_no_wimax);
912 }
913 } else {
914 mWimaxIconId = 0;
tk.mun148c7d02011-10-13 22:51:57 +0900915 }
Daniel Sandler0fee2172011-11-10 00:15:38 -0500916 }
917
Joe Onoratofd52b182010-11-10 18:00:52 -0800918 // ===== Full or limited Internet connectivity ==================================
919
920 private void updateConnectivity(Intent intent) {
Daniel Sandler60b3e9c2011-08-03 21:22:16 -0400921 if (CHATTY) {
922 Slog.d(TAG, "updateConnectivity: intent=" + intent);
923 }
924
Jeff Sharkey5e613312012-01-30 11:16:20 -0800925 final ConnectivityManager connManager = (ConnectivityManager) mContext
926 .getSystemService(Context.CONNECTIVITY_SERVICE);
927 final NetworkInfo info = connManager.getActiveNetworkInfo();
928
Daniel Sandler67234c42012-06-15 13:17:39 -0400929 // Are we connected at all, by any interface?
930 mConnected = info != null && info.isConnected();
931 if (mConnected) {
932 mConnectedNetworkType = info.getType();
933 mConnectedNetworkTypeName = info.getTypeName();
934 } else {
935 mConnectedNetworkType = ConnectivityManager.TYPE_NONE;
936 mConnectedNetworkTypeName = null;
937 }
938
Joe Onoratofd52b182010-11-10 18:00:52 -0800939 int connectionStatus = intent.getIntExtra(ConnectivityManager.EXTRA_INET_CONDITION, 0);
940
Daniel Sandler60b3e9c2011-08-03 21:22:16 -0400941 if (CHATTY) {
942 Slog.d(TAG, "updateConnectivity: networkInfo=" + info);
943 Slog.d(TAG, "updateConnectivity: connectionStatus=" + connectionStatus);
944 }
945
Daniel Sandler7c12eee2011-09-25 15:53:33 -0400946 mInetCondition = (connectionStatus > INET_CONDITION_THRESHOLD ? 1 : 0);
Joe Onoratofd52b182010-11-10 18:00:52 -0800947
Daniel Sandler7c12eee2011-09-25 15:53:33 -0400948 if (info != null && info.getType() == ConnectivityManager.TYPE_BLUETOOTH) {
Daniel Sandler0fee2172011-11-10 00:15:38 -0500949 mBluetoothTethered = info.isConnected();
Daniel Sandler7c12eee2011-09-25 15:53:33 -0400950 } else {
951 mBluetoothTethered = false;
Joe Onoratofd52b182010-11-10 18:00:52 -0800952 }
Daniel Sandler7c12eee2011-09-25 15:53:33 -0400953
954 // We want to update all the icons, all at once, for any condition change
955 updateDataNetType();
Daniel Sandler0fee2172011-11-10 00:15:38 -0500956 updateWimaxIcons();
Daniel Sandler7c12eee2011-09-25 15:53:33 -0400957 updateDataIcon();
958 updateTelephonySignalStrength();
959 updateWifiIcons();
Joe Onoratofd52b182010-11-10 18:00:52 -0800960 }
961
962
963 // ===== Update the views =======================================================
964
Joe Onoratofd52b182010-11-10 18:00:52 -0800965 void refreshViews() {
966 Context context = mContext;
967
Daniel Sandler28f89d42011-08-15 14:04:15 -0400968 int combinedSignalIconId = 0;
969 int combinedActivityIconId = 0;
Daniel Sandler5962fd52012-01-11 14:57:04 -0500970 String combinedLabel = "";
971 String wifiLabel = "";
972 String mobileLabel = "";
Joe Onoratoddbba422010-11-23 15:42:28 -0800973 int N;
Daniel Sandlerdd4ef492012-07-27 11:19:52 -0400974 final boolean emergencyOnly = isEmergencyOnly();
Joe Onoratofd52b182010-11-10 18:00:52 -0800975
Daniel Sandler639ed752012-01-20 14:22:07 -0500976 if (!mHasMobileDataFeature) {
977 mDataSignalIconId = mPhoneSignalIconId = 0;
Daniel Sandler2e481b92012-01-24 14:45:40 -0500978 mobileLabel = "";
979 } else {
Daniel Sandler62a1eb82012-01-26 10:22:23 -0500980 // We want to show the carrier name if in service and either:
981 // - We are connected to mobile data, or
982 // - We are not connected to mobile data, as long as the *reason* packets are not
983 // being routed over that link is that we have better connectivity via wifi.
Daniel Sandler67234c42012-06-15 13:17:39 -0400984 // If data is disconnected for some other reason but wifi (or ethernet/bluetooth)
985 // is connected, we show nothing.
Daniel Sandler62a1eb82012-01-26 10:22:23 -0500986 // Otherwise (nothing connected) we show "No internet connection".
987
988 if (mDataConnected) {
989 mobileLabel = mNetworkName;
Daniel Sandler9af376e2012-07-25 12:31:22 -0400990 } else if (mConnected || emergencyOnly) {
991 if (hasService() || emergencyOnly) {
Daniel Sandler0ae29272012-07-24 15:19:04 -0400992 // The isEmergencyOnly test covers the case of a phone with no SIM
Daniel Sandler62a1eb82012-01-26 10:22:23 -0500993 mobileLabel = mNetworkName;
994 } else {
Daniel Sandler0ae29272012-07-24 15:19:04 -0400995 // Tablets, basically
Daniel Sandler62a1eb82012-01-26 10:22:23 -0500996 mobileLabel = "";
997 }
998 } else {
John Wangd55cde12012-02-13 17:16:41 -0800999 mobileLabel
Daniel Sandler62a1eb82012-01-26 10:22:23 -05001000 = context.getString(R.string.status_bar_settings_signal_meter_disconnected);
Daniel Sandler5962fd52012-01-11 14:57:04 -05001001 }
Daniel Sandler28f89d42011-08-15 14:04:15 -04001002
Daniel Sandler2e481b92012-01-24 14:45:40 -05001003 // Now for things that should only be shown when actually using mobile data.
1004 if (mDataConnected) {
1005 combinedSignalIconId = mDataSignalIconId;
1006 switch (mDataActivity) {
1007 case TelephonyManager.DATA_ACTIVITY_IN:
1008 mMobileActivityIconId = R.drawable.stat_sys_signal_in;
1009 break;
1010 case TelephonyManager.DATA_ACTIVITY_OUT:
1011 mMobileActivityIconId = R.drawable.stat_sys_signal_out;
1012 break;
1013 case TelephonyManager.DATA_ACTIVITY_INOUT:
1014 mMobileActivityIconId = R.drawable.stat_sys_signal_inout;
1015 break;
1016 default:
1017 mMobileActivityIconId = 0;
1018 break;
1019 }
1020
1021 combinedLabel = mobileLabel;
1022 combinedActivityIconId = mMobileActivityIconId;
1023 combinedSignalIconId = mDataSignalIconId; // set by updateDataIcon()
1024 mContentDescriptionCombinedSignal = mContentDescriptionDataType;
Pawit Pornkitprasan3d305902012-04-03 10:43:54 +07001025 } else {
1026 mMobileActivityIconId = 0;
Daniel Sandler2e481b92012-01-24 14:45:40 -05001027 }
Daniel Sandler28f89d42011-08-15 14:04:15 -04001028 }
Jeff Sharkeyec9cc1b2011-11-30 11:02:27 -08001029
Daniel Sandler28f89d42011-08-15 14:04:15 -04001030 if (mWifiConnected) {
1031 if (mWifiSsid == null) {
Daniel Sandler5962fd52012-01-11 14:57:04 -05001032 wifiLabel = context.getString(R.string.status_bar_settings_signal_meter_wifi_nossid);
Daniel Sandler28f89d42011-08-15 14:04:15 -04001033 mWifiActivityIconId = 0; // no wifis, no bits
1034 } else {
Daniel Sandler5962fd52012-01-11 14:57:04 -05001035 wifiLabel = mWifiSsid;
1036 if (DEBUG) {
1037 wifiLabel += "xxxxXXXXxxxxXXXX";
1038 }
Daniel Sandler28f89d42011-08-15 14:04:15 -04001039 switch (mWifiActivity) {
1040 case WifiManager.DATA_ACTIVITY_IN:
1041 mWifiActivityIconId = R.drawable.stat_sys_wifi_in;
1042 break;
1043 case WifiManager.DATA_ACTIVITY_OUT:
1044 mWifiActivityIconId = R.drawable.stat_sys_wifi_out;
1045 break;
1046 case WifiManager.DATA_ACTIVITY_INOUT:
1047 mWifiActivityIconId = R.drawable.stat_sys_wifi_inout;
1048 break;
1049 case WifiManager.DATA_ACTIVITY_NONE:
repo syncecc430e2011-09-30 07:57:50 -07001050 mWifiActivityIconId = 0;
Daniel Sandler28f89d42011-08-15 14:04:15 -04001051 break;
1052 }
1053 }
1054
1055 combinedActivityIconId = mWifiActivityIconId;
Daniel Sandler5962fd52012-01-11 14:57:04 -05001056 combinedLabel = wifiLabel;
Daniel Sandler28f89d42011-08-15 14:04:15 -04001057 combinedSignalIconId = mWifiIconId; // set by updateWifiIcons()
1058 mContentDescriptionCombinedSignal = mContentDescriptionWifi;
Daniel Sandler2e481b92012-01-24 14:45:40 -05001059 } else {
1060 if (mHasMobileDataFeature) {
1061 wifiLabel = "";
1062 } else {
1063 wifiLabel = context.getString(R.string.status_bar_settings_signal_meter_disconnected);
1064 }
Daniel Sandler28f89d42011-08-15 14:04:15 -04001065 }
1066
1067 if (mBluetoothTethered) {
Daniel Sandler5962fd52012-01-11 14:57:04 -05001068 combinedLabel = mContext.getString(R.string.bluetooth_tethered);
Jaikumar Ganeshfde7f0e2011-01-10 10:05:58 -08001069 combinedSignalIconId = mBluetoothTetherIconId;
Svetoslav Ganov6179ea32011-06-28 01:12:41 -07001070 mContentDescriptionCombinedSignal = mContext.getString(
1071 R.string.accessibility_bluetooth_tether);
Daniel Sandler28f89d42011-08-15 14:04:15 -04001072 }
Jeff Sharkeyec9cc1b2011-11-30 11:02:27 -08001073
Daniel Sandler67234c42012-06-15 13:17:39 -04001074 final boolean ethernetConnected = (mConnectedNetworkType == ConnectivityManager.TYPE_ETHERNET);
1075 if (ethernetConnected) {
1076 // TODO: icons and strings for Ethernet connectivity
1077 combinedLabel = mConnectedNetworkTypeName;
1078 }
1079
Daniel Sandler28f89d42011-08-15 14:04:15 -04001080 if (mAirplaneMode &&
Mike Corriganbd151122011-02-24 15:24:47 -06001081 (mServiceState == null || (!hasService() && !mServiceState.isEmergencyOnly()))) {
1082 // Only display the flight-mode icon if not in "emergency calls only" mode.
Jeff Sharkeyec9cc1b2011-11-30 11:02:27 -08001083
Daniel Sandler28f89d42011-08-15 14:04:15 -04001084 // look again; your radios are now airplanes
Jeff Sharkeyec9cc1b2011-11-30 11:02:27 -08001085 mContentDescriptionPhoneSignal = mContext.getString(
1086 R.string.accessibility_airplane_mode);
Andrew Flynn061d43c2012-05-04 10:57:58 -07001087 mAirplaneIconId = R.drawable.stat_sys_signal_flightmode;
Andrew Flynnc325cba2012-05-24 10:30:23 -07001088 mPhoneSignalIconId = mDataSignalIconId = mDataTypeIconId = 0;
Daniel Sandler28f89d42011-08-15 14:04:15 -04001089
Jeff Sharkeyec9cc1b2011-11-30 11:02:27 -08001090 // combined values from connected wifi take precedence over airplane mode
Daniel Sandler2e481b92012-01-24 14:45:40 -05001091 if (mWifiConnected) {
1092 // Suppress "No internet connection." from mobile if wifi connected.
1093 mobileLabel = "";
1094 } else {
1095 if (mHasMobileDataFeature) {
1096 // let the mobile icon show "No internet connection."
1097 wifiLabel = "";
1098 } else {
1099 wifiLabel = context.getString(R.string.status_bar_settings_signal_meter_disconnected);
1100 combinedLabel = wifiLabel;
1101 }
Jeff Sharkeyec9cc1b2011-11-30 11:02:27 -08001102 mContentDescriptionCombinedSignal = mContentDescriptionPhoneSignal;
1103 combinedSignalIconId = mDataSignalIconId;
1104 }
Daniel Sandler28f89d42011-08-15 14:04:15 -04001105 }
Daniel Sandler67234c42012-06-15 13:17:39 -04001106 else if (!mDataConnected && !mWifiConnected && !mBluetoothTethered && !mWimaxConnected && !ethernetConnected) {
Daniel Sandler28f89d42011-08-15 14:04:15 -04001107 // pretty much totally disconnected
1108
Daniel Sandler5962fd52012-01-11 14:57:04 -05001109 combinedLabel = context.getString(R.string.status_bar_settings_signal_meter_disconnected);
Daniel Sandler9a7c7122011-02-25 12:28:57 -05001110 // On devices without mobile radios, we want to show the wifi icon
1111 combinedSignalIconId =
Robert Greenwalt9b2886e2011-08-31 11:46:42 -07001112 mHasMobileDataFeature ? mDataSignalIconId : mWifiIconId;
1113 mContentDescriptionCombinedSignal = mHasMobileDataFeature
Svetoslav Ganov6179ea32011-06-28 01:12:41 -07001114 ? mContentDescriptionDataType : mContentDescriptionWifi;
Daniel Sandler89d97132011-09-08 15:31:57 -04001115
Kazuhiro Ondobc926132012-01-27 08:57:26 -06001116 mDataTypeIconId = 0;
1117 if (isCdma()) {
1118 if (isCdmaEri()) {
1119 mDataTypeIconId = R.drawable.stat_sys_data_connected_roam;
1120 }
1121 } else if (mPhone.isNetworkRoaming()) {
Daniel Sandler89d97132011-09-08 15:31:57 -04001122 mDataTypeIconId = R.drawable.stat_sys_data_connected_roam;
Daniel Sandler89d97132011-09-08 15:31:57 -04001123 }
Joe Onoratofd52b182010-11-10 18:00:52 -08001124 }
1125
Daniel Sandler9a7c7122011-02-25 12:28:57 -05001126 if (DEBUG) {
Daniel Sandler1f1304a2011-08-07 16:36:39 -04001127 Slog.d(TAG, "refreshViews connected={"
1128 + (mWifiConnected?" wifi":"")
1129 + (mDataConnected?" data":"")
1130 + " } level="
1131 + ((mSignalStrength == null)?"??":Integer.toString(mSignalStrength.getLevel()))
1132 + " combinedSignalIconId=0x"
Joe Onoratoc198bb12011-01-31 20:28:59 -08001133 + Integer.toHexString(combinedSignalIconId)
1134 + "/" + getResourceName(combinedSignalIconId)
Daniel Sandler28f89d42011-08-15 14:04:15 -04001135 + " combinedActivityIconId=0x" + Integer.toHexString(combinedActivityIconId)
Daniel Sandler3d32a242012-06-05 13:44:14 -04001136 + " mobileLabel=" + mobileLabel
1137 + " wifiLabel=" + wifiLabel
Daniel Sandlerdd4ef492012-07-27 11:19:52 -04001138 + " emergencyOnly=" + emergencyOnly
Daniel Sandler3d32a242012-06-05 13:44:14 -04001139 + " combinedLabel=" + combinedLabel
Mike Corriganbd151122011-02-24 15:24:47 -06001140 + " mAirplaneMode=" + mAirplaneMode
Joe Onoratoc198bb12011-01-31 20:28:59 -08001141 + " mDataActivity=" + mDataActivity
Joe Onoratoddbba422010-11-23 15:42:28 -08001142 + " mPhoneSignalIconId=0x" + Integer.toHexString(mPhoneSignalIconId)
1143 + " mDataDirectionIconId=0x" + Integer.toHexString(mDataDirectionIconId)
1144 + " mDataSignalIconId=0x" + Integer.toHexString(mDataSignalIconId)
1145 + " mDataTypeIconId=0x" + Integer.toHexString(mDataTypeIconId)
Jaikumar Ganeshfde7f0e2011-01-10 10:05:58 -08001146 + " mWifiIconId=0x" + Integer.toHexString(mWifiIconId)
Joe Onoratoc198bb12011-01-31 20:28:59 -08001147 + " mBluetoothTetherIconId=0x" + Integer.toHexString(mBluetoothTetherIconId));
Joe Onoratoddbba422010-11-23 15:42:28 -08001148 }
Joe Onoratofd52b182010-11-10 18:00:52 -08001149
Christian Robertson2e347422011-08-11 14:01:04 -07001150 if (mLastPhoneSignalIconId != mPhoneSignalIconId
Daniel Sandler28f89d42011-08-15 14:04:15 -04001151 || mLastDataDirectionOverlayIconId != combinedActivityIconId
Christian Robertson2e347422011-08-11 14:01:04 -07001152 || mLastWifiIconId != mWifiIconId
Daniel Sandler0fee2172011-11-10 00:15:38 -05001153 || mLastWimaxIconId != mWimaxIconId
Andrew Flynn0fa9d2d2012-05-31 15:39:15 -07001154 || mLastDataTypeIconId != mDataTypeIconId
1155 || mLastAirplaneMode != mAirplaneMode)
Christian Robertson2e347422011-08-11 14:01:04 -07001156 {
1157 // NB: the mLast*s will be updated later
1158 for (SignalCluster cluster : mSignalClusters) {
Daniel Sandler0fee2172011-11-10 00:15:38 -05001159 refreshSignalCluster(cluster);
Christian Robertson2e347422011-08-11 14:01:04 -07001160 }
Winson Chungd63c59782012-09-05 17:34:41 -07001161 for (NetworkSignalChangedCallback cb : mSignalsChangedCallbacks) {
1162 notifySignalsChangedCallbacks(cb);
1163 }
Christian Robertson2e347422011-08-11 14:01:04 -07001164 }
1165
Andrew Flynn0fa9d2d2012-05-31 15:39:15 -07001166 if (mLastAirplaneMode != mAirplaneMode) {
1167 mLastAirplaneMode = mAirplaneMode;
1168 }
1169
Joe Onoratoddbba422010-11-23 15:42:28 -08001170 // the phone icon on phones
Joe Onoratofd52b182010-11-10 18:00:52 -08001171 if (mLastPhoneSignalIconId != mPhoneSignalIconId) {
1172 mLastPhoneSignalIconId = mPhoneSignalIconId;
Joe Onoratoddbba422010-11-23 15:42:28 -08001173 N = mPhoneSignalIconViews.size();
Joe Onoratofd52b182010-11-10 18:00:52 -08001174 for (int i=0; i<N; i++) {
Joe Onoratoddbba422010-11-23 15:42:28 -08001175 final ImageView v = mPhoneSignalIconViews.get(i);
Daniel Sandler639ed752012-01-20 14:22:07 -05001176 if (mPhoneSignalIconId == 0) {
1177 v.setVisibility(View.GONE);
1178 } else {
1179 v.setVisibility(View.VISIBLE);
1180 v.setImageResource(mPhoneSignalIconId);
1181 v.setContentDescription(mContentDescriptionPhoneSignal);
1182 }
Joe Onoratofd52b182010-11-10 18:00:52 -08001183 }
1184 }
1185
Joe Onoratoddbba422010-11-23 15:42:28 -08001186 // the data icon on phones
1187 if (mLastDataDirectionIconId != mDataDirectionIconId) {
1188 mLastDataDirectionIconId = mDataDirectionIconId;
1189 N = mDataDirectionIconViews.size();
Joe Onoratofd52b182010-11-10 18:00:52 -08001190 for (int i=0; i<N; i++) {
Joe Onoratoddbba422010-11-23 15:42:28 -08001191 final ImageView v = mDataDirectionIconViews.get(i);
1192 v.setImageResource(mDataDirectionIconId);
Svetoslav Ganov6179ea32011-06-28 01:12:41 -07001193 v.setContentDescription(mContentDescriptionDataType);
Joe Onoratofd52b182010-11-10 18:00:52 -08001194 }
1195 }
1196
Joe Onoratoddbba422010-11-23 15:42:28 -08001197 // the wifi icon on phones
1198 if (mLastWifiIconId != mWifiIconId) {
1199 mLastWifiIconId = mWifiIconId;
1200 N = mWifiIconViews.size();
1201 for (int i=0; i<N; i++) {
1202 final ImageView v = mWifiIconViews.get(i);
Daniel Sandler2b697352011-07-22 16:23:09 -04001203 if (mWifiIconId == 0) {
Daniel Sandler5962fd52012-01-11 14:57:04 -05001204 v.setVisibility(View.GONE);
Daniel Sandler2b697352011-07-22 16:23:09 -04001205 } else {
1206 v.setVisibility(View.VISIBLE);
1207 v.setImageResource(mWifiIconId);
1208 v.setContentDescription(mContentDescriptionWifi);
1209 }
Joe Onoratoddbba422010-11-23 15:42:28 -08001210 }
1211 }
1212
tk.mun148c7d02011-10-13 22:51:57 +09001213 // the wimax icon on phones
1214 if (mLastWimaxIconId != mWimaxIconId) {
1215 mLastWimaxIconId = mWimaxIconId;
1216 N = mWimaxIconViews.size();
1217 for (int i=0; i<N; i++) {
1218 final ImageView v = mWimaxIconViews.get(i);
1219 if (mWimaxIconId == 0) {
Daniel Sandler5962fd52012-01-11 14:57:04 -05001220 v.setVisibility(View.GONE);
tk.mun148c7d02011-10-13 22:51:57 +09001221 } else {
1222 v.setVisibility(View.VISIBLE);
1223 v.setImageResource(mWimaxIconId);
1224 v.setContentDescription(mContentDescriptionWimax);
1225 }
1226 }
1227 }
Joe Onoratoddbba422010-11-23 15:42:28 -08001228 // the combined data signal icon
1229 if (mLastCombinedSignalIconId != combinedSignalIconId) {
1230 mLastCombinedSignalIconId = combinedSignalIconId;
1231 N = mCombinedSignalIconViews.size();
1232 for (int i=0; i<N; i++) {
1233 final ImageView v = mCombinedSignalIconViews.get(i);
1234 v.setImageResource(combinedSignalIconId);
Svetoslav Ganov6179ea32011-06-28 01:12:41 -07001235 v.setContentDescription(mContentDescriptionCombinedSignal);
Joe Onoratoddbba422010-11-23 15:42:28 -08001236 }
1237 }
1238
1239 // the data network type overlay
Daniel Sandler28f89d42011-08-15 14:04:15 -04001240 if (mLastDataTypeIconId != mDataTypeIconId) {
1241 mLastDataTypeIconId = mDataTypeIconId;
Joe Onoratoddbba422010-11-23 15:42:28 -08001242 N = mDataTypeIconViews.size();
1243 for (int i=0; i<N; i++) {
1244 final ImageView v = mDataTypeIconViews.get(i);
Daniel Sandler28f89d42011-08-15 14:04:15 -04001245 if (mDataTypeIconId == 0) {
Daniel Sandler5962fd52012-01-11 14:57:04 -05001246 v.setVisibility(View.GONE);
Joe Onoratoddbba422010-11-23 15:42:28 -08001247 } else {
1248 v.setVisibility(View.VISIBLE);
Daniel Sandler28f89d42011-08-15 14:04:15 -04001249 v.setImageResource(mDataTypeIconId);
Svetoslav Ganov6179ea32011-06-28 01:12:41 -07001250 v.setContentDescription(mContentDescriptionDataType);
Joe Onoratoddbba422010-11-23 15:42:28 -08001251 }
1252 }
1253 }
1254
Joe Onoratofce2bf32011-02-01 17:00:29 -08001255 // the data direction overlay
Daniel Sandler28f89d42011-08-15 14:04:15 -04001256 if (mLastDataDirectionOverlayIconId != combinedActivityIconId) {
Daniel Sandler8d5d19c2011-03-16 15:01:30 -04001257 if (DEBUG) {
Daniel Sandler28f89d42011-08-15 14:04:15 -04001258 Slog.d(TAG, "changing data overlay icon id to " + combinedActivityIconId);
Daniel Sandler8d5d19c2011-03-16 15:01:30 -04001259 }
Daniel Sandler28f89d42011-08-15 14:04:15 -04001260 mLastDataDirectionOverlayIconId = combinedActivityIconId;
Joe Onoratofce2bf32011-02-01 17:00:29 -08001261 N = mDataDirectionOverlayIconViews.size();
1262 for (int i=0; i<N; i++) {
1263 final ImageView v = mDataDirectionOverlayIconViews.get(i);
Daniel Sandler28f89d42011-08-15 14:04:15 -04001264 if (combinedActivityIconId == 0) {
Daniel Sandler5962fd52012-01-11 14:57:04 -05001265 v.setVisibility(View.GONE);
Joe Onoratofce2bf32011-02-01 17:00:29 -08001266 } else {
1267 v.setVisibility(View.VISIBLE);
Daniel Sandler28f89d42011-08-15 14:04:15 -04001268 v.setImageResource(combinedActivityIconId);
Svetoslav Ganov6179ea32011-06-28 01:12:41 -07001269 v.setContentDescription(mContentDescriptionDataType);
Joe Onoratofce2bf32011-02-01 17:00:29 -08001270 }
1271 }
1272 }
1273
Daniel Sandler5962fd52012-01-11 14:57:04 -05001274 // the combinedLabel in the notification panel
1275 if (!mLastCombinedLabel.equals(combinedLabel)) {
1276 mLastCombinedLabel = combinedLabel;
1277 N = mCombinedLabelViews.size();
Joe Onoratofd52b182010-11-10 18:00:52 -08001278 for (int i=0; i<N; i++) {
Daniel Sandler5962fd52012-01-11 14:57:04 -05001279 TextView v = mCombinedLabelViews.get(i);
1280 v.setText(combinedLabel);
Joe Onoratofd52b182010-11-10 18:00:52 -08001281 }
1282 }
Daniel Sandler5962fd52012-01-11 14:57:04 -05001283
1284 // wifi label
1285 N = mWifiLabelViews.size();
1286 for (int i=0; i<N; i++) {
1287 TextView v = mWifiLabelViews.get(i);
Daniel Sandler3d32a242012-06-05 13:44:14 -04001288 v.setText(wifiLabel);
Daniel Sandler639ed752012-01-20 14:22:07 -05001289 if ("".equals(wifiLabel)) {
1290 v.setVisibility(View.GONE);
1291 } else {
1292 v.setVisibility(View.VISIBLE);
Daniel Sandler639ed752012-01-20 14:22:07 -05001293 }
Daniel Sandler5962fd52012-01-11 14:57:04 -05001294 }
John Wangd55cde12012-02-13 17:16:41 -08001295
Daniel Sandler5962fd52012-01-11 14:57:04 -05001296 // mobile label
1297 N = mMobileLabelViews.size();
1298 for (int i=0; i<N; i++) {
1299 TextView v = mMobileLabelViews.get(i);
Daniel Sandler3d32a242012-06-05 13:44:14 -04001300 v.setText(mobileLabel);
Daniel Sandler639ed752012-01-20 14:22:07 -05001301 if ("".equals(mobileLabel)) {
1302 v.setVisibility(View.GONE);
1303 } else {
1304 v.setVisibility(View.VISIBLE);
Daniel Sandler639ed752012-01-20 14:22:07 -05001305 }
Daniel Sandler5962fd52012-01-11 14:57:04 -05001306 }
Daniel Sandlerdd4ef492012-07-27 11:19:52 -04001307
1308 // e-call label
1309 N = mEmergencyLabelViews.size();
1310 for (int i=0; i<N; i++) {
1311 TextView v = mEmergencyLabelViews.get(i);
1312 if (!emergencyOnly) {
1313 v.setVisibility(View.GONE);
1314 } else {
1315 v.setText(mobileLabel); // comes from the telephony stack
1316 v.setVisibility(View.VISIBLE);
1317 }
1318 }
Joe Onoratofd52b182010-11-10 18:00:52 -08001319 }
Joe Onorato933464d2011-01-05 15:53:36 -08001320
1321 public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
Daniel Sandlerc49e1952011-09-20 10:45:53 -04001322 pw.println("NetworkController state:");
Daniel Sandler67234c42012-06-15 13:17:39 -04001323 pw.println(String.format(" %s network type %d (%s)",
1324 mConnected?"CONNECTED":"DISCONNECTED",
1325 mConnectedNetworkType, mConnectedNetworkTypeName));
Joe Onorato933464d2011-01-05 15:53:36 -08001326 pw.println(" - telephony ------");
Daniel Sandlerc49e1952011-09-20 10:45:53 -04001327 pw.print(" hasService()=");
1328 pw.println(hasService());
Joe Onorato933464d2011-01-05 15:53:36 -08001329 pw.print(" mHspaDataDistinguishable=");
1330 pw.println(mHspaDataDistinguishable);
1331 pw.print(" mDataConnected=");
1332 pw.println(mDataConnected);
1333 pw.print(" mSimState=");
1334 pw.println(mSimState);
1335 pw.print(" mPhoneState=");
1336 pw.println(mPhoneState);
1337 pw.print(" mDataState=");
1338 pw.println(mDataState);
1339 pw.print(" mDataActivity=");
1340 pw.println(mDataActivity);
Daniel Sandler89d97132011-09-08 15:31:57 -04001341 pw.print(" mDataNetType=");
1342 pw.print(mDataNetType);
1343 pw.print("/");
1344 pw.println(TelephonyManager.getNetworkTypeName(mDataNetType));
Joe Onorato933464d2011-01-05 15:53:36 -08001345 pw.print(" mServiceState=");
Robert Greenwaltacab04d2011-06-06 15:28:45 -07001346 pw.println(mServiceState);
Daniel Sandlerc49e1952011-09-20 10:45:53 -04001347 pw.print(" mSignalStrength=");
1348 pw.println(mSignalStrength);
1349 pw.print(" mLastSignalLevel=");
1350 pw.println(mLastSignalLevel);
Joe Onorato933464d2011-01-05 15:53:36 -08001351 pw.print(" mNetworkName=");
1352 pw.println(mNetworkName);
1353 pw.print(" mNetworkNameDefault=");
1354 pw.println(mNetworkNameDefault);
1355 pw.print(" mNetworkNameSeparator=");
Daniel Sandler89d97132011-09-08 15:31:57 -04001356 pw.println(mNetworkNameSeparator.replace("\n","\\n"));
Joe Onorato933464d2011-01-05 15:53:36 -08001357 pw.print(" mPhoneSignalIconId=0x");
1358 pw.print(Integer.toHexString(mPhoneSignalIconId));
1359 pw.print("/");
1360 pw.println(getResourceName(mPhoneSignalIconId));
1361 pw.print(" mDataDirectionIconId=");
1362 pw.print(Integer.toHexString(mDataDirectionIconId));
1363 pw.print("/");
1364 pw.println(getResourceName(mDataDirectionIconId));
1365 pw.print(" mDataSignalIconId=");
1366 pw.print(Integer.toHexString(mDataSignalIconId));
1367 pw.print("/");
1368 pw.println(getResourceName(mDataSignalIconId));
1369 pw.print(" mDataTypeIconId=");
1370 pw.print(Integer.toHexString(mDataTypeIconId));
1371 pw.print("/");
1372 pw.println(getResourceName(mDataTypeIconId));
1373
1374 pw.println(" - wifi ------");
1375 pw.print(" mWifiEnabled=");
1376 pw.println(mWifiEnabled);
1377 pw.print(" mWifiConnected=");
1378 pw.println(mWifiConnected);
Daniel Sandler0d6ff0102011-10-19 21:02:37 -04001379 pw.print(" mWifiRssi=");
1380 pw.println(mWifiRssi);
Joe Onorato933464d2011-01-05 15:53:36 -08001381 pw.print(" mWifiLevel=");
1382 pw.println(mWifiLevel);
1383 pw.print(" mWifiSsid=");
1384 pw.println(mWifiSsid);
Daniel Sandler0fee2172011-11-10 00:15:38 -05001385 pw.println(String.format(" mWifiIconId=0x%08x/%s",
Daniel Sandler7c12eee2011-09-25 15:53:33 -04001386 mWifiIconId, getResourceName(mWifiIconId)));
Joe Onoratof32621a2011-03-10 15:29:49 -08001387 pw.print(" mWifiActivity=");
1388 pw.println(mWifiActivity);
1389
Daniel Sandler0fee2172011-11-10 00:15:38 -05001390 if (mWimaxSupported) {
1391 pw.println(" - wimax ------");
1392 pw.print(" mIsWimaxEnabled="); pw.println(mIsWimaxEnabled);
1393 pw.print(" mWimaxConnected="); pw.println(mWimaxConnected);
1394 pw.print(" mWimaxIdle="); pw.println(mWimaxIdle);
1395 pw.println(String.format(" mWimaxIconId=0x%08x/%s",
1396 mWimaxIconId, getResourceName(mWimaxIconId)));
1397 pw.println(String.format(" mWimaxSignal=%d", mWimaxSignal));
1398 pw.println(String.format(" mWimaxState=%d", mWimaxState));
1399 pw.println(String.format(" mWimaxExtraState=%d", mWimaxExtraState));
1400 }
Joe Onorato933464d2011-01-05 15:53:36 -08001401
Jaikumar Ganeshfde7f0e2011-01-10 10:05:58 -08001402 pw.println(" - Bluetooth ----");
Daniel Sandlerc49e1952011-09-20 10:45:53 -04001403 pw.print(" mBtReverseTethered=");
Jaikumar Ganeshfde7f0e2011-01-10 10:05:58 -08001404 pw.println(mBluetoothTethered);
1405
Joe Onorato933464d2011-01-05 15:53:36 -08001406 pw.println(" - connectivity ------");
1407 pw.print(" mInetCondition=");
1408 pw.println(mInetCondition);
1409
1410 pw.println(" - icons ------");
1411 pw.print(" mLastPhoneSignalIconId=0x");
1412 pw.print(Integer.toHexString(mLastPhoneSignalIconId));
1413 pw.print("/");
1414 pw.println(getResourceName(mLastPhoneSignalIconId));
1415 pw.print(" mLastDataDirectionIconId=0x");
1416 pw.print(Integer.toHexString(mLastDataDirectionIconId));
1417 pw.print("/");
1418 pw.println(getResourceName(mLastDataDirectionIconId));
Joe Onoratofce2bf32011-02-01 17:00:29 -08001419 pw.print(" mLastDataDirectionOverlayIconId=0x");
1420 pw.print(Integer.toHexString(mLastDataDirectionOverlayIconId));
1421 pw.print("/");
1422 pw.println(getResourceName(mLastDataDirectionOverlayIconId));
Joe Onorato933464d2011-01-05 15:53:36 -08001423 pw.print(" mLastWifiIconId=0x");
1424 pw.print(Integer.toHexString(mLastWifiIconId));
1425 pw.print("/");
1426 pw.println(getResourceName(mLastWifiIconId));
1427 pw.print(" mLastCombinedSignalIconId=0x");
1428 pw.print(Integer.toHexString(mLastCombinedSignalIconId));
1429 pw.print("/");
1430 pw.println(getResourceName(mLastCombinedSignalIconId));
1431 pw.print(" mLastDataTypeIconId=0x");
1432 pw.print(Integer.toHexString(mLastDataTypeIconId));
1433 pw.print("/");
Daniel Sandler0fee2172011-11-10 00:15:38 -05001434 pw.println(getResourceName(mLastDataTypeIconId));
Daniel Sandler5962fd52012-01-11 14:57:04 -05001435 pw.print(" mLastCombinedLabel=");
1436 pw.print(mLastCombinedLabel);
Daniel Sandlerc49e1952011-09-20 10:45:53 -04001437 pw.println("");
Joe Onorato933464d2011-01-05 15:53:36 -08001438 }
1439
1440 private String getResourceName(int resId) {
Daniel Sandler89d97132011-09-08 15:31:57 -04001441 if (resId != 0) {
Joe Onorato933464d2011-01-05 15:53:36 -08001442 final Resources res = mContext.getResources();
1443 try {
1444 return res.getResourceName(resId);
1445 } catch (android.content.res.Resources.NotFoundException ex) {
1446 return "(unknown)";
1447 }
1448 } else {
1449 return "(null)";
1450 }
1451 }
1452
Joe Onoratofd52b182010-11-10 18:00:52 -08001453}