NetworkController.java revision 32f470017246e397e2c21556b9dc04bb99e52862
1/* 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 19import java.io.FileDescriptor; 20import java.io.PrintWriter; 21import java.util.ArrayList; 22import java.util.List; 23 24import android.content.BroadcastReceiver; 25import android.content.Context; 26import android.content.Intent; 27import android.content.IntentFilter; 28import android.content.res.Resources; 29import android.net.ConnectivityManager; 30import android.net.NetworkInfo; 31import android.net.wifi.WifiConfiguration; 32import android.net.wifi.WifiInfo; 33import android.net.wifi.WifiManager; 34import android.net.wimax.WimaxManagerConstants; 35import android.os.Binder; 36import android.os.Handler; 37import android.os.Message; 38import android.os.Messenger; 39import android.os.RemoteException; 40import android.os.SystemProperties; 41import android.provider.Settings; 42import android.provider.Telephony; 43import android.telephony.PhoneStateListener; 44import android.telephony.ServiceState; 45import android.telephony.SignalStrength; 46import android.telephony.TelephonyManager; 47import android.util.Slog; 48import android.view.View; 49import android.widget.ImageView; 50import android.widget.TextView; 51 52import com.android.internal.app.IBatteryStats; 53import com.android.internal.telephony.IccCard; 54import com.android.internal.telephony.TelephonyIntents; 55import com.android.internal.telephony.cdma.EriInfo; 56import com.android.server.am.BatteryStatsService; 57import com.android.internal.util.AsyncChannel; 58 59import com.android.systemui.R; 60 61public class NetworkController extends BroadcastReceiver { 62 // debug 63 static final String TAG = "StatusBar.NetworkController"; 64 static final boolean DEBUG = false; 65 static final boolean CHATTY = false; // additional diagnostics, but not logspew 66 67 // telephony 68 boolean mHspaDataDistinguishable; 69 final TelephonyManager mPhone; 70 boolean mDataConnected; 71 IccCard.State mSimState = IccCard.State.READY; 72 int mPhoneState = TelephonyManager.CALL_STATE_IDLE; 73 int mDataNetType = TelephonyManager.NETWORK_TYPE_UNKNOWN; 74 int mDataState = TelephonyManager.DATA_DISCONNECTED; 75 int mDataActivity = TelephonyManager.DATA_ACTIVITY_NONE; 76 ServiceState mServiceState; 77 SignalStrength mSignalStrength; 78 int[] mDataIconList = TelephonyIcons.DATA_G[0]; 79 String mNetworkName; 80 String mNetworkNameDefault; 81 String mNetworkNameSeparator; 82 int mPhoneSignalIconId; 83 int mDataDirectionIconId; // data + data direction on phones 84 int mDataSignalIconId; 85 int mDataTypeIconId; 86 boolean mDataActive; 87 int mMobileActivityIconId; // overlay arrows for data direction 88 int mLastSignalLevel; 89 boolean mShowPhoneRSSIForData = false; 90 boolean mShowAtLeastThreeGees = false; 91 92 String mContentDescriptionPhoneSignal; 93 String mContentDescriptionWifi; 94 String mContentDescriptionWimax; 95 String mContentDescriptionCombinedSignal; 96 String mContentDescriptionDataType; 97 98 // wifi 99 final WifiManager mWifiManager; 100 AsyncChannel mWifiChannel; 101 boolean mWifiEnabled, mWifiConnected; 102 int mWifiRssi, mWifiLevel; 103 String mWifiSsid; 104 int mWifiIconId = 0; 105 int mWifiActivityIconId = 0; // overlay arrows for wifi direction 106 int mWifiActivity = WifiManager.DATA_ACTIVITY_NONE; 107 108 // bluetooth 109 private boolean mBluetoothTethered = false; 110 private int mBluetoothTetherIconId = 111 com.android.internal.R.drawable.stat_sys_tether_bluetooth; 112 113 //wimax 114 private boolean mWimaxSupported = false; 115 private boolean mIsWimaxEnabled = false; 116 private boolean mWimaxConnected = false; 117 private boolean mWimaxIdle = false; 118 private int mWimaxIconId = 0; 119 private int mWimaxSignal = 0; 120 private int mWimaxState = 0; 121 private int mWimaxExtraState = 0; 122 // data connectivity (regardless of state, can we access the internet?) 123 // state of inet connection - 0 not connected, 100 connected 124 private int mInetCondition = 0; 125 private static final int INET_CONDITION_THRESHOLD = 50; 126 127 private boolean mAirplaneMode = false; 128 129 // our ui 130 Context mContext; 131 ArrayList<ImageView> mPhoneSignalIconViews = new ArrayList<ImageView>(); 132 ArrayList<ImageView> mDataDirectionIconViews = new ArrayList<ImageView>(); 133 ArrayList<ImageView> mDataDirectionOverlayIconViews = new ArrayList<ImageView>(); 134 ArrayList<ImageView> mWifiIconViews = new ArrayList<ImageView>(); 135 ArrayList<ImageView> mWimaxIconViews = new ArrayList<ImageView>(); 136 ArrayList<ImageView> mCombinedSignalIconViews = new ArrayList<ImageView>(); 137 ArrayList<ImageView> mDataTypeIconViews = new ArrayList<ImageView>(); 138 ArrayList<TextView> mCombinedLabelViews = new ArrayList<TextView>(); 139 ArrayList<TextView> mMobileLabelViews = new ArrayList<TextView>(); 140 ArrayList<TextView> mWifiLabelViews = new ArrayList<TextView>(); 141 ArrayList<SignalCluster> mSignalClusters = new ArrayList<SignalCluster>(); 142 int mLastPhoneSignalIconId = -1; 143 int mLastDataDirectionIconId = -1; 144 int mLastDataDirectionOverlayIconId = -1; 145 int mLastWifiIconId = -1; 146 int mLastWimaxIconId = -1; 147 int mLastCombinedSignalIconId = -1; 148 int mLastDataTypeIconId = -1; 149 String mLastCombinedLabel = ""; 150 151 private boolean mHasMobileDataFeature; 152 153 boolean mDataAndWifiStacked = false; 154 155 // yuck -- stop doing this here and put it in the framework 156 IBatteryStats mBatteryStats; 157 158 public interface SignalCluster { 159 void setWifiIndicators(boolean visible, int strengthIcon, int activityIcon, 160 String contentDescription); 161 void setMobileDataIndicators(boolean visible, int strengthIcon, int activityIcon, 162 int typeIcon, String contentDescription, String typeContentDescription); 163 void setIsAirplaneMode(boolean is); 164 } 165 166 /** 167 * Construct this controller object and register for updates. 168 */ 169 public NetworkController(Context context) { 170 mContext = context; 171 final Resources res = context.getResources(); 172 173 ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService( 174 Context.CONNECTIVITY_SERVICE); 175 mHasMobileDataFeature = cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE); 176 177 mShowPhoneRSSIForData = res.getBoolean(R.bool.config_showPhoneRSSIForData); 178 mShowAtLeastThreeGees = res.getBoolean(R.bool.config_showMin3G); 179 180 // set up the default wifi icon, used when no radios have ever appeared 181 updateWifiIcons(); 182 updateWimaxIcons(); 183 184 // telephony 185 mPhone = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 186 mPhone.listen(mPhoneStateListener, 187 PhoneStateListener.LISTEN_SERVICE_STATE 188 | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS 189 | PhoneStateListener.LISTEN_CALL_STATE 190 | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE 191 | PhoneStateListener.LISTEN_DATA_ACTIVITY); 192 mHspaDataDistinguishable = mContext.getResources().getBoolean( 193 R.bool.config_hspa_data_distinguishable); 194 mNetworkNameSeparator = mContext.getString(R.string.status_bar_network_name_separator); 195 mNetworkNameDefault = mContext.getString( 196 com.android.internal.R.string.lockscreen_carrier_default); 197 mNetworkName = mNetworkNameDefault; 198 199 // wifi 200 mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 201 Handler handler = new WifiHandler(); 202 mWifiChannel = new AsyncChannel(); 203 Messenger wifiMessenger = mWifiManager.getMessenger(); 204 if (wifiMessenger != null) { 205 mWifiChannel.connect(mContext, handler, wifiMessenger); 206 } 207 208 // broadcasts 209 IntentFilter filter = new IntentFilter(); 210 filter.addAction(WifiManager.RSSI_CHANGED_ACTION); 211 filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); 212 filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 213 filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); 214 filter.addAction(Telephony.Intents.SPN_STRINGS_UPDATED_ACTION); 215 filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); 216 filter.addAction(ConnectivityManager.INET_CONDITION_ACTION); 217 filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); 218 filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); 219 mWimaxSupported = mContext.getResources().getBoolean( 220 com.android.internal.R.bool.config_wimaxEnabled); 221 if(mWimaxSupported) { 222 filter.addAction(WimaxManagerConstants.WIMAX_NETWORK_STATE_CHANGED_ACTION); 223 filter.addAction(WimaxManagerConstants.SIGNAL_LEVEL_CHANGED_ACTION); 224 filter.addAction(WimaxManagerConstants.NET_4G_STATE_CHANGED_ACTION); 225 } 226 context.registerReceiver(this, filter); 227 228 // AIRPLANE_MODE_CHANGED is sent at boot; we've probably already missed it 229 updateAirplaneMode(); 230 231 // yuck 232 mBatteryStats = BatteryStatsService.getService(); 233 } 234 235 public void addPhoneSignalIconView(ImageView v) { 236 mPhoneSignalIconViews.add(v); 237 } 238 239 public void addDataDirectionIconView(ImageView v) { 240 mDataDirectionIconViews.add(v); 241 } 242 243 public void addDataDirectionOverlayIconView(ImageView v) { 244 mDataDirectionOverlayIconViews.add(v); 245 } 246 247 public void addWifiIconView(ImageView v) { 248 mWifiIconViews.add(v); 249 } 250 public void addWimaxIconView(ImageView v) { 251 mWimaxIconViews.add(v); 252 } 253 254 public void addCombinedSignalIconView(ImageView v) { 255 mCombinedSignalIconViews.add(v); 256 } 257 258 public void addDataTypeIconView(ImageView v) { 259 mDataTypeIconViews.add(v); 260 } 261 262 public void addCombinedLabelView(TextView v) { 263 mCombinedLabelViews.add(v); 264 } 265 266 public void addMobileLabelView(TextView v) { 267 mMobileLabelViews.add(v); 268 } 269 270 public void addWifiLabelView(TextView v) { 271 mWifiLabelViews.add(v); 272 } 273 274 public void addSignalCluster(SignalCluster cluster) { 275 mSignalClusters.add(cluster); 276 refreshSignalCluster(cluster); 277 } 278 279 public void refreshSignalCluster(SignalCluster cluster) { 280 cluster.setWifiIndicators( 281 mWifiConnected, // only show wifi in the cluster if connected 282 mWifiIconId, 283 mWifiActivityIconId, 284 mContentDescriptionWifi); 285 286 if (mIsWimaxEnabled && mWimaxConnected) { 287 // wimax is special 288 cluster.setMobileDataIndicators( 289 true, 290 mWimaxIconId, 291 mMobileActivityIconId, 292 mDataTypeIconId, 293 mContentDescriptionWimax, 294 mContentDescriptionDataType); 295 } else { 296 // normal mobile data 297 cluster.setMobileDataIndicators( 298 mHasMobileDataFeature, 299 mShowPhoneRSSIForData ? mPhoneSignalIconId : mDataSignalIconId, 300 mMobileActivityIconId, 301 mDataTypeIconId, 302 mContentDescriptionPhoneSignal, 303 mContentDescriptionDataType); 304 } 305 cluster.setIsAirplaneMode(mAirplaneMode); 306 } 307 308 public void setStackedMode(boolean stacked) { 309 mDataAndWifiStacked = true; 310 } 311 312 @Override 313 public void onReceive(Context context, Intent intent) { 314 final String action = intent.getAction(); 315 if (action.equals(WifiManager.RSSI_CHANGED_ACTION) 316 || action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION) 317 || action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { 318 updateWifiState(intent); 319 refreshViews(); 320 } else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) { 321 updateSimState(intent); 322 updateDataIcon(); 323 refreshViews(); 324 } else if (action.equals(Telephony.Intents.SPN_STRINGS_UPDATED_ACTION)) { 325 updateNetworkName(intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_SPN, false), 326 intent.getStringExtra(Telephony.Intents.EXTRA_SPN), 327 intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_PLMN, false), 328 intent.getStringExtra(Telephony.Intents.EXTRA_PLMN)); 329 refreshViews(); 330 } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION) || 331 action.equals(ConnectivityManager.INET_CONDITION_ACTION)) { 332 updateConnectivity(intent); 333 refreshViews(); 334 } else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) { 335 refreshViews(); 336 } else if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) { 337 updateAirplaneMode(); 338 refreshViews(); 339 } else if (action.equals(WimaxManagerConstants.NET_4G_STATE_CHANGED_ACTION) || 340 action.equals(WimaxManagerConstants.SIGNAL_LEVEL_CHANGED_ACTION) || 341 action.equals(WimaxManagerConstants.WIMAX_NETWORK_STATE_CHANGED_ACTION)) { 342 updateWimaxState(intent); 343 refreshViews(); 344 } 345 } 346 347 348 // ===== Telephony ============================================================== 349 350 PhoneStateListener mPhoneStateListener = new PhoneStateListener() { 351 @Override 352 public void onSignalStrengthsChanged(SignalStrength signalStrength) { 353 if (DEBUG) { 354 Slog.d(TAG, "onSignalStrengthsChanged signalStrength=" + signalStrength + 355 ((signalStrength == null) ? "" : (" level=" + signalStrength.getLevel()))); 356 } 357 mSignalStrength = signalStrength; 358 updateTelephonySignalStrength(); 359 refreshViews(); 360 } 361 362 @Override 363 public void onServiceStateChanged(ServiceState state) { 364 if (DEBUG) { 365 Slog.d(TAG, "onServiceStateChanged state=" + state.getState()); 366 } 367 mServiceState = state; 368 updateTelephonySignalStrength(); 369 updateDataNetType(); 370 updateDataIcon(); 371 refreshViews(); 372 } 373 374 @Override 375 public void onCallStateChanged(int state, String incomingNumber) { 376 if (DEBUG) { 377 Slog.d(TAG, "onCallStateChanged state=" + state); 378 } 379 // In cdma, if a voice call is made, RSSI should switch to 1x. 380 if (isCdma()) { 381 updateTelephonySignalStrength(); 382 refreshViews(); 383 } 384 } 385 386 @Override 387 public void onDataConnectionStateChanged(int state, int networkType) { 388 if (DEBUG) { 389 Slog.d(TAG, "onDataConnectionStateChanged: state=" + state 390 + " type=" + networkType); 391 } 392 mDataState = state; 393 mDataNetType = networkType; 394 updateDataNetType(); 395 updateDataIcon(); 396 refreshViews(); 397 } 398 399 @Override 400 public void onDataActivity(int direction) { 401 if (DEBUG) { 402 Slog.d(TAG, "onDataActivity: direction=" + direction); 403 } 404 mDataActivity = direction; 405 updateDataIcon(); 406 refreshViews(); 407 } 408 }; 409 410 private final void updateSimState(Intent intent) { 411 String stateExtra = intent.getStringExtra(IccCard.INTENT_KEY_ICC_STATE); 412 if (IccCard.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)) { 413 mSimState = IccCard.State.ABSENT; 414 } 415 else if (IccCard.INTENT_VALUE_ICC_READY.equals(stateExtra)) { 416 mSimState = IccCard.State.READY; 417 } 418 else if (IccCard.INTENT_VALUE_ICC_LOCKED.equals(stateExtra)) { 419 final String lockedReason = intent.getStringExtra(IccCard.INTENT_KEY_LOCKED_REASON); 420 if (IccCard.INTENT_VALUE_LOCKED_ON_PIN.equals(lockedReason)) { 421 mSimState = IccCard.State.PIN_REQUIRED; 422 } 423 else if (IccCard.INTENT_VALUE_LOCKED_ON_PUK.equals(lockedReason)) { 424 mSimState = IccCard.State.PUK_REQUIRED; 425 } 426 else { 427 mSimState = IccCard.State.NETWORK_LOCKED; 428 } 429 } else { 430 mSimState = IccCard.State.UNKNOWN; 431 } 432 } 433 434 private boolean isCdma() { 435 return (mSignalStrength != null) && !mSignalStrength.isGsm(); 436 } 437 438 private boolean hasService() { 439 if (mServiceState != null) { 440 switch (mServiceState.getState()) { 441 case ServiceState.STATE_OUT_OF_SERVICE: 442 case ServiceState.STATE_POWER_OFF: 443 return false; 444 default: 445 return true; 446 } 447 } else { 448 return false; 449 } 450 } 451 452 private void updateAirplaneMode() { 453 mAirplaneMode = (Settings.System.getInt(mContext.getContentResolver(), 454 Settings.System.AIRPLANE_MODE_ON, 0) == 1); 455 } 456 457 private final void updateTelephonySignalStrength() { 458 if (!hasService()) { 459 if (CHATTY) Slog.d(TAG, "updateTelephonySignalStrength: !hasService()"); 460 mPhoneSignalIconId = R.drawable.stat_sys_signal_0; 461 mDataSignalIconId = R.drawable.stat_sys_signal_0; 462 } else { 463 if (mSignalStrength == null) { 464 if (CHATTY) Slog.d(TAG, "updateTelephonySignalStrength: mSignalStrength == null"); 465 mPhoneSignalIconId = R.drawable.stat_sys_signal_0; 466 mDataSignalIconId = R.drawable.stat_sys_signal_0; 467 mContentDescriptionPhoneSignal = mContext.getString( 468 AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0]); 469 } else { 470 int iconLevel; 471 int[] iconList; 472 mLastSignalLevel = iconLevel = mSignalStrength.getLevel(); 473 if (isCdma()) { 474 if (isCdmaEri()) { 475 iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[mInetCondition]; 476 } else { 477 iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[mInetCondition]; 478 } 479 } else { 480 // Though mPhone is a Manager, this call is not an IPC 481 if (mPhone.isNetworkRoaming()) { 482 iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[mInetCondition]; 483 } else { 484 iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[mInetCondition]; 485 } 486 } 487 mPhoneSignalIconId = iconList[iconLevel]; 488 mContentDescriptionPhoneSignal = mContext.getString( 489 AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[iconLevel]); 490 491 mDataSignalIconId = TelephonyIcons.DATA_SIGNAL_STRENGTH[mInetCondition][iconLevel]; 492 } 493 } 494 } 495 496 private final void updateDataNetType() { 497 if (mIsWimaxEnabled && mWimaxConnected) { 498 // wimax is a special 4g network not handled by telephony 499 mDataIconList = TelephonyIcons.DATA_4G[mInetCondition]; 500 mDataTypeIconId = R.drawable.stat_sys_data_connected_4g; 501 mContentDescriptionDataType = mContext.getString( 502 R.string.accessibility_data_connection_4g); 503 } else { 504 switch (mDataNetType) { 505 case TelephonyManager.NETWORK_TYPE_UNKNOWN: 506 if (!mShowAtLeastThreeGees) { 507 mDataIconList = TelephonyIcons.DATA_G[mInetCondition]; 508 mDataTypeIconId = 0; 509 mContentDescriptionDataType = mContext.getString( 510 R.string.accessibility_data_connection_gprs); 511 break; 512 } else { 513 // fall through 514 } 515 case TelephonyManager.NETWORK_TYPE_EDGE: 516 if (!mShowAtLeastThreeGees) { 517 mDataIconList = TelephonyIcons.DATA_E[mInetCondition]; 518 mDataTypeIconId = R.drawable.stat_sys_data_connected_e; 519 mContentDescriptionDataType = mContext.getString( 520 R.string.accessibility_data_connection_edge); 521 break; 522 } else { 523 // fall through 524 } 525 case TelephonyManager.NETWORK_TYPE_UMTS: 526 mDataIconList = TelephonyIcons.DATA_3G[mInetCondition]; 527 mDataTypeIconId = R.drawable.stat_sys_data_connected_3g; 528 mContentDescriptionDataType = mContext.getString( 529 R.string.accessibility_data_connection_3g); 530 break; 531 case TelephonyManager.NETWORK_TYPE_HSDPA: 532 case TelephonyManager.NETWORK_TYPE_HSUPA: 533 case TelephonyManager.NETWORK_TYPE_HSPA: 534 case TelephonyManager.NETWORK_TYPE_HSPAP: 535 if (mHspaDataDistinguishable) { 536 mDataIconList = TelephonyIcons.DATA_H[mInetCondition]; 537 mDataTypeIconId = R.drawable.stat_sys_data_connected_h; 538 mContentDescriptionDataType = mContext.getString( 539 R.string.accessibility_data_connection_3_5g); 540 } else { 541 mDataIconList = TelephonyIcons.DATA_3G[mInetCondition]; 542 mDataTypeIconId = R.drawable.stat_sys_data_connected_3g; 543 mContentDescriptionDataType = mContext.getString( 544 R.string.accessibility_data_connection_3g); 545 } 546 break; 547 case TelephonyManager.NETWORK_TYPE_CDMA: 548 // display 1xRTT for IS95A/B 549 mDataIconList = TelephonyIcons.DATA_1X[mInetCondition]; 550 mDataTypeIconId = R.drawable.stat_sys_data_connected_1x; 551 mContentDescriptionDataType = mContext.getString( 552 R.string.accessibility_data_connection_cdma); 553 break; 554 case TelephonyManager.NETWORK_TYPE_1xRTT: 555 mDataIconList = TelephonyIcons.DATA_1X[mInetCondition]; 556 mDataTypeIconId = R.drawable.stat_sys_data_connected_1x; 557 mContentDescriptionDataType = mContext.getString( 558 R.string.accessibility_data_connection_cdma); 559 break; 560 case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through 561 case TelephonyManager.NETWORK_TYPE_EVDO_A: 562 case TelephonyManager.NETWORK_TYPE_EVDO_B: 563 case TelephonyManager.NETWORK_TYPE_EHRPD: 564 mDataIconList = TelephonyIcons.DATA_3G[mInetCondition]; 565 mDataTypeIconId = R.drawable.stat_sys_data_connected_3g; 566 mContentDescriptionDataType = mContext.getString( 567 R.string.accessibility_data_connection_3g); 568 break; 569 case TelephonyManager.NETWORK_TYPE_LTE: 570 mDataIconList = TelephonyIcons.DATA_4G[mInetCondition]; 571 mDataTypeIconId = R.drawable.stat_sys_data_connected_4g; 572 mContentDescriptionDataType = mContext.getString( 573 R.string.accessibility_data_connection_4g); 574 break; 575 default: 576 if (!mShowAtLeastThreeGees) { 577 mDataIconList = TelephonyIcons.DATA_G[mInetCondition]; 578 mDataTypeIconId = R.drawable.stat_sys_data_connected_g; 579 mContentDescriptionDataType = mContext.getString( 580 R.string.accessibility_data_connection_gprs); 581 } else { 582 mDataIconList = TelephonyIcons.DATA_3G[mInetCondition]; 583 mDataTypeIconId = R.drawable.stat_sys_data_connected_3g; 584 mContentDescriptionDataType = mContext.getString( 585 R.string.accessibility_data_connection_3g); 586 } 587 break; 588 } 589 } 590 591 if ((isCdma() && isCdmaEri()) || mPhone.isNetworkRoaming()) { 592 mDataTypeIconId = R.drawable.stat_sys_data_connected_roam; 593 } 594 } 595 596 boolean isCdmaEri() { 597 if (mServiceState != null) { 598 final int iconIndex = mServiceState.getCdmaEriIconIndex(); 599 if (iconIndex != EriInfo.ROAMING_INDICATOR_OFF) { 600 final int iconMode = mServiceState.getCdmaEriIconMode(); 601 if (iconMode == EriInfo.ROAMING_ICON_MODE_NORMAL 602 || iconMode == EriInfo.ROAMING_ICON_MODE_FLASH) { 603 return true; 604 } 605 } 606 } 607 return false; 608 } 609 610 private final void updateDataIcon() { 611 int iconId; 612 boolean visible = true; 613 614 if (!isCdma()) { 615 // GSM case, we have to check also the sim state 616 if (mSimState == IccCard.State.READY || mSimState == IccCard.State.UNKNOWN) { 617 if (hasService() && mDataState == TelephonyManager.DATA_CONNECTED) { 618 switch (mDataActivity) { 619 case TelephonyManager.DATA_ACTIVITY_IN: 620 iconId = mDataIconList[1]; 621 break; 622 case TelephonyManager.DATA_ACTIVITY_OUT: 623 iconId = mDataIconList[2]; 624 break; 625 case TelephonyManager.DATA_ACTIVITY_INOUT: 626 iconId = mDataIconList[3]; 627 break; 628 default: 629 iconId = mDataIconList[0]; 630 break; 631 } 632 mDataDirectionIconId = iconId; 633 } else { 634 iconId = 0; 635 visible = false; 636 } 637 } else { 638 iconId = R.drawable.stat_sys_no_sim; 639 visible = false; // no SIM? no data 640 } 641 } else { 642 // CDMA case, mDataActivity can be also DATA_ACTIVITY_DORMANT 643 if (hasService() && mDataState == TelephonyManager.DATA_CONNECTED) { 644 switch (mDataActivity) { 645 case TelephonyManager.DATA_ACTIVITY_IN: 646 iconId = mDataIconList[1]; 647 break; 648 case TelephonyManager.DATA_ACTIVITY_OUT: 649 iconId = mDataIconList[2]; 650 break; 651 case TelephonyManager.DATA_ACTIVITY_INOUT: 652 iconId = mDataIconList[3]; 653 break; 654 case TelephonyManager.DATA_ACTIVITY_DORMANT: 655 default: 656 iconId = mDataIconList[0]; 657 break; 658 } 659 } else { 660 iconId = 0; 661 visible = false; 662 } 663 } 664 665 // yuck - this should NOT be done by the status bar 666 long ident = Binder.clearCallingIdentity(); 667 try { 668 mBatteryStats.notePhoneDataConnectionState(mPhone.getNetworkType(), visible); 669 } catch (RemoteException e) { 670 } finally { 671 Binder.restoreCallingIdentity(ident); 672 } 673 674 mDataDirectionIconId = iconId; 675 mDataConnected = visible; 676 } 677 678 void updateNetworkName(boolean showSpn, String spn, boolean showPlmn, String plmn) { 679 if (false) { 680 Slog.d("CarrierLabel", "updateNetworkName showSpn=" + showSpn + " spn=" + spn 681 + " showPlmn=" + showPlmn + " plmn=" + plmn); 682 } 683 StringBuilder str = new StringBuilder(); 684 boolean something = false; 685 if (showPlmn && plmn != null) { 686 str.append(plmn); 687 something = true; 688 } 689 if (showSpn && spn != null) { 690 if (something) { 691 str.append(mNetworkNameSeparator); 692 } 693 str.append(spn); 694 something = true; 695 } 696 if (something) { 697 mNetworkName = str.toString(); 698 } else { 699 mNetworkName = mNetworkNameDefault; 700 } 701 } 702 703 // ===== Wifi =================================================================== 704 705 class WifiHandler extends Handler { 706 @Override 707 public void handleMessage(Message msg) { 708 switch (msg.what) { 709 case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 710 if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { 711 mWifiChannel.sendMessage(Message.obtain(this, 712 AsyncChannel.CMD_CHANNEL_FULL_CONNECTION)); 713 } else { 714 Slog.e(TAG, "Failed to connect to wifi"); 715 } 716 break; 717 case WifiManager.DATA_ACTIVITY_NOTIFICATION: 718 if (msg.arg1 != mWifiActivity) { 719 mWifiActivity = msg.arg1; 720 refreshViews(); 721 } 722 break; 723 default: 724 //Ignore 725 break; 726 } 727 } 728 } 729 730 private void updateWifiState(Intent intent) { 731 final String action = intent.getAction(); 732 if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) { 733 mWifiEnabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 734 WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED; 735 736 } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { 737 final NetworkInfo networkInfo = (NetworkInfo) 738 intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 739 boolean wasConnected = mWifiConnected; 740 mWifiConnected = networkInfo != null && networkInfo.isConnected(); 741 // If we just connected, grab the inintial signal strength and ssid 742 if (mWifiConnected && !wasConnected) { 743 // try getting it out of the intent first 744 WifiInfo info = (WifiInfo) intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO); 745 if (info == null) { 746 info = mWifiManager.getConnectionInfo(); 747 } 748 if (info != null) { 749 mWifiSsid = huntForSsid(info); 750 } else { 751 mWifiSsid = null; 752 } 753 } else if (!mWifiConnected) { 754 mWifiSsid = null; 755 } 756 // Apparently the wifi level is not stable at this point even if we've just connected to 757 // the network; we need to wait for an RSSI_CHANGED_ACTION for that. So let's just set 758 // it to 0 for now 759 mWifiLevel = 0; 760 mWifiRssi = -200; 761 } else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) { 762 if (mWifiConnected) { 763 mWifiRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200); 764 mWifiLevel = WifiManager.calculateSignalLevel( 765 mWifiRssi, WifiIcons.WIFI_LEVEL_COUNT); 766 } 767 } 768 769 updateWifiIcons(); 770 } 771 772 private void updateWifiIcons() { 773 if (mWifiConnected) { 774 mWifiIconId = WifiIcons.WIFI_SIGNAL_STRENGTH[mInetCondition][mWifiLevel]; 775 mContentDescriptionWifi = mContext.getString( 776 AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH[mWifiLevel]); 777 } else { 778 if (mDataAndWifiStacked) { 779 mWifiIconId = 0; 780 } else { 781 mWifiIconId = mWifiEnabled ? WifiIcons.WIFI_SIGNAL_STRENGTH[0][0] : 0; 782 } 783 mContentDescriptionWifi = mContext.getString(R.string.accessibility_no_wifi); 784 } 785 } 786 787 private String huntForSsid(WifiInfo info) { 788 String ssid = info.getSSID(); 789 if (ssid != null) { 790 return ssid; 791 } 792 // OK, it's not in the connectionInfo; we have to go hunting for it 793 List<WifiConfiguration> networks = mWifiManager.getConfiguredNetworks(); 794 for (WifiConfiguration net : networks) { 795 if (net.networkId == info.getNetworkId()) { 796 return net.SSID; 797 } 798 } 799 return null; 800 } 801 802 803 // ===== Wimax =================================================================== 804 private final void updateWimaxState(Intent intent) { 805 final String action = intent.getAction(); 806 boolean wasConnected = mWimaxConnected; 807 if (action.equals(WimaxManagerConstants.NET_4G_STATE_CHANGED_ACTION)) { 808 int wimaxStatus = intent.getIntExtra(WimaxManagerConstants.EXTRA_4G_STATE, 809 WimaxManagerConstants.NET_4G_STATE_UNKNOWN); 810 mIsWimaxEnabled = (wimaxStatus == 811 WimaxManagerConstants.NET_4G_STATE_ENABLED); 812 } else if (action.equals(WimaxManagerConstants.SIGNAL_LEVEL_CHANGED_ACTION)) { 813 mWimaxSignal = intent.getIntExtra(WimaxManagerConstants.EXTRA_NEW_SIGNAL_LEVEL, 0); 814 } else if (action.equals(WimaxManagerConstants.WIMAX_NETWORK_STATE_CHANGED_ACTION)) { 815 mWimaxState = intent.getIntExtra(WimaxManagerConstants.EXTRA_WIMAX_STATE, 816 WimaxManagerConstants.NET_4G_STATE_UNKNOWN); 817 mWimaxExtraState = intent.getIntExtra( 818 WimaxManagerConstants.EXTRA_WIMAX_STATE_DETAIL, 819 WimaxManagerConstants.NET_4G_STATE_UNKNOWN); 820 mWimaxConnected = (mWimaxState == 821 WimaxManagerConstants.WIMAX_STATE_CONNECTED); 822 mWimaxIdle = (mWimaxExtraState == WimaxManagerConstants.WIMAX_IDLE); 823 } 824 updateDataNetType(); 825 updateWimaxIcons(); 826 } 827 828 private void updateWimaxIcons() { 829 if (mIsWimaxEnabled) { 830 if (mWimaxConnected) { 831 if (mWimaxIdle) 832 mWimaxIconId = WimaxIcons.WIMAX_IDLE; 833 else 834 mWimaxIconId = WimaxIcons.WIMAX_SIGNAL_STRENGTH[mInetCondition][mWimaxSignal]; 835 mContentDescriptionWimax = mContext.getString( 836 AccessibilityContentDescriptions.WIMAX_CONNECTION_STRENGTH[mWimaxSignal]); 837 } else { 838 mWimaxIconId = WimaxIcons.WIMAX_DISCONNECTED; 839 mContentDescriptionWimax = mContext.getString(R.string.accessibility_no_wimax); 840 } 841 } else { 842 mWimaxIconId = 0; 843 } 844 } 845 846 // ===== Full or limited Internet connectivity ================================== 847 848 private void updateConnectivity(Intent intent) { 849 if (CHATTY) { 850 Slog.d(TAG, "updateConnectivity: intent=" + intent); 851 } 852 853 NetworkInfo info = (NetworkInfo)(intent.getParcelableExtra( 854 ConnectivityManager.EXTRA_NETWORK_INFO)); 855 int connectionStatus = intent.getIntExtra(ConnectivityManager.EXTRA_INET_CONDITION, 0); 856 857 if (CHATTY) { 858 Slog.d(TAG, "updateConnectivity: networkInfo=" + info); 859 Slog.d(TAG, "updateConnectivity: connectionStatus=" + connectionStatus); 860 } 861 862 mInetCondition = (connectionStatus > INET_CONDITION_THRESHOLD ? 1 : 0); 863 864 if (info != null && info.getType() == ConnectivityManager.TYPE_BLUETOOTH) { 865 mBluetoothTethered = info.isConnected(); 866 } else { 867 mBluetoothTethered = false; 868 } 869 870 // We want to update all the icons, all at once, for any condition change 871 updateDataNetType(); 872 updateWimaxIcons(); 873 updateDataIcon(); 874 updateTelephonySignalStrength(); 875 updateWifiIcons(); 876 } 877 878 879 // ===== Update the views ======================================================= 880 881 void refreshViews() { 882 Context context = mContext; 883 884 int combinedSignalIconId = 0; 885 int combinedActivityIconId = 0; 886 String combinedLabel = ""; 887 String wifiLabel = ""; 888 String mobileLabel = ""; 889 int N; 890 891 if (mDataConnected) { 892 mobileLabel = mNetworkName; 893 if (DEBUG) { 894 mobileLabel += "yyyyYYYYyyyyYYYY"; 895 } 896 combinedSignalIconId = mDataSignalIconId; 897 switch (mDataActivity) { 898 case TelephonyManager.DATA_ACTIVITY_IN: 899 mMobileActivityIconId = R.drawable.stat_sys_signal_in; 900 break; 901 case TelephonyManager.DATA_ACTIVITY_OUT: 902 mMobileActivityIconId = R.drawable.stat_sys_signal_out; 903 break; 904 case TelephonyManager.DATA_ACTIVITY_INOUT: 905 mMobileActivityIconId = R.drawable.stat_sys_signal_inout; 906 break; 907 default: 908 mMobileActivityIconId = 0; 909 break; 910 } 911 912 combinedLabel = mobileLabel; 913 combinedActivityIconId = mMobileActivityIconId; 914 combinedSignalIconId = mDataSignalIconId; // set by updateDataIcon() 915 mContentDescriptionCombinedSignal = mContentDescriptionDataType; 916 } else { 917 mobileLabel = mHasMobileDataFeature ? 918 context.getString(R.string.status_bar_settings_signal_meter_disconnected) : ""; 919 } 920 921 if (mWifiConnected) { 922 if (mWifiSsid == null) { 923 wifiLabel = context.getString(R.string.status_bar_settings_signal_meter_wifi_nossid); 924 mWifiActivityIconId = 0; // no wifis, no bits 925 } else { 926 wifiLabel = mWifiSsid; 927 if (DEBUG) { 928 wifiLabel += "xxxxXXXXxxxxXXXX"; 929 } 930 switch (mWifiActivity) { 931 case WifiManager.DATA_ACTIVITY_IN: 932 mWifiActivityIconId = R.drawable.stat_sys_wifi_in; 933 break; 934 case WifiManager.DATA_ACTIVITY_OUT: 935 mWifiActivityIconId = R.drawable.stat_sys_wifi_out; 936 break; 937 case WifiManager.DATA_ACTIVITY_INOUT: 938 mWifiActivityIconId = R.drawable.stat_sys_wifi_inout; 939 break; 940 case WifiManager.DATA_ACTIVITY_NONE: 941 mWifiActivityIconId = 0; 942 break; 943 } 944 } 945 946 combinedActivityIconId = mWifiActivityIconId; 947 combinedLabel = wifiLabel; 948 combinedSignalIconId = mWifiIconId; // set by updateWifiIcons() 949 mContentDescriptionCombinedSignal = mContentDescriptionWifi; 950 } 951 952 if (mBluetoothTethered) { 953 combinedLabel = mContext.getString(R.string.bluetooth_tethered); 954 combinedSignalIconId = mBluetoothTetherIconId; 955 mContentDescriptionCombinedSignal = mContext.getString( 956 R.string.accessibility_bluetooth_tether); 957 } 958 959 if (mAirplaneMode && 960 (mServiceState == null || (!hasService() && !mServiceState.isEmergencyOnly()))) { 961 // Only display the flight-mode icon if not in "emergency calls only" mode. 962 963 // look again; your radios are now airplanes 964 mContentDescriptionPhoneSignal = mContext.getString( 965 R.string.accessibility_airplane_mode); 966 mPhoneSignalIconId = mDataSignalIconId = R.drawable.stat_sys_signal_flightmode; 967 mDataTypeIconId = 0; 968 969 // combined values from connected wifi take precedence over airplane mode 970 if (!mWifiConnected) { 971 wifiLabel = context.getString(R.string.status_bar_settings_signal_meter_disconnected); 972 combinedLabel = wifiLabel; 973 mContentDescriptionCombinedSignal = mContentDescriptionPhoneSignal; 974 combinedSignalIconId = mDataSignalIconId; 975 } 976 } 977 else if (!mDataConnected && !mWifiConnected && !mBluetoothTethered && !mWimaxConnected) { 978 // pretty much totally disconnected 979 980 combinedLabel = context.getString(R.string.status_bar_settings_signal_meter_disconnected); 981 // On devices without mobile radios, we want to show the wifi icon 982 combinedSignalIconId = 983 mHasMobileDataFeature ? mDataSignalIconId : mWifiIconId; 984 mContentDescriptionCombinedSignal = mHasMobileDataFeature 985 ? mContentDescriptionDataType : mContentDescriptionWifi; 986 987 if ((isCdma() && isCdmaEri()) || mPhone.isNetworkRoaming()) { 988 mDataTypeIconId = R.drawable.stat_sys_data_connected_roam; 989 } else { 990 mDataTypeIconId = 0; 991 } 992 } 993 994 if (DEBUG) { 995 Slog.d(TAG, "refreshViews connected={" 996 + (mWifiConnected?" wifi":"") 997 + (mDataConnected?" data":"") 998 + " } level=" 999 + ((mSignalStrength == null)?"??":Integer.toString(mSignalStrength.getLevel())) 1000 + " combinedSignalIconId=0x" 1001 + Integer.toHexString(combinedSignalIconId) 1002 + "/" + getResourceName(combinedSignalIconId) 1003 + " combinedActivityIconId=0x" + Integer.toHexString(combinedActivityIconId) 1004 + " mAirplaneMode=" + mAirplaneMode 1005 + " mDataActivity=" + mDataActivity 1006 + " mPhoneSignalIconId=0x" + Integer.toHexString(mPhoneSignalIconId) 1007 + " mDataDirectionIconId=0x" + Integer.toHexString(mDataDirectionIconId) 1008 + " mDataSignalIconId=0x" + Integer.toHexString(mDataSignalIconId) 1009 + " mDataTypeIconId=0x" + Integer.toHexString(mDataTypeIconId) 1010 + " mWifiIconId=0x" + Integer.toHexString(mWifiIconId) 1011 + " mBluetoothTetherIconId=0x" + Integer.toHexString(mBluetoothTetherIconId)); 1012 } 1013 1014 if (mLastPhoneSignalIconId != mPhoneSignalIconId 1015 || mLastDataDirectionOverlayIconId != combinedActivityIconId 1016 || mLastWifiIconId != mWifiIconId 1017 || mLastWimaxIconId != mWimaxIconId 1018 || mLastDataTypeIconId != mDataTypeIconId) 1019 { 1020 // NB: the mLast*s will be updated later 1021 for (SignalCluster cluster : mSignalClusters) { 1022 refreshSignalCluster(cluster); 1023 } 1024 } 1025 1026 // the phone icon on phones 1027 if (mLastPhoneSignalIconId != mPhoneSignalIconId) { 1028 mLastPhoneSignalIconId = mPhoneSignalIconId; 1029 N = mPhoneSignalIconViews.size(); 1030 for (int i=0; i<N; i++) { 1031 final ImageView v = mPhoneSignalIconViews.get(i); 1032 v.setImageResource(mPhoneSignalIconId); 1033 v.setContentDescription(mContentDescriptionPhoneSignal); 1034 } 1035 } 1036 1037 // the data icon on phones 1038 if (mLastDataDirectionIconId != mDataDirectionIconId) { 1039 mLastDataDirectionIconId = mDataDirectionIconId; 1040 N = mDataDirectionIconViews.size(); 1041 for (int i=0; i<N; i++) { 1042 final ImageView v = mDataDirectionIconViews.get(i); 1043 v.setImageResource(mDataDirectionIconId); 1044 v.setContentDescription(mContentDescriptionDataType); 1045 } 1046 } 1047 1048 // the wifi icon on phones 1049 if (mLastWifiIconId != mWifiIconId) { 1050 mLastWifiIconId = mWifiIconId; 1051 N = mWifiIconViews.size(); 1052 for (int i=0; i<N; i++) { 1053 final ImageView v = mWifiIconViews.get(i); 1054 if (mWifiIconId == 0) { 1055 v.setVisibility(View.GONE); 1056 } else { 1057 v.setVisibility(View.VISIBLE); 1058 v.setImageResource(mWifiIconId); 1059 v.setContentDescription(mContentDescriptionWifi); 1060 } 1061 } 1062 } 1063 1064 // the wimax icon on phones 1065 if (mLastWimaxIconId != mWimaxIconId) { 1066 mLastWimaxIconId = mWimaxIconId; 1067 N = mWimaxIconViews.size(); 1068 for (int i=0; i<N; i++) { 1069 final ImageView v = mWimaxIconViews.get(i); 1070 if (mWimaxIconId == 0) { 1071 v.setVisibility(View.GONE); 1072 } else { 1073 v.setVisibility(View.VISIBLE); 1074 v.setImageResource(mWimaxIconId); 1075 v.setContentDescription(mContentDescriptionWimax); 1076 } 1077 } 1078 } 1079 // the combined data signal icon 1080 if (mLastCombinedSignalIconId != combinedSignalIconId) { 1081 mLastCombinedSignalIconId = combinedSignalIconId; 1082 N = mCombinedSignalIconViews.size(); 1083 for (int i=0; i<N; i++) { 1084 final ImageView v = mCombinedSignalIconViews.get(i); 1085 v.setImageResource(combinedSignalIconId); 1086 v.setContentDescription(mContentDescriptionCombinedSignal); 1087 } 1088 } 1089 1090 // the data network type overlay 1091 if (mLastDataTypeIconId != mDataTypeIconId) { 1092 mLastDataTypeIconId = mDataTypeIconId; 1093 N = mDataTypeIconViews.size(); 1094 for (int i=0; i<N; i++) { 1095 final ImageView v = mDataTypeIconViews.get(i); 1096 if (mDataTypeIconId == 0) { 1097 v.setVisibility(View.GONE); 1098 } else { 1099 v.setVisibility(View.VISIBLE); 1100 v.setImageResource(mDataTypeIconId); 1101 v.setContentDescription(mContentDescriptionDataType); 1102 } 1103 } 1104 } 1105 1106 // the data direction overlay 1107 if (mLastDataDirectionOverlayIconId != combinedActivityIconId) { 1108 if (DEBUG) { 1109 Slog.d(TAG, "changing data overlay icon id to " + combinedActivityIconId); 1110 } 1111 mLastDataDirectionOverlayIconId = combinedActivityIconId; 1112 N = mDataDirectionOverlayIconViews.size(); 1113 for (int i=0; i<N; i++) { 1114 final ImageView v = mDataDirectionOverlayIconViews.get(i); 1115 if (combinedActivityIconId == 0) { 1116 v.setVisibility(View.GONE); 1117 } else { 1118 v.setVisibility(View.VISIBLE); 1119 v.setImageResource(combinedActivityIconId); 1120 v.setContentDescription(mContentDescriptionDataType); 1121 } 1122 } 1123 } 1124 1125 // the combinedLabel in the notification panel 1126 if (!mLastCombinedLabel.equals(combinedLabel)) { 1127 mLastCombinedLabel = combinedLabel; 1128 N = mCombinedLabelViews.size(); 1129 for (int i=0; i<N; i++) { 1130 TextView v = mCombinedLabelViews.get(i); 1131 v.setText(combinedLabel); 1132 } 1133 } 1134 1135 // wifi label 1136 N = mWifiLabelViews.size(); 1137 for (int i=0; i<N; i++) { 1138 TextView v = mWifiLabelViews.get(i); 1139 v.setText(wifiLabel); 1140 } 1141 1142 // mobile label 1143 N = mMobileLabelViews.size(); 1144 for (int i=0; i<N; i++) { 1145 TextView v = mMobileLabelViews.get(i); 1146 v.setText(mobileLabel); 1147 } 1148 } 1149 1150 public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 1151 pw.println("NetworkController state:"); 1152 pw.println(" - telephony ------"); 1153 pw.print(" hasService()="); 1154 pw.println(hasService()); 1155 pw.print(" mHspaDataDistinguishable="); 1156 pw.println(mHspaDataDistinguishable); 1157 pw.print(" mDataConnected="); 1158 pw.println(mDataConnected); 1159 pw.print(" mSimState="); 1160 pw.println(mSimState); 1161 pw.print(" mPhoneState="); 1162 pw.println(mPhoneState); 1163 pw.print(" mDataState="); 1164 pw.println(mDataState); 1165 pw.print(" mDataActivity="); 1166 pw.println(mDataActivity); 1167 pw.print(" mDataNetType="); 1168 pw.print(mDataNetType); 1169 pw.print("/"); 1170 pw.println(TelephonyManager.getNetworkTypeName(mDataNetType)); 1171 pw.print(" mServiceState="); 1172 pw.println(mServiceState); 1173 pw.print(" mSignalStrength="); 1174 pw.println(mSignalStrength); 1175 pw.print(" mLastSignalLevel="); 1176 pw.println(mLastSignalLevel); 1177 pw.print(" mNetworkName="); 1178 pw.println(mNetworkName); 1179 pw.print(" mNetworkNameDefault="); 1180 pw.println(mNetworkNameDefault); 1181 pw.print(" mNetworkNameSeparator="); 1182 pw.println(mNetworkNameSeparator.replace("\n","\\n")); 1183 pw.print(" mPhoneSignalIconId=0x"); 1184 pw.print(Integer.toHexString(mPhoneSignalIconId)); 1185 pw.print("/"); 1186 pw.println(getResourceName(mPhoneSignalIconId)); 1187 pw.print(" mDataDirectionIconId="); 1188 pw.print(Integer.toHexString(mDataDirectionIconId)); 1189 pw.print("/"); 1190 pw.println(getResourceName(mDataDirectionIconId)); 1191 pw.print(" mDataSignalIconId="); 1192 pw.print(Integer.toHexString(mDataSignalIconId)); 1193 pw.print("/"); 1194 pw.println(getResourceName(mDataSignalIconId)); 1195 pw.print(" mDataTypeIconId="); 1196 pw.print(Integer.toHexString(mDataTypeIconId)); 1197 pw.print("/"); 1198 pw.println(getResourceName(mDataTypeIconId)); 1199 1200 pw.println(" - wifi ------"); 1201 pw.print(" mWifiEnabled="); 1202 pw.println(mWifiEnabled); 1203 pw.print(" mWifiConnected="); 1204 pw.println(mWifiConnected); 1205 pw.print(" mWifiRssi="); 1206 pw.println(mWifiRssi); 1207 pw.print(" mWifiLevel="); 1208 pw.println(mWifiLevel); 1209 pw.print(" mWifiSsid="); 1210 pw.println(mWifiSsid); 1211 pw.println(String.format(" mWifiIconId=0x%08x/%s", 1212 mWifiIconId, getResourceName(mWifiIconId))); 1213 pw.print(" mWifiActivity="); 1214 pw.println(mWifiActivity); 1215 1216 if (mWimaxSupported) { 1217 pw.println(" - wimax ------"); 1218 pw.print(" mIsWimaxEnabled="); pw.println(mIsWimaxEnabled); 1219 pw.print(" mWimaxConnected="); pw.println(mWimaxConnected); 1220 pw.print(" mWimaxIdle="); pw.println(mWimaxIdle); 1221 pw.println(String.format(" mWimaxIconId=0x%08x/%s", 1222 mWimaxIconId, getResourceName(mWimaxIconId))); 1223 pw.println(String.format(" mWimaxSignal=%d", mWimaxSignal)); 1224 pw.println(String.format(" mWimaxState=%d", mWimaxState)); 1225 pw.println(String.format(" mWimaxExtraState=%d", mWimaxExtraState)); 1226 } 1227 1228 pw.println(" - Bluetooth ----"); 1229 pw.print(" mBtReverseTethered="); 1230 pw.println(mBluetoothTethered); 1231 1232 pw.println(" - connectivity ------"); 1233 pw.print(" mInetCondition="); 1234 pw.println(mInetCondition); 1235 1236 pw.println(" - icons ------"); 1237 pw.print(" mLastPhoneSignalIconId=0x"); 1238 pw.print(Integer.toHexString(mLastPhoneSignalIconId)); 1239 pw.print("/"); 1240 pw.println(getResourceName(mLastPhoneSignalIconId)); 1241 pw.print(" mLastDataDirectionIconId=0x"); 1242 pw.print(Integer.toHexString(mLastDataDirectionIconId)); 1243 pw.print("/"); 1244 pw.println(getResourceName(mLastDataDirectionIconId)); 1245 pw.print(" mLastDataDirectionOverlayIconId=0x"); 1246 pw.print(Integer.toHexString(mLastDataDirectionOverlayIconId)); 1247 pw.print("/"); 1248 pw.println(getResourceName(mLastDataDirectionOverlayIconId)); 1249 pw.print(" mLastWifiIconId=0x"); 1250 pw.print(Integer.toHexString(mLastWifiIconId)); 1251 pw.print("/"); 1252 pw.println(getResourceName(mLastWifiIconId)); 1253 pw.print(" mLastCombinedSignalIconId=0x"); 1254 pw.print(Integer.toHexString(mLastCombinedSignalIconId)); 1255 pw.print("/"); 1256 pw.println(getResourceName(mLastCombinedSignalIconId)); 1257 pw.print(" mLastDataTypeIconId=0x"); 1258 pw.print(Integer.toHexString(mLastDataTypeIconId)); 1259 pw.print("/"); 1260 pw.println(getResourceName(mLastDataTypeIconId)); 1261 pw.print(" mLastCombinedLabel="); 1262 pw.print(mLastCombinedLabel); 1263 pw.println(""); 1264 } 1265 1266 private String getResourceName(int resId) { 1267 if (resId != 0) { 1268 final Resources res = mContext.getResources(); 1269 try { 1270 return res.getResourceName(resId); 1271 } catch (android.content.res.Resources.NotFoundException ex) { 1272 return "(unknown)"; 1273 } 1274 } else { 1275 return "(null)"; 1276 } 1277 } 1278 1279} 1280