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