NetworkControllerImpl.java revision b98f747c714ff8252471ca0a3295c2cb9ccb4f3a
1af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/*
2af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Copyright (C) 2010 The Android Open Source Project
3af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *
4af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Licensed under the Apache License, Version 2.0 (the "License");
5af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * you may not use this file except in compliance with the License.
6af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * You may obtain a copy of the License at
7af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *
8af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *      http://www.apache.org/licenses/LICENSE-2.0
9af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *
10af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Unless required by applicable law or agreed to in writing, software
11af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * distributed under the License is distributed on an "AS IS" BASIS,
12af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * See the License for the specific language governing permissions and
14af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * limitations under the License.
15af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock */
16af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
17af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockpackage com.android.systemui.statusbar.policy;
18af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
19af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.content.BroadcastReceiver;
20af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.content.Context;
21af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.content.Intent;
22af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.content.IntentFilter;
23af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.content.res.Resources;
24af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.net.ConnectivityManager;
25af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.net.NetworkInfo;
26af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.net.wifi.WifiConfiguration;
27af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.net.wifi.WifiInfo;
28af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.net.wifi.WifiManager;
29af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.net.wimax.WimaxManagerConstants;
30af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.os.AsyncTask;
31af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.os.Bundle;
32af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.os.Handler;
33af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.os.Message;
34af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.os.Messenger;
35af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.provider.Settings;
36af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.telephony.PhoneStateListener;
37af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.telephony.ServiceState;
38af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.telephony.SignalStrength;
39af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.telephony.TelephonyManager;
40af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.util.Log;
41af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.view.View;
42af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.widget.TextView;
43af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
44af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.internal.telephony.IccCardConstants;
45af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.internal.telephony.TelephonyIntents;
46af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.internal.telephony.cdma.EriInfo;
47af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.internal.util.AsyncChannel;
48af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.DemoMode;
49af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.R;
5059a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roosimport com.android.systemui.statusbar.phone.StatusBarHeaderView;
51af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
52af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport java.io.FileDescriptor;
53af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport java.io.PrintWriter;
54af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport java.util.ArrayList;
55af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport java.util.List;
56af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport java.util.Locale;
57af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
58af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/** Platform implementation of the network controller. **/
59af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockpublic class NetworkControllerImpl extends BroadcastReceiver
60af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        implements NetworkController, DemoMode {
61af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    // debug
62af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    static final String TAG = "StatusBar.NetworkController";
63af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    static final boolean DEBUG = false;
64af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    static final boolean CHATTY = false; // additional diagnostics, but not logspew
65af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
66af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private static final int FLIGHT_MODE_ICON = R.drawable.stat_sys_signal_flightmode;
67af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
68af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    // telephony
69af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    boolean mHspaDataDistinguishable;
70af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    final TelephonyManager mPhone;
71af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    boolean mDataConnected;
72af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    IccCardConstants.State mSimState = IccCardConstants.State.READY;
73af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mPhoneState = TelephonyManager.CALL_STATE_IDLE;
74af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mDataNetType = TelephonyManager.NETWORK_TYPE_UNKNOWN;
75af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mDataState = TelephonyManager.DATA_DISCONNECTED;
76af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mDataActivity = TelephonyManager.DATA_ACTIVITY_NONE;
77af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    ServiceState mServiceState;
78af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    SignalStrength mSignalStrength;
79af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int[] mDataIconList = TelephonyIcons.DATA_G[0];
80af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    String mNetworkName;
81af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    String mNetworkNameDefault;
82af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    String mNetworkNameSeparator;
83af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mPhoneSignalIconId;
84af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mQSPhoneSignalIconId;
85af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mDataDirectionIconId; // data + data direction on phones
86af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mDataSignalIconId;
87af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mDataTypeIconId;
88af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mQSDataTypeIconId;
89af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mAirplaneIconId;
90af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    boolean mDataActive;
91899f439a29ab1e609e7ba2aea3e9de3afef35c50John Spurlock    boolean mNoSim;
92af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mLastSignalLevel;
93af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    boolean mShowPhoneRSSIForData = false;
94af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    boolean mShowAtLeastThreeGees = false;
95af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    boolean mAlwaysShowCdmaRssi = false;
96af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
97af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    String mContentDescriptionPhoneSignal;
98af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    String mContentDescriptionWifi;
99af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    String mContentDescriptionWimax;
100af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    String mContentDescriptionCombinedSignal;
101af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    String mContentDescriptionDataType;
102af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
103af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    // wifi
104af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    final WifiManager mWifiManager;
105af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    AsyncChannel mWifiChannel;
106af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    boolean mWifiEnabled, mWifiConnected;
107af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mWifiRssi, mWifiLevel;
108af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    String mWifiSsid;
109af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mWifiIconId = 0;
110af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mQSWifiIconId = 0;
111af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mWifiActivity = WifiManager.DATA_ACTIVITY_NONE;
112af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
113af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    // bluetooth
114af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private boolean mBluetoothTethered = false;
115af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private int mBluetoothTetherIconId =
116af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        com.android.internal.R.drawable.stat_sys_tether_bluetooth;
117af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
118af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    //wimax
119af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private boolean mWimaxSupported = false;
120af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private boolean mIsWimaxEnabled = false;
121af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private boolean mWimaxConnected = false;
122af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private boolean mWimaxIdle = false;
123af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private int mWimaxIconId = 0;
124af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private int mWimaxSignal = 0;
125af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private int mWimaxState = 0;
126af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private int mWimaxExtraState = 0;
127af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
128af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    // data connectivity (regardless of state, can we access the internet?)
129af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    // state of inet connection - 0 not connected, 100 connected
130af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private boolean mConnected = false;
131af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private int mConnectedNetworkType = ConnectivityManager.TYPE_NONE;
132af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private String mConnectedNetworkTypeName;
133af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private int mInetCondition = 0;
134af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private int mLastInetCondition = 0;
135af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private static final int INET_CONDITION_THRESHOLD = 50;
136af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
137af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private boolean mAirplaneMode = false;
138af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private boolean mLastAirplaneMode = true;
139af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
140af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private Locale mLocale = null;
141af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private Locale mLastLocale = null;
142af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
143af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    // our ui
144af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    Context mContext;
145af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    ArrayList<TextView> mCombinedLabelViews = new ArrayList<TextView>();
146af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    ArrayList<TextView> mMobileLabelViews = new ArrayList<TextView>();
147af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    ArrayList<TextView> mWifiLabelViews = new ArrayList<TextView>();
14859a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos    ArrayList<StatusBarHeaderView> mEmergencyViews = new ArrayList<>();
149af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    ArrayList<SignalCluster> mSignalClusters = new ArrayList<SignalCluster>();
150af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    ArrayList<NetworkSignalChangedCallback> mSignalsChangedCallbacks =
151af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            new ArrayList<NetworkSignalChangedCallback>();
152af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mLastPhoneSignalIconId = -1;
153af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mLastDataDirectionIconId = -1;
154af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mLastWifiIconId = -1;
155af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mLastWimaxIconId = -1;
156af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mLastCombinedSignalIconId = -1;
157af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    int mLastDataTypeIconId = -1;
158af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    String mLastCombinedLabel = "";
159af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
160af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private boolean mHasMobileDataFeature;
161af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
162af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    boolean mDataAndWifiStacked = false;
163af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
164af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public interface SignalCluster {
165af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        void setWifiIndicators(boolean visible, int strengthIcon, boolean problem,
166af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                String contentDescription);
167af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        void setMobileDataIndicators(boolean visible, int strengthIcon, boolean problem,
168af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                int typeIcon, String contentDescription, String typeContentDescription);
169af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        void setIsAirplaneMode(boolean is, int airplaneIcon);
170af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
171af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1727f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    private final WifiAccessPointController mAccessPoints;
173b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock    private final MobileDataController mMobileDataController;
1747f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
175af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    /**
176af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock     * Construct this controller object and register for updates.
177af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock     */
178af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public NetworkControllerImpl(Context context) {
179af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mContext = context;
180af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        final Resources res = context.getResources();
181af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
182af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(
183af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                Context.CONNECTIVITY_SERVICE);
184af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mHasMobileDataFeature = cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE);
185af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
186af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mShowPhoneRSSIForData = res.getBoolean(R.bool.config_showPhoneRSSIForData);
187af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mShowAtLeastThreeGees = res.getBoolean(R.bool.config_showMin3G);
188af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mAlwaysShowCdmaRssi = res.getBoolean(
189af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                com.android.internal.R.bool.config_alwaysUseCdmaRssi);
190af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
191af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // set up the default wifi icon, used when no radios have ever appeared
192af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        updateWifiIcons();
193af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        updateWimaxIcons();
194af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
195af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // telephony
196af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mPhone = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
197af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mPhone.listen(mPhoneStateListener,
198af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                          PhoneStateListener.LISTEN_SERVICE_STATE
199af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
200af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        | PhoneStateListener.LISTEN_CALL_STATE
201af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
202af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        | PhoneStateListener.LISTEN_DATA_ACTIVITY);
203af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mHspaDataDistinguishable = mContext.getResources().getBoolean(
204af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                R.bool.config_hspa_data_distinguishable);
205af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mNetworkNameSeparator = mContext.getString(R.string.status_bar_network_name_separator);
206af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mNetworkNameDefault = mContext.getString(
207af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                com.android.internal.R.string.lockscreen_carrier_default);
208af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mNetworkName = mNetworkNameDefault;
209af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
210af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // wifi
211af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
212af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        Handler handler = new WifiHandler();
213af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mWifiChannel = new AsyncChannel();
214af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        Messenger wifiMessenger = mWifiManager.getWifiServiceMessenger();
215af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (wifiMessenger != null) {
216af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mWifiChannel.connect(mContext, handler, wifiMessenger);
217af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
218af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
219af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // broadcasts
220af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        IntentFilter filter = new IntentFilter();
221af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
222af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
223af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
224af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
225af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        filter.addAction(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION);
226af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
227af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        filter.addAction(ConnectivityManager.INET_CONDITION_ACTION);
228af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
229af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
230af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mWimaxSupported = mContext.getResources().getBoolean(
231af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                com.android.internal.R.bool.config_wimaxEnabled);
232af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if(mWimaxSupported) {
233af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            filter.addAction(WimaxManagerConstants.WIMAX_NETWORK_STATE_CHANGED_ACTION);
234af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            filter.addAction(WimaxManagerConstants.SIGNAL_LEVEL_CHANGED_ACTION);
235af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            filter.addAction(WimaxManagerConstants.NET_4G_STATE_CHANGED_ACTION);
236af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
237af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        context.registerReceiver(this, filter);
238af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
239af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // AIRPLANE_MODE_CHANGED is sent at boot; we've probably already missed it
240af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        updateAirplaneMode();
241af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
242af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mLastLocale = mContext.getResources().getConfiguration().locale;
2437f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        mAccessPoints = new WifiAccessPointController(mContext);
244b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock        mMobileDataController = new MobileDataController(mContext);
245b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock        mMobileDataController.setCallback(new MobileDataController.Callback() {
246b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock            @Override
247b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock            public void onMobileDataEnabled(boolean enabled) {
248b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock                notifyMobileDataEnabled(enabled);
249b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock            }
250b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock        });
251b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock    }
252b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock
253b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock    private void notifyMobileDataEnabled(boolean enabled) {
254b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock        for (NetworkSignalChangedCallback cb : mSignalsChangedCallbacks) {
255b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock            cb.onMobileDataEnabled(enabled);
256b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock        }
257af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
258af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
259af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public boolean hasMobileDataFeature() {
260af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        return mHasMobileDataFeature;
261af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
262af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
263af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public boolean hasVoiceCallingFeature() {
264af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        return mPhone.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE;
265af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
266af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
267af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public boolean isEmergencyOnly() {
268af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        return (mServiceState != null && mServiceState.isEmergencyOnly());
269af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
270af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
271af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void addCombinedLabelView(TextView v) {
272af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mCombinedLabelViews.add(v);
273af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
274af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
275af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void addMobileLabelView(TextView v) {
276af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mMobileLabelViews.add(v);
277af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
278af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
279af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void addWifiLabelView(TextView v) {
280af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mWifiLabelViews.add(v);
281af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
282af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
28359a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos    public void addEmergencyLabelView(StatusBarHeaderView v) {
28459a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos        mEmergencyViews.add(v);
285af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
286af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
287af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void addSignalCluster(SignalCluster cluster) {
288af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mSignalClusters.add(cluster);
289af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        refreshSignalCluster(cluster);
290af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
291af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
292af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void addNetworkSignalChangedCallback(NetworkSignalChangedCallback cb) {
293af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mSignalsChangedCallbacks.add(cb);
294af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        notifySignalsChangedCallbacks(cb);
295af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
296af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
297af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void removeNetworkSignalChangedCallback(NetworkSignalChangedCallback cb) {
298af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mSignalsChangedCallbacks.remove(cb);
299af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
300af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
301af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
3027f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    public void addAccessPointCallback(AccessPointCallback callback) {
3037f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        mAccessPoints.addCallback(callback);
3047f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    }
3057f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
3067f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    @Override
3077f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    public void removeAccessPointCallback(AccessPointCallback callback) {
3087f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        mAccessPoints.removeCallback(callback);
3097f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    }
3107f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
3117f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    @Override
3127f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    public void scanForAccessPoints() {
3137f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        mAccessPoints.scan();
3147f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    }
3157f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
3167f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    @Override
3177f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    public void connect(AccessPoint ap) {
3187f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        mAccessPoints.connect(ap);
3197f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    }
3207f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
3217f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    @Override
322af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void setWifiEnabled(final boolean enabled) {
323af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        new AsyncTask<Void, Void, Void>() {
324af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            @Override
325af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            protected Void doInBackground(Void... args) {
326af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                // Disable tethering if enabling Wifi
327af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                final int wifiApState = mWifiManager.getWifiApState();
328af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                if (enabled && ((wifiApState == WifiManager.WIFI_AP_STATE_ENABLING) ||
329af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                               (wifiApState == WifiManager.WIFI_AP_STATE_ENABLED))) {
330af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mWifiManager.setWifiApEnabled(null, false);
331af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
332af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
333af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mWifiManager.setWifiEnabled(enabled);
334af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                return null;
335af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
336af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }.execute();
337af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
338af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
339b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock    @Override
340b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock    public DataUsageInfo getDataUsageInfo() {
341b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock        final DataUsageInfo info =  mMobileDataController.getDataUsageInfo();
342b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock        info.carrier = mNetworkName;
343b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock        return info;
344b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock    }
345b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock
346b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock    @Override
347b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock    public boolean isMobileDataSupported() {
348b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock        return mMobileDataController.isMobileDataSupported();
349b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock    }
350b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock
351b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock    @Override
352b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock    public boolean isMobileDataEnabled() {
353b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock        return mMobileDataController.isMobileDataEnabled();
354b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock    }
355b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock
356b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock    @Override
357b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock    public void setMobileDataEnabled(boolean enabled) {
358b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock        mMobileDataController.setMobileDataEnabled(enabled);
359b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock    }
360b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock
361af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void refreshSignalCluster(SignalCluster cluster) {
362af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mDemoMode) return;
363af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        cluster.setWifiIndicators(
364af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                // only show wifi in the cluster if connected or if wifi-only
365af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mWifiEnabled && (mWifiConnected || !mHasMobileDataFeature),
366af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mWifiIconId,
367af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mInetCondition == 0,
368af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mContentDescriptionWifi);
369af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
370af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mIsWimaxEnabled && mWimaxConnected) {
371af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // wimax is special
372af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            cluster.setMobileDataIndicators(
373af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    true,
374af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mAlwaysShowCdmaRssi ? mPhoneSignalIconId : mWimaxIconId,
375af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mInetCondition == 0,
376af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mDataTypeIconId,
377af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mContentDescriptionWimax,
378af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mContentDescriptionDataType);
379af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
380af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // normal mobile data
381af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            cluster.setMobileDataIndicators(
382af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mHasMobileDataFeature,
383af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mShowPhoneRSSIForData ? mPhoneSignalIconId : mDataSignalIconId,
384af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mInetCondition == 0,
385af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mDataTypeIconId,
386af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mContentDescriptionPhoneSignal,
387af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mContentDescriptionDataType);
388af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
389af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        cluster.setIsAirplaneMode(mAirplaneMode, mAirplaneIconId);
390af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
391af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
392af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    void notifySignalsChangedCallbacks(NetworkSignalChangedCallback cb) {
393af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // only show wifi in the cluster if connected or if wifi-only
394af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean wifiEnabled = mWifiEnabled && (mWifiConnected || !mHasMobileDataFeature);
395af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        String wifiDesc = wifiEnabled ?
396af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mWifiSsid : null;
397af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean wifiIn = wifiEnabled && mWifiSsid != null
398af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                && (mWifiActivity == WifiManager.DATA_ACTIVITY_INOUT
399af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                || mWifiActivity == WifiManager.DATA_ACTIVITY_IN);
400af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean wifiOut = wifiEnabled && mWifiSsid != null
401af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                && (mWifiActivity == WifiManager.DATA_ACTIVITY_INOUT
402af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                || mWifiActivity == WifiManager.DATA_ACTIVITY_OUT);
403a9cc0c035dcf6e7954faee18699e50e2d9d7578dJohn Spurlock        cb.onWifiSignalChanged(mWifiEnabled, mQSWifiIconId, wifiIn, wifiOut,
404af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mContentDescriptionWifi, wifiDesc);
405af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
406af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean mobileIn = mDataConnected && (mDataActivity == TelephonyManager.DATA_ACTIVITY_INOUT
407af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                || mDataActivity == TelephonyManager.DATA_ACTIVITY_IN);
408af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean mobileOut = mDataConnected && (mDataActivity == TelephonyManager.DATA_ACTIVITY_INOUT
409af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                || mDataActivity == TelephonyManager.DATA_ACTIVITY_OUT);
410af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (isEmergencyOnly()) {
411af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            cb.onMobileDataSignalChanged(false, mQSPhoneSignalIconId,
412af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mContentDescriptionPhoneSignal, mQSDataTypeIconId, mobileIn, mobileOut,
413899f439a29ab1e609e7ba2aea3e9de3afef35c50John Spurlock                    mContentDescriptionDataType, null, mNoSim);
414af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
415af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (mIsWimaxEnabled && mWimaxConnected) {
416af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                // Wimax is special
417af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                cb.onMobileDataSignalChanged(true, mQSPhoneSignalIconId,
418af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mContentDescriptionPhoneSignal, mQSDataTypeIconId, mobileIn, mobileOut,
419899f439a29ab1e609e7ba2aea3e9de3afef35c50John Spurlock                        mContentDescriptionDataType, mNetworkName, mNoSim);
420af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            } else {
421af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                // Normal mobile data
422af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                cb.onMobileDataSignalChanged(mHasMobileDataFeature, mQSPhoneSignalIconId,
423af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mContentDescriptionPhoneSignal, mQSDataTypeIconId, mobileIn, mobileOut,
424899f439a29ab1e609e7ba2aea3e9de3afef35c50John Spurlock                        mContentDescriptionDataType, mNetworkName, mNoSim);
425af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
426af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
427af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        cb.onAirplaneModeChanged(mAirplaneMode);
428af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
429af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
430af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void setStackedMode(boolean stacked) {
431af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mDataAndWifiStacked = true;
432af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
433af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
434af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
435af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void onReceive(Context context, Intent intent) {
436af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        final String action = intent.getAction();
437af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (action.equals(WifiManager.RSSI_CHANGED_ACTION)
438af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                || action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)
439af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                || action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
440af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            updateWifiState(intent);
441af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            refreshViews();
442af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
443af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            updateSimState(intent);
444af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            updateDataIcon();
445af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            refreshViews();
446af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else if (action.equals(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION)) {
447af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            updateNetworkName(intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_SPN, false),
448af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        intent.getStringExtra(TelephonyIntents.EXTRA_SPN),
449af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_PLMN, false),
450af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        intent.getStringExtra(TelephonyIntents.EXTRA_PLMN));
451af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            refreshViews();
452af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION) ||
453af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                 action.equals(ConnectivityManager.INET_CONDITION_ACTION)) {
454af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            updateConnectivity(intent);
455af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            refreshViews();
456af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
457af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            refreshLocale();
458af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            refreshViews();
459af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {
460af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            refreshLocale();
461af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            updateAirplaneMode();
462af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            refreshViews();
463af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else if (action.equals(WimaxManagerConstants.NET_4G_STATE_CHANGED_ACTION) ||
464af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                action.equals(WimaxManagerConstants.SIGNAL_LEVEL_CHANGED_ACTION) ||
465af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                action.equals(WimaxManagerConstants.WIMAX_NETWORK_STATE_CHANGED_ACTION)) {
466af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            updateWimaxState(intent);
467af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            refreshViews();
468af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
469af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
470af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
471af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
472af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    // ===== Telephony ==============================================================
473af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
474af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
475af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        @Override
476af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        public void onSignalStrengthsChanged(SignalStrength signalStrength) {
477af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (DEBUG) {
478af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                Log.d(TAG, "onSignalStrengthsChanged signalStrength=" + signalStrength +
479af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    ((signalStrength == null) ? "" : (" level=" + signalStrength.getLevel())));
480af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
481af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mSignalStrength = signalStrength;
482af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            updateTelephonySignalStrength();
483af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            refreshViews();
484af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
485af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
486af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        @Override
487af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        public void onServiceStateChanged(ServiceState state) {
488af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (DEBUG) {
489af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                Log.d(TAG, "onServiceStateChanged voiceState=" + state.getVoiceRegState()
490af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        + " dataState=" + state.getDataRegState());
491af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
492af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mServiceState = state;
493af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            updateTelephonySignalStrength();
494af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            updateDataNetType();
495af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            updateDataIcon();
496af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            refreshViews();
497af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
498af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
499af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        @Override
500af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        public void onCallStateChanged(int state, String incomingNumber) {
501af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (DEBUG) {
502af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                Log.d(TAG, "onCallStateChanged state=" + state);
503af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
504af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // In cdma, if a voice call is made, RSSI should switch to 1x.
505af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (isCdma()) {
506af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                updateTelephonySignalStrength();
507af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                refreshViews();
508af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
509af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
510af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
511af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        @Override
512af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        public void onDataConnectionStateChanged(int state, int networkType) {
513af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (DEBUG) {
514af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                Log.d(TAG, "onDataConnectionStateChanged: state=" + state
515af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        + " type=" + networkType);
516af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
517af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mDataState = state;
518af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mDataNetType = networkType;
519af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            updateDataNetType();
520af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            updateDataIcon();
521af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            refreshViews();
522af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
523af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
524af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        @Override
525af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        public void onDataActivity(int direction) {
526af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (DEBUG) {
527af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                Log.d(TAG, "onDataActivity: direction=" + direction);
528af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
529af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mDataActivity = direction;
530af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            updateDataIcon();
531af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            refreshViews();
532af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
533af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    };
534af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
535af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private final void updateSimState(Intent intent) {
536af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        String stateExtra = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
537af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)) {
538af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mSimState = IccCardConstants.State.ABSENT;
539af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
540af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        else if (IccCardConstants.INTENT_VALUE_ICC_READY.equals(stateExtra)) {
541af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mSimState = IccCardConstants.State.READY;
542af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
543af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        else if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals(stateExtra)) {
544af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            final String lockedReason =
545af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    intent.getStringExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON);
546af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (IccCardConstants.INTENT_VALUE_LOCKED_ON_PIN.equals(lockedReason)) {
547af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mSimState = IccCardConstants.State.PIN_REQUIRED;
548af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
549af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            else if (IccCardConstants.INTENT_VALUE_LOCKED_ON_PUK.equals(lockedReason)) {
550af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mSimState = IccCardConstants.State.PUK_REQUIRED;
551af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
552af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            else {
553af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mSimState = IccCardConstants.State.NETWORK_LOCKED;
554af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
555af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
556af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mSimState = IccCardConstants.State.UNKNOWN;
557af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
558af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
559af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
560af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private boolean isCdma() {
561af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        return (mSignalStrength != null) && !mSignalStrength.isGsm();
562af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
563af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
564af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private boolean hasService() {
565af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mServiceState != null) {
566af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // Consider the device to be in service if either voice or data service is available.
567af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // Some SIM cards are marketed as data-only and do not support voice service, and on
568af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // these SIM cards, we want to show signal bars for data service as well as the "no
569af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // service" or "emergency calls only" text that indicates that voice is not available.
570af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            switch(mServiceState.getVoiceRegState()) {
571af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case ServiceState.STATE_POWER_OFF:
572af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    return false;
573af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case ServiceState.STATE_OUT_OF_SERVICE:
574af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case ServiceState.STATE_EMERGENCY_ONLY:
575af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    return mServiceState.getDataRegState() == ServiceState.STATE_IN_SERVICE;
576af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                default:
577af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    return true;
578af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
579af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
580af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            return false;
581af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
582af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
583af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
584af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private void updateAirplaneMode() {
585af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mAirplaneMode = (Settings.Global.getInt(mContext.getContentResolver(),
586af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            Settings.Global.AIRPLANE_MODE_ON, 0) == 1);
587af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
588af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
589af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private void refreshLocale() {
590af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mLocale = mContext.getResources().getConfiguration().locale;
591af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
592af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
593af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private final void updateTelephonySignalStrength() {
594af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (!hasService()) {
595af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (CHATTY) Log.d(TAG, "updateTelephonySignalStrength: !hasService()");
596af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mPhoneSignalIconId = R.drawable.stat_sys_signal_null;
597af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mQSPhoneSignalIconId = R.drawable.ic_qs_signal_no_signal;
598af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mDataSignalIconId = R.drawable.stat_sys_signal_null;
599af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
600af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (mSignalStrength == null) {
601af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                if (CHATTY) Log.d(TAG, "updateTelephonySignalStrength: mSignalStrength == null");
602af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mPhoneSignalIconId = R.drawable.stat_sys_signal_null;
603af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mQSPhoneSignalIconId = R.drawable.ic_qs_signal_no_signal;
604af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mDataSignalIconId = R.drawable.stat_sys_signal_null;
605af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mContentDescriptionPhoneSignal = mContext.getString(
606af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0]);
607af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            } else {
608af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                int iconLevel;
609af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                int[] iconList;
610af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                if (isCdma() && mAlwaysShowCdmaRssi) {
611af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mLastSignalLevel = iconLevel = mSignalStrength.getCdmaLevel();
612af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    if(DEBUG) Log.d(TAG, "mAlwaysShowCdmaRssi=" + mAlwaysShowCdmaRssi
613af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            + " set to cdmaLevel=" + mSignalStrength.getCdmaLevel()
614af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            + " instead of level=" + mSignalStrength.getLevel());
615af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                } else {
616af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mLastSignalLevel = iconLevel = mSignalStrength.getLevel();
617af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
618af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
619af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                if (isCdma()) {
620af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    if (isCdmaEri()) {
621af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[mInetCondition];
622af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    } else {
623af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[mInetCondition];
624af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    }
625af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                } else {
626af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    // Though mPhone is a Manager, this call is not an IPC
627af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    if (mPhone.isNetworkRoaming()) {
628af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[mInetCondition];
629af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    } else {
630af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        iconList = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[mInetCondition];
631af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    }
632af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
633af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mPhoneSignalIconId = iconList[iconLevel];
634af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mQSPhoneSignalIconId =
635af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[mInetCondition][iconLevel];
636af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mContentDescriptionPhoneSignal = mContext.getString(
637af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[iconLevel]);
638af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mDataSignalIconId = TelephonyIcons.DATA_SIGNAL_STRENGTH[mInetCondition][iconLevel];
639af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
640af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
641af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
642af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
643af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private final void updateDataNetType() {
644af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mIsWimaxEnabled && mWimaxConnected) {
645af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // wimax is a special 4g network not handled by telephony
646af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mDataIconList = TelephonyIcons.DATA_4G[mInetCondition];
647af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_4g;
648af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mQSDataTypeIconId = TelephonyIcons.QS_DATA_4G[mInetCondition];
649af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mContentDescriptionDataType = mContext.getString(
650af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    R.string.accessibility_data_connection_4g);
651af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
652af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            switch (mDataNetType) {
653af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case TelephonyManager.NETWORK_TYPE_UNKNOWN:
654af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    if (!mShowAtLeastThreeGees) {
655af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataIconList = TelephonyIcons.DATA_G[mInetCondition];
656af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataTypeIconId = 0;
657af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mQSDataTypeIconId = 0;
658af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mContentDescriptionDataType = mContext.getString(
659af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                                R.string.accessibility_data_connection_gprs);
660af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        break;
661af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    } else {
662af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        // fall through
663af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    }
664af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case TelephonyManager.NETWORK_TYPE_EDGE:
665af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    if (!mShowAtLeastThreeGees) {
666af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataIconList = TelephonyIcons.DATA_E[mInetCondition];
667af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_e;
668af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mQSDataTypeIconId = TelephonyIcons.QS_DATA_E[mInetCondition];
669af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mContentDescriptionDataType = mContext.getString(
670af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                                R.string.accessibility_data_connection_edge);
671af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        break;
672af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    } else {
673af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        // fall through
674af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    }
675af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case TelephonyManager.NETWORK_TYPE_UMTS:
676af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mDataIconList = TelephonyIcons.DATA_3G[mInetCondition];
677af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_3g;
678af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mQSDataTypeIconId = TelephonyIcons.QS_DATA_3G[mInetCondition];
679af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mContentDescriptionDataType = mContext.getString(
680af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            R.string.accessibility_data_connection_3g);
681af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    break;
682af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case TelephonyManager.NETWORK_TYPE_HSDPA:
683af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case TelephonyManager.NETWORK_TYPE_HSUPA:
684af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case TelephonyManager.NETWORK_TYPE_HSPA:
685af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case TelephonyManager.NETWORK_TYPE_HSPAP:
686af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    if (mHspaDataDistinguishable) {
687af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataIconList = TelephonyIcons.DATA_H[mInetCondition];
688af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_h;
689af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mQSDataTypeIconId = TelephonyIcons.QS_DATA_H[mInetCondition];
690af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mContentDescriptionDataType = mContext.getString(
691af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                                R.string.accessibility_data_connection_3_5g);
692af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    } else {
693af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataIconList = TelephonyIcons.DATA_3G[mInetCondition];
694af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_3g;
695af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mQSDataTypeIconId = TelephonyIcons.QS_DATA_3G[mInetCondition];
696af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mContentDescriptionDataType = mContext.getString(
697af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                                R.string.accessibility_data_connection_3g);
698af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    }
699af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    break;
700af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case TelephonyManager.NETWORK_TYPE_CDMA:
701af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    if (!mShowAtLeastThreeGees) {
702af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        // display 1xRTT for IS95A/B
703af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataIconList = TelephonyIcons.DATA_1X[mInetCondition];
704af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_1x;
705af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mQSDataTypeIconId = TelephonyIcons.QS_DATA_1X[mInetCondition];
706af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mContentDescriptionDataType = mContext.getString(
707af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                                R.string.accessibility_data_connection_cdma);
708af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        break;
709af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    } else {
710af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        // fall through
711af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    }
712af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case TelephonyManager.NETWORK_TYPE_1xRTT:
713af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    if (!mShowAtLeastThreeGees) {
714af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataIconList = TelephonyIcons.DATA_1X[mInetCondition];
715af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_1x;
716af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mQSDataTypeIconId = TelephonyIcons.QS_DATA_1X[mInetCondition];
717af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mContentDescriptionDataType = mContext.getString(
718af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                                R.string.accessibility_data_connection_cdma);
719af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        break;
720af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    } else {
721af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        // fall through
722af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    }
723af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through
724af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case TelephonyManager.NETWORK_TYPE_EVDO_A:
725af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case TelephonyManager.NETWORK_TYPE_EVDO_B:
726af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case TelephonyManager.NETWORK_TYPE_EHRPD:
727af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mDataIconList = TelephonyIcons.DATA_3G[mInetCondition];
728af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_3g;
729af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mQSDataTypeIconId = TelephonyIcons.QS_DATA_3G[mInetCondition];
730af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mContentDescriptionDataType = mContext.getString(
731af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            R.string.accessibility_data_connection_3g);
732af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    break;
733af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case TelephonyManager.NETWORK_TYPE_LTE:
734af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    boolean show4GforLTE = mContext.getResources().getBoolean(R.bool.config_show4GForLTE);
735af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    if (show4GforLTE) {
736af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataIconList = TelephonyIcons.DATA_4G[mInetCondition];
737af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_4g;
738af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mQSDataTypeIconId = TelephonyIcons.QS_DATA_4G[mInetCondition];
739af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mContentDescriptionDataType = mContext.getString(
740af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                                R.string.accessibility_data_connection_4g);
741af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    } else {
742af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataIconList = TelephonyIcons.DATA_LTE[mInetCondition];
743af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_lte;
744af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mQSDataTypeIconId = TelephonyIcons.QS_DATA_LTE[mInetCondition];
745af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mContentDescriptionDataType = mContext.getString(
746af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                                R.string.accessibility_data_connection_lte);
747af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    }
748af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    break;
749af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                default:
750af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    if (!mShowAtLeastThreeGees) {
751af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataIconList = TelephonyIcons.DATA_G[mInetCondition];
752af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_g;
753af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mQSDataTypeIconId = TelephonyIcons.QS_DATA_G[mInetCondition];
754af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mContentDescriptionDataType = mContext.getString(
755af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                                R.string.accessibility_data_connection_gprs);
756af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    } else {
757af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataIconList = TelephonyIcons.DATA_3G[mInetCondition];
758af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_3g;
759af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mQSDataTypeIconId = TelephonyIcons.QS_DATA_3G[mInetCondition];
760af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mContentDescriptionDataType = mContext.getString(
761af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                                R.string.accessibility_data_connection_3g);
762af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    }
763af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    break;
764af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
765af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
766af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
767af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (isCdma()) {
768af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (isCdmaEri()) {
769af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_roam;
770af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mQSDataTypeIconId = TelephonyIcons.QS_DATA_R[mInetCondition];
771af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
772af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else if (mPhone.isNetworkRoaming()) {
773af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_roam;
774af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mQSDataTypeIconId = TelephonyIcons.QS_DATA_R[mInetCondition];
775af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
776af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
777af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
778af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    boolean isCdmaEri() {
779af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mServiceState != null) {
780af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            final int iconIndex = mServiceState.getCdmaEriIconIndex();
781af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (iconIndex != EriInfo.ROAMING_INDICATOR_OFF) {
782af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                final int iconMode = mServiceState.getCdmaEriIconMode();
783af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                if (iconMode == EriInfo.ROAMING_ICON_MODE_NORMAL
784af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        || iconMode == EriInfo.ROAMING_ICON_MODE_FLASH) {
785af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    return true;
786af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
787af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
788af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
789af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        return false;
790af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
791af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
792af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private final void updateDataIcon() {
793af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        int iconId;
794af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean visible = true;
795af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
796af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (!isCdma()) {
797af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // GSM case, we have to check also the sim state
798af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (mSimState == IccCardConstants.State.READY ||
799af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mSimState == IccCardConstants.State.UNKNOWN) {
800899f439a29ab1e609e7ba2aea3e9de3afef35c50John Spurlock                mNoSim = false;
801af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                if (hasService() && mDataState == TelephonyManager.DATA_CONNECTED) {
802af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    switch (mDataActivity) {
803af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        case TelephonyManager.DATA_ACTIVITY_IN:
804af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            iconId = mDataIconList[1];
805af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            break;
806af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        case TelephonyManager.DATA_ACTIVITY_OUT:
807af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            iconId = mDataIconList[2];
808af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            break;
809af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        case TelephonyManager.DATA_ACTIVITY_INOUT:
810af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            iconId = mDataIconList[3];
811af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            break;
812af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        default:
813af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            iconId = mDataIconList[0];
814af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            break;
815af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    }
816af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mDataDirectionIconId = iconId;
817af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                } else {
818af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    iconId = 0;
819af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    visible = false;
820af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
821af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            } else {
822af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                iconId = R.drawable.stat_sys_no_sim;
823899f439a29ab1e609e7ba2aea3e9de3afef35c50John Spurlock                mNoSim = true;
824af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                visible = false; // no SIM? no data
825af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
826af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
827af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // CDMA case, mDataActivity can be also DATA_ACTIVITY_DORMANT
828af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (hasService() && mDataState == TelephonyManager.DATA_CONNECTED) {
829af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                switch (mDataActivity) {
830af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    case TelephonyManager.DATA_ACTIVITY_IN:
831af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        iconId = mDataIconList[1];
832af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        break;
833af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    case TelephonyManager.DATA_ACTIVITY_OUT:
834af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        iconId = mDataIconList[2];
835af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        break;
836af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    case TelephonyManager.DATA_ACTIVITY_INOUT:
837af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        iconId = mDataIconList[3];
838af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        break;
839af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    case TelephonyManager.DATA_ACTIVITY_DORMANT:
840af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    default:
841af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        iconId = mDataIconList[0];
842af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        break;
843af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
844af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            } else {
845af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                iconId = 0;
846af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                visible = false;
847af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
848af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
849af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
850af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mDataDirectionIconId = iconId;
851af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mDataConnected = visible;
852af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
853af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
854af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    void updateNetworkName(boolean showSpn, String spn, boolean showPlmn, String plmn) {
855af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (false) {
856af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            Log.d("CarrierLabel", "updateNetworkName showSpn=" + showSpn + " spn=" + spn
857af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " showPlmn=" + showPlmn + " plmn=" + plmn);
858af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
859af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        StringBuilder str = new StringBuilder();
860af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean something = false;
861af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (showPlmn && plmn != null) {
862af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            str.append(plmn);
863af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            something = true;
864af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
865af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (showSpn && spn != null) {
866af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (something) {
867af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                str.append(mNetworkNameSeparator);
868af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
869af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            str.append(spn);
870af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            something = true;
871af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
872af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (something) {
873af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mNetworkName = str.toString();
874af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
875af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mNetworkName = mNetworkNameDefault;
876af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
877af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
878af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
879af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    // ===== Wifi ===================================================================
880af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
881af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    class WifiHandler extends Handler {
882af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        @Override
883af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        public void handleMessage(Message msg) {
884af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            switch (msg.what) {
885af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED:
886af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) {
887af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mWifiChannel.sendMessage(Message.obtain(this,
888af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                                AsyncChannel.CMD_CHANNEL_FULL_CONNECTION));
889af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    } else {
890af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        Log.e(TAG, "Failed to connect to wifi");
891af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    }
892af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    break;
893af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                case WifiManager.DATA_ACTIVITY_NOTIFICATION:
894af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    if (msg.arg1 != mWifiActivity) {
895af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mWifiActivity = msg.arg1;
896af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        refreshViews();
897af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    }
898af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    break;
899af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                default:
900af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    //Ignore
901af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    break;
902af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
903af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
904af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
905af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
906af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private void updateWifiState(Intent intent) {
907af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        final String action = intent.getAction();
908af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
909af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mWifiEnabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
910af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED;
911af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
912af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
913af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            final NetworkInfo networkInfo = (NetworkInfo)
914af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
915af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            boolean wasConnected = mWifiConnected;
916af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mWifiConnected = networkInfo != null && networkInfo.isConnected();
917af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // If we just connected, grab the inintial signal strength and ssid
918af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (mWifiConnected && !wasConnected) {
919af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                // try getting it out of the intent first
920af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                WifiInfo info = (WifiInfo) intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
921af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                if (info == null) {
922af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    info = mWifiManager.getConnectionInfo();
923af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
924af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                if (info != null) {
925af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mWifiSsid = huntForSsid(info);
926af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                } else {
927af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mWifiSsid = null;
928af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
929af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            } else if (!mWifiConnected) {
930af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mWifiSsid = null;
931af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
932af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
933af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mWifiRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
934af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mWifiLevel = WifiManager.calculateSignalLevel(
935af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mWifiRssi, WifiIcons.WIFI_LEVEL_COUNT);
936af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
937af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
938af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        updateWifiIcons();
939af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
940af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
941af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private void updateWifiIcons() {
942af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mWifiConnected) {
943af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mWifiIconId = WifiIcons.WIFI_SIGNAL_STRENGTH[mInetCondition][mWifiLevel];
944af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mQSWifiIconId = WifiIcons.QS_WIFI_SIGNAL_STRENGTH[mInetCondition][mWifiLevel];
945af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mContentDescriptionWifi = mContext.getString(
946af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH[mWifiLevel]);
947af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
948af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (mDataAndWifiStacked) {
949af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mWifiIconId = 0;
950af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mQSWifiIconId = 0;
951af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            } else {
952af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mWifiIconId = mWifiEnabled ? R.drawable.stat_sys_wifi_signal_null : 0;
953af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mQSWifiIconId = mWifiEnabled ? R.drawable.ic_qs_wifi_no_network : 0;
954af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
955af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mContentDescriptionWifi = mContext.getString(R.string.accessibility_no_wifi);
956af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
957af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
958af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
959af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private String huntForSsid(WifiInfo info) {
960af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        String ssid = info.getSSID();
961af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (ssid != null) {
962af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            return ssid;
963af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
964af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // OK, it's not in the connectionInfo; we have to go hunting for it
965af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        List<WifiConfiguration> networks = mWifiManager.getConfiguredNetworks();
966af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        for (WifiConfiguration net : networks) {
967af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (net.networkId == info.getNetworkId()) {
968af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                return net.SSID;
969af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
970af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
971af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        return null;
972af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
973af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
974af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
975af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    // ===== Wimax ===================================================================
976af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private final void updateWimaxState(Intent intent) {
977af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        final String action = intent.getAction();
978af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean wasConnected = mWimaxConnected;
979af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (action.equals(WimaxManagerConstants.NET_4G_STATE_CHANGED_ACTION)) {
980af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            int wimaxStatus = intent.getIntExtra(WimaxManagerConstants.EXTRA_4G_STATE,
981af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    WimaxManagerConstants.NET_4G_STATE_UNKNOWN);
982af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mIsWimaxEnabled = (wimaxStatus ==
983af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    WimaxManagerConstants.NET_4G_STATE_ENABLED);
984af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else if (action.equals(WimaxManagerConstants.SIGNAL_LEVEL_CHANGED_ACTION)) {
985af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mWimaxSignal = intent.getIntExtra(WimaxManagerConstants.EXTRA_NEW_SIGNAL_LEVEL, 0);
986af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else if (action.equals(WimaxManagerConstants.WIMAX_NETWORK_STATE_CHANGED_ACTION)) {
987af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mWimaxState = intent.getIntExtra(WimaxManagerConstants.EXTRA_WIMAX_STATE,
988af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    WimaxManagerConstants.NET_4G_STATE_UNKNOWN);
989af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mWimaxExtraState = intent.getIntExtra(
990af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    WimaxManagerConstants.EXTRA_WIMAX_STATE_DETAIL,
991af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    WimaxManagerConstants.NET_4G_STATE_UNKNOWN);
992af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mWimaxConnected = (mWimaxState ==
993af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    WimaxManagerConstants.WIMAX_STATE_CONNECTED);
994af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mWimaxIdle = (mWimaxExtraState == WimaxManagerConstants.WIMAX_IDLE);
995af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
996af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        updateDataNetType();
997af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        updateWimaxIcons();
998af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
999af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1000af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private void updateWimaxIcons() {
1001af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mIsWimaxEnabled) {
1002af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (mWimaxConnected) {
1003af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                if (mWimaxIdle)
1004af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mWimaxIconId = WimaxIcons.WIMAX_IDLE;
1005af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                else
1006af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mWimaxIconId = WimaxIcons.WIMAX_SIGNAL_STRENGTH[mInetCondition][mWimaxSignal];
1007af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mContentDescriptionWimax = mContext.getString(
1008af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        AccessibilityContentDescriptions.WIMAX_CONNECTION_STRENGTH[mWimaxSignal]);
1009af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            } else {
1010af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mWimaxIconId = WimaxIcons.WIMAX_DISCONNECTED;
1011af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mContentDescriptionWimax = mContext.getString(R.string.accessibility_no_wimax);
1012af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1013af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
1014af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mWimaxIconId = 0;
1015af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1016af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
1017af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1018af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    // ===== Full or limited Internet connectivity ==================================
1019af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1020af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private void updateConnectivity(Intent intent) {
1021af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (CHATTY) {
1022af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            Log.d(TAG, "updateConnectivity: intent=" + intent);
1023af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1024af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1025af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        final ConnectivityManager connManager = (ConnectivityManager) mContext
1026af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                .getSystemService(Context.CONNECTIVITY_SERVICE);
1027af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        final NetworkInfo info = connManager.getActiveNetworkInfo();
1028af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1029af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // Are we connected at all, by any interface?
1030af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mConnected = info != null && info.isConnected();
1031af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mConnected) {
1032af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mConnectedNetworkType = info.getType();
1033af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mConnectedNetworkTypeName = info.getTypeName();
1034af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
1035af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mConnectedNetworkType = ConnectivityManager.TYPE_NONE;
1036af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mConnectedNetworkTypeName = null;
1037af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1038af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1039af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        int connectionStatus = intent.getIntExtra(ConnectivityManager.EXTRA_INET_CONDITION, 0);
1040af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1041af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (CHATTY) {
1042af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            Log.d(TAG, "updateConnectivity: networkInfo=" + info);
1043af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            Log.d(TAG, "updateConnectivity: connectionStatus=" + connectionStatus);
1044af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1045af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1046af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mInetCondition = (connectionStatus > INET_CONDITION_THRESHOLD ? 1 : 0);
1047af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1048af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (info != null && info.getType() == ConnectivityManager.TYPE_BLUETOOTH) {
1049af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mBluetoothTethered = info.isConnected();
1050af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
1051af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mBluetoothTethered = false;
1052af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1053af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1054af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // We want to update all the icons, all at once, for any condition change
1055af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        updateDataNetType();
1056af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        updateWimaxIcons();
1057af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        updateDataIcon();
1058af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        updateTelephonySignalStrength();
1059af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        updateWifiIcons();
1060af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
1061af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1062af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1063af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    // ===== Update the views =======================================================
1064af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1065af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    void refreshViews() {
1066af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        Context context = mContext;
1067af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1068af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        int combinedSignalIconId = 0;
1069af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        String combinedLabel = "";
1070af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        String wifiLabel = "";
1071af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        String mobileLabel = "";
1072af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        int N;
1073af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        final boolean emergencyOnly = isEmergencyOnly();
1074af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1075af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (!mHasMobileDataFeature) {
1076af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mDataSignalIconId = mPhoneSignalIconId = 0;
1077af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mQSPhoneSignalIconId = 0;
1078af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mobileLabel = "";
1079af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
1080af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // We want to show the carrier name if in service and either:
1081af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            //   - We are connected to mobile data, or
1082af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            //   - We are not connected to mobile data, as long as the *reason* packets are not
1083af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            //     being routed over that link is that we have better connectivity via wifi.
1084af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // If data is disconnected for some other reason but wifi (or ethernet/bluetooth)
1085af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // is connected, we show nothing.
1086af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // Otherwise (nothing connected) we show "No internet connection".
1087af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1088af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (mDataConnected) {
1089af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mobileLabel = mNetworkName;
1090af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            } else if (mConnected || emergencyOnly) {
1091af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                if (hasService() || emergencyOnly) {
1092af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    // The isEmergencyOnly test covers the case of a phone with no SIM
1093af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mobileLabel = mNetworkName;
1094af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                } else {
1095af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    // Tablets, basically
1096af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mobileLabel = "";
1097af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
1098af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            } else {
1099af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mobileLabel
1100af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    = context.getString(R.string.status_bar_settings_signal_meter_disconnected);
1101af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1102af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1103af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // Now for things that should only be shown when actually using mobile data.
1104af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (mDataConnected) {
1105af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                combinedSignalIconId = mDataSignalIconId;
1106af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1107af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                combinedLabel = mobileLabel;
1108af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                combinedSignalIconId = mDataSignalIconId; // set by updateDataIcon()
1109af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mContentDescriptionCombinedSignal = mContentDescriptionDataType;
1110af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1111af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1112af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1113af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mWifiConnected) {
1114af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (mWifiSsid == null) {
1115af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                wifiLabel = context.getString(R.string.status_bar_settings_signal_meter_wifi_nossid);
1116af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            } else {
1117af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                wifiLabel = mWifiSsid;
1118af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                if (DEBUG) {
1119af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    wifiLabel += "xxxxXXXXxxxxXXXX";
1120af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
1121af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1122af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1123af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            combinedLabel = wifiLabel;
1124af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            combinedSignalIconId = mWifiIconId; // set by updateWifiIcons()
1125af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mContentDescriptionCombinedSignal = mContentDescriptionWifi;
1126af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
1127af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (mHasMobileDataFeature) {
1128af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                wifiLabel = "";
1129af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            } else {
1130af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                wifiLabel = context.getString(R.string.status_bar_settings_signal_meter_disconnected);
1131af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1132af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1133af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1134af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mBluetoothTethered) {
1135af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            combinedLabel = mContext.getString(R.string.bluetooth_tethered);
1136af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            combinedSignalIconId = mBluetoothTetherIconId;
1137af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mContentDescriptionCombinedSignal = mContext.getString(
1138af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    R.string.accessibility_bluetooth_tether);
1139af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1140af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1141af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        final boolean ethernetConnected = (mConnectedNetworkType == ConnectivityManager.TYPE_ETHERNET);
1142af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (ethernetConnected) {
1143af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            combinedLabel = context.getString(R.string.ethernet_label);
1144af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1145af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1146af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mAirplaneMode &&
1147af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                (mServiceState == null || (!hasService() && !mServiceState.isEmergencyOnly()))) {
1148af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // Only display the flight-mode icon if not in "emergency calls only" mode.
1149af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1150af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // look again; your radios are now airplanes
1151af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mContentDescriptionPhoneSignal = mContext.getString(
1152af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    R.string.accessibility_airplane_mode);
1153af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mAirplaneIconId = FLIGHT_MODE_ICON;
1154af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mPhoneSignalIconId = mDataSignalIconId = mDataTypeIconId = mQSDataTypeIconId = 0;
1155af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mQSPhoneSignalIconId = 0;
1156af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1157af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // combined values from connected wifi take precedence over airplane mode
1158af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (mWifiConnected) {
1159af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                // Suppress "No internet connection." from mobile if wifi connected.
1160af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mobileLabel = "";
1161af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            } else {
1162af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                if (mHasMobileDataFeature) {
1163af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    // let the mobile icon show "No internet connection."
1164af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    wifiLabel = "";
1165af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                } else {
1166af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    wifiLabel = context.getString(R.string.status_bar_settings_signal_meter_disconnected);
1167af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    combinedLabel = wifiLabel;
1168af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
1169af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mContentDescriptionCombinedSignal = mContentDescriptionPhoneSignal;
1170af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                combinedSignalIconId = mDataSignalIconId;
1171af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1172af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1173af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        else if (!mDataConnected && !mWifiConnected && !mBluetoothTethered && !mWimaxConnected && !ethernetConnected) {
1174af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // pretty much totally disconnected
1175af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1176af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            combinedLabel = context.getString(R.string.status_bar_settings_signal_meter_disconnected);
1177af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // On devices without mobile radios, we want to show the wifi icon
1178af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            combinedSignalIconId =
1179af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mHasMobileDataFeature ? mDataSignalIconId : mWifiIconId;
1180af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mContentDescriptionCombinedSignal = mHasMobileDataFeature
1181af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                ? mContentDescriptionDataType : mContentDescriptionWifi;
1182af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1183af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mDataTypeIconId = 0;
1184af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mQSDataTypeIconId = 0;
1185af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (isCdma()) {
1186af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                if (isCdmaEri()) {
1187af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_roam;
1188af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mQSDataTypeIconId = TelephonyIcons.QS_DATA_R[mInetCondition];
1189af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
1190af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            } else if (mPhone.isNetworkRoaming()) {
1191af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mDataTypeIconId = R.drawable.stat_sys_data_fully_connected_roam;
1192af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mQSDataTypeIconId = TelephonyIcons.QS_DATA_R[mInetCondition];
1193af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1194af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1195af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1196af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (DEBUG) {
1197af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            Log.d(TAG, "refreshViews connected={"
1198af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + (mWifiConnected?" wifi":"")
1199af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + (mDataConnected?" data":"")
1200af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " } level="
1201af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + ((mSignalStrength == null)?"??":Integer.toString(mSignalStrength.getLevel()))
1202af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " combinedSignalIconId=0x"
1203af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + Integer.toHexString(combinedSignalIconId)
1204af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + "/" + getResourceName(combinedSignalIconId)
1205af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " mobileLabel=" + mobileLabel
1206af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " wifiLabel=" + wifiLabel
1207af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " emergencyOnly=" + emergencyOnly
1208af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " combinedLabel=" + combinedLabel
1209af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " mAirplaneMode=" + mAirplaneMode
1210af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " mDataActivity=" + mDataActivity
1211af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " mPhoneSignalIconId=0x" + Integer.toHexString(mPhoneSignalIconId)
1212af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " mQSPhoneSignalIconId=0x" + Integer.toHexString(mQSPhoneSignalIconId)
1213af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " mDataDirectionIconId=0x" + Integer.toHexString(mDataDirectionIconId)
1214af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " mDataSignalIconId=0x" + Integer.toHexString(mDataSignalIconId)
1215af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " mDataTypeIconId=0x" + Integer.toHexString(mDataTypeIconId)
1216af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " mQSDataTypeIconId=0x" + Integer.toHexString(mQSDataTypeIconId)
1217af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " mWifiIconId=0x" + Integer.toHexString(mWifiIconId)
1218af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " mQSWifiIconId=0x" + Integer.toHexString(mQSWifiIconId)
1219af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    + " mBluetoothTetherIconId=0x" + Integer.toHexString(mBluetoothTetherIconId));
1220af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1221af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1222af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // update QS
1223af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        for (NetworkSignalChangedCallback cb : mSignalsChangedCallbacks) {
1224af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            notifySignalsChangedCallbacks(cb);
1225af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1226af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1227af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mLastPhoneSignalIconId          != mPhoneSignalIconId
1228af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock         || mLastWifiIconId                 != mWifiIconId
1229af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock         || mLastInetCondition              != mInetCondition
1230af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock         || mLastWimaxIconId                != mWimaxIconId
1231af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock         || mLastDataTypeIconId             != mDataTypeIconId
1232af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock         || mLastAirplaneMode               != mAirplaneMode
1233af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock         || mLastLocale                     != mLocale)
1234af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        {
1235af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // NB: the mLast*s will be updated later
1236af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            for (SignalCluster cluster : mSignalClusters) {
1237af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                refreshSignalCluster(cluster);
1238af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1239af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1240af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1241af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mLastAirplaneMode != mAirplaneMode) {
1242af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mLastAirplaneMode = mAirplaneMode;
1243af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1244af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1245af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mLastLocale != mLocale) {
1246af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mLastLocale = mLocale;
1247af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1248af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1249af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // the phone icon on phones
1250af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mLastPhoneSignalIconId != mPhoneSignalIconId) {
1251af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mLastPhoneSignalIconId = mPhoneSignalIconId;
1252af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1253af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1254af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // the data icon on phones
1255af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mLastDataDirectionIconId != mDataDirectionIconId) {
1256af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mLastDataDirectionIconId = mDataDirectionIconId;
1257af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1258af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1259af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // the wifi icon on phones
1260af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mLastWifiIconId != mWifiIconId) {
1261af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mLastWifiIconId = mWifiIconId;
1262af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1263af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1264af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mLastInetCondition != mInetCondition) {
1265af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mLastInetCondition = mInetCondition;
1266af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1267af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1268af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // the wimax icon on phones
1269af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mLastWimaxIconId != mWimaxIconId) {
1270af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mLastWimaxIconId = mWimaxIconId;
1271af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1272af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // the combined data signal icon
1273af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mLastCombinedSignalIconId != combinedSignalIconId) {
1274af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mLastCombinedSignalIconId = combinedSignalIconId;
1275af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1276af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1277af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // the data network type overlay
1278af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mLastDataTypeIconId != mDataTypeIconId) {
1279af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mLastDataTypeIconId = mDataTypeIconId;
1280af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1281af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1282af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // the combinedLabel in the notification panel
1283af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (!mLastCombinedLabel.equals(combinedLabel)) {
1284af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mLastCombinedLabel = combinedLabel;
1285af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            N = mCombinedLabelViews.size();
1286af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            for (int i=0; i<N; i++) {
1287af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                TextView v = mCombinedLabelViews.get(i);
1288af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                v.setText(combinedLabel);
1289af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1290af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1291af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1292af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // wifi label
1293af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        N = mWifiLabelViews.size();
1294af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        for (int i=0; i<N; i++) {
1295af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            TextView v = mWifiLabelViews.get(i);
1296af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            v.setText(wifiLabel);
1297af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if ("".equals(wifiLabel)) {
1298af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                v.setVisibility(View.GONE);
1299af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            } else {
1300af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                v.setVisibility(View.VISIBLE);
1301af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1302af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1303af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1304af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // mobile label
1305af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        N = mMobileLabelViews.size();
1306af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        for (int i=0; i<N; i++) {
1307af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            TextView v = mMobileLabelViews.get(i);
1308af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            v.setText(mobileLabel);
1309af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if ("".equals(mobileLabel)) {
1310af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                v.setVisibility(View.GONE);
1311af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            } else {
1312af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                v.setVisibility(View.VISIBLE);
1313af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1314af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1315af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1316af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        // e-call label
131759a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos        N = mEmergencyViews.size();
1318af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        for (int i=0; i<N; i++) {
131959a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos            StatusBarHeaderView v = mEmergencyViews.get(i);
132059a6127551650e7307fd6e6e1b72c1c2377fac80Adrian Roos            v.setShowEmergencyCallsOnly(emergencyOnly);
1321af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1322af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
1323af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1324af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
1325af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println("NetworkController state:");
1326af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(String.format("  %s network type %d (%s)",
1327af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mConnected?"CONNECTED":"DISCONNECTED",
1328af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mConnectedNetworkType, mConnectedNetworkTypeName));
1329af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println("  - telephony ------");
1330af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  hasVoiceCallingFeature()=");
1331af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(hasVoiceCallingFeature());
1332af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  hasService()=");
1333af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(hasService());
1334af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mHspaDataDistinguishable=");
1335af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mHspaDataDistinguishable);
1336af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mDataConnected=");
1337af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mDataConnected);
1338af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mSimState=");
1339af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mSimState);
1340af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mPhoneState=");
1341af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mPhoneState);
1342af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mDataState=");
1343af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mDataState);
1344af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mDataActivity=");
1345af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mDataActivity);
1346af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mDataNetType=");
1347af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print(mDataNetType);
1348af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("/");
1349af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(TelephonyManager.getNetworkTypeName(mDataNetType));
1350af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mServiceState=");
1351af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mServiceState);
1352af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mSignalStrength=");
1353af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mSignalStrength);
1354af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mLastSignalLevel=");
1355af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mLastSignalLevel);
1356af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mNetworkName=");
1357af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mNetworkName);
1358af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mNetworkNameDefault=");
1359af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mNetworkNameDefault);
1360af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mNetworkNameSeparator=");
1361af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mNetworkNameSeparator.replace("\n","\\n"));
1362af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mPhoneSignalIconId=0x");
1363af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print(Integer.toHexString(mPhoneSignalIconId));
1364af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("/");
1365af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mQSPhoneSignalIconId=0x");
1366af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print(Integer.toHexString(mQSPhoneSignalIconId));
1367af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("/");
1368af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(getResourceName(mPhoneSignalIconId));
1369af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mDataDirectionIconId=");
1370af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print(Integer.toHexString(mDataDirectionIconId));
1371af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("/");
1372af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(getResourceName(mDataDirectionIconId));
1373af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mDataSignalIconId=");
1374af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print(Integer.toHexString(mDataSignalIconId));
1375af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("/");
1376af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(getResourceName(mDataSignalIconId));
1377af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mDataTypeIconId=");
1378af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print(Integer.toHexString(mDataTypeIconId));
1379af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("/");
1380af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(getResourceName(mDataTypeIconId));
1381af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mQSDataTypeIconId=");
1382af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print(Integer.toHexString(mQSDataTypeIconId));
1383af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("/");
1384af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(getResourceName(mQSDataTypeIconId));
1385af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1386af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println("  - wifi ------");
1387af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mWifiEnabled=");
1388af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mWifiEnabled);
1389af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mWifiConnected=");
1390af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mWifiConnected);
1391af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mWifiRssi=");
1392af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mWifiRssi);
1393af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mWifiLevel=");
1394af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mWifiLevel);
1395af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mWifiSsid=");
1396af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mWifiSsid);
1397af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(String.format("  mWifiIconId=0x%08x/%s",
1398af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mWifiIconId, getResourceName(mWifiIconId)));
1399af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(String.format("  mQSWifiIconId=0x%08x/%s",
1400af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mQSWifiIconId, getResourceName(mQSWifiIconId)));
1401af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mWifiActivity=");
1402af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mWifiActivity);
1403af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1404af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (mWimaxSupported) {
1405af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            pw.println("  - wimax ------");
1406af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            pw.print("  mIsWimaxEnabled="); pw.println(mIsWimaxEnabled);
1407af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            pw.print("  mWimaxConnected="); pw.println(mWimaxConnected);
1408af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            pw.print("  mWimaxIdle="); pw.println(mWimaxIdle);
1409af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            pw.println(String.format("  mWimaxIconId=0x%08x/%s",
1410af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        mWimaxIconId, getResourceName(mWimaxIconId)));
1411af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            pw.println(String.format("  mWimaxSignal=%d", mWimaxSignal));
1412af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            pw.println(String.format("  mWimaxState=%d", mWimaxState));
1413af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            pw.println(String.format("  mWimaxExtraState=%d", mWimaxExtraState));
1414af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1415af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1416af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println("  - Bluetooth ----");
1417af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mBtReverseTethered=");
1418af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mBluetoothTethered);
1419af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1420af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println("  - connectivity ------");
1421af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mInetCondition=");
1422af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(mInetCondition);
1423af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1424af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println("  - icons ------");
1425af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mLastPhoneSignalIconId=0x");
1426af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print(Integer.toHexString(mLastPhoneSignalIconId));
1427af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("/");
1428af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(getResourceName(mLastPhoneSignalIconId));
1429af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mLastDataDirectionIconId=0x");
1430af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print(Integer.toHexString(mLastDataDirectionIconId));
1431af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("/");
1432af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(getResourceName(mLastDataDirectionIconId));
1433af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mLastWifiIconId=0x");
1434af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print(Integer.toHexString(mLastWifiIconId));
1435af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("/");
1436af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(getResourceName(mLastWifiIconId));
1437af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mLastCombinedSignalIconId=0x");
1438af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print(Integer.toHexString(mLastCombinedSignalIconId));
1439af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("/");
1440af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(getResourceName(mLastCombinedSignalIconId));
1441af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mLastDataTypeIconId=0x");
1442af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print(Integer.toHexString(mLastDataTypeIconId));
1443af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("/");
1444af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println(getResourceName(mLastDataTypeIconId));
1445af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print("  mLastCombinedLabel=");
1446af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.print(mLastCombinedLabel);
1447af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        pw.println("");
1448af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
1449af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1450af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private String getResourceName(int resId) {
1451af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (resId != 0) {
1452af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            final Resources res = mContext.getResources();
1453af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            try {
1454af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                return res.getResourceName(resId);
1455af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            } catch (android.content.res.Resources.NotFoundException ex) {
1456af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                return "(unknown)";
1457af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1458af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
1459af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            return "(null)";
1460af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1461af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
1462af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1463af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private boolean mDemoMode;
1464af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private int mDemoInetCondition;
1465af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private int mDemoWifiLevel;
1466af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private int mDemoDataTypeIconId;
1467af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private int mDemoMobileLevel;
1468af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1469af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
1470af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public void dispatchDemoCommand(String command, Bundle args) {
1471af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (!mDemoMode && command.equals(COMMAND_ENTER)) {
1472af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mDemoMode = true;
1473af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mDemoWifiLevel = mWifiLevel;
1474af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mDemoInetCondition = mInetCondition;
1475af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mDemoDataTypeIconId = mDataTypeIconId;
1476af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mDemoMobileLevel = mLastSignalLevel;
1477af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else if (mDemoMode && command.equals(COMMAND_EXIT)) {
1478af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            mDemoMode = false;
1479af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            for (SignalCluster cluster : mSignalClusters) {
1480af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                refreshSignalCluster(cluster);
1481af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1482af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else if (mDemoMode && command.equals(COMMAND_NETWORK)) {
1483af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            String airplane = args.getString("airplane");
1484af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (airplane != null) {
1485af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                boolean show = airplane.equals("show");
1486af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                for (SignalCluster cluster : mSignalClusters) {
1487af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    cluster.setIsAirplaneMode(show, FLIGHT_MODE_ICON);
1488af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
1489af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1490af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            String fully = args.getString("fully");
1491af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (fully != null) {
1492af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                mDemoInetCondition = Boolean.parseBoolean(fully) ? 1 : 0;
1493af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1494af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            String wifi = args.getString("wifi");
1495af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (wifi != null) {
1496af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                boolean show = wifi.equals("show");
1497af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                String level = args.getString("level");
1498af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                if (level != null) {
1499af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mDemoWifiLevel = level.equals("null") ? -1
1500af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            : Math.min(Integer.parseInt(level), WifiIcons.WIFI_LEVEL_COUNT - 1);
1501af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
1502af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                int iconId = mDemoWifiLevel < 0 ? R.drawable.stat_sys_wifi_signal_null
1503af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        : WifiIcons.WIFI_SIGNAL_STRENGTH[mDemoInetCondition][mDemoWifiLevel];
1504af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                for (SignalCluster cluster : mSignalClusters) {
1505af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    cluster.setWifiIndicators(
1506af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            show,
1507af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            iconId,
1508af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            mDemoInetCondition == 0,
1509af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            "Demo");
1510af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
1511af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1512af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            String mobile = args.getString("mobile");
1513af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            if (mobile != null) {
1514af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                boolean show = mobile.equals("show");
1515af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                String datatype = args.getString("datatype");
1516af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                if (datatype != null) {
1517af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mDemoDataTypeIconId =
1518af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            datatype.equals("1x") ? R.drawable.stat_sys_data_fully_connected_1x :
1519af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            datatype.equals("3g") ? R.drawable.stat_sys_data_fully_connected_3g :
1520af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            datatype.equals("4g") ? R.drawable.stat_sys_data_fully_connected_4g :
1521af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            datatype.equals("e") ? R.drawable.stat_sys_data_fully_connected_e :
1522af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            datatype.equals("g") ? R.drawable.stat_sys_data_fully_connected_g :
1523af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            datatype.equals("h") ? R.drawable.stat_sys_data_fully_connected_h :
1524af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            datatype.equals("lte") ? R.drawable.stat_sys_data_fully_connected_lte :
1525af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            datatype.equals("roam")
1526af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                                    ? R.drawable.stat_sys_data_fully_connected_roam :
1527af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            0;
1528af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
1529af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                int[][] icons = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH;
1530af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                String level = args.getString("level");
1531af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                if (level != null) {
1532af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    mDemoMobileLevel = level.equals("null") ? -1
1533af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            : Math.min(Integer.parseInt(level), icons[0].length - 1);
1534af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
1535af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                int iconId = mDemoMobileLevel < 0 ? R.drawable.stat_sys_signal_null :
1536af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                        icons[mDemoInetCondition][mDemoMobileLevel];
1537af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                for (SignalCluster cluster : mSignalClusters) {
1538af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                    cluster.setMobileDataIndicators(
1539af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            show,
1540af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            iconId,
1541af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            mDemoInetCondition == 0,
1542af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            mDemoDataTypeIconId,
1543af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            "Demo",
1544af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                            "Demo");
1545af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                }
1546af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            }
1547af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
1548af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
1549af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock}
1550