blob: 9ef9d0da306fe34ac32ccd949841834335865b17 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Joe Onorato798ac4c2010-05-27 16:39:00 -040017package com.android.systemui.statusbar.policy;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080018
Joe Onorato798ac4c2010-05-27 16:39:00 -040019import android.app.StatusBarManager;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080020import android.app.AlertDialog;
21import android.bluetooth.BluetoothA2dp;
Nick Pellybd022f42009-08-14 18:33:38 -070022import android.bluetooth.BluetoothAdapter;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080023import android.bluetooth.BluetoothHeadset;
Jiafa Liu3f416732009-07-02 16:36:02 +080024import android.bluetooth.BluetoothPbap;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080025import android.content.BroadcastReceiver;
Daniel Sandler0e9d2af2010-01-25 11:33:03 -050026import android.content.ContentResolver;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080027import android.content.Context;
28import android.content.DialogInterface;
29import android.content.Intent;
30import android.content.IntentFilter;
31import android.content.res.TypedArray;
32import android.graphics.PixelFormat;
Daniel Sandler2c195f72010-05-21 15:42:06 -040033import android.graphics.Typeface;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080034import android.graphics.drawable.Drawable;
Mike Lockwood00b74272010-03-26 10:41:48 -040035import android.location.LocationManager;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080036import android.media.AudioManager;
Daniel Sandler0e9d2af2010-01-25 11:33:03 -050037import android.media.Ringtone;
38import android.media.RingtoneManager;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080039import android.net.NetworkInfo;
Daniel Sandler0e9d2af2010-01-25 11:33:03 -050040import android.net.Uri;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080041import android.net.wifi.WifiManager;
Dianne Hackborn4840e142009-03-24 22:40:29 -070042import android.os.Binder;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080043import android.os.Handler;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080044import android.os.Message;
Dianne Hackborn4840e142009-03-24 22:40:29 -070045import android.os.RemoteException;
San Mehat4154c072010-02-09 18:37:54 -080046import android.os.storage.StorageManager;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080047import android.provider.Settings;
48import android.telephony.PhoneStateListener;
49import android.telephony.ServiceState;
Wink Savillee9b06d72009-05-18 21:47:50 -070050import android.telephony.SignalStrength;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080051import android.telephony.TelephonyManager;
52import android.text.format.DateFormat;
Daniel Sandler2c195f72010-05-21 15:42:06 -040053import android.text.style.CharacterStyle;
Eric Fischer36e136c2010-01-14 17:42:48 -080054import android.text.style.RelativeSizeSpan;
Daniel Sandler2c195f72010-05-21 15:42:06 -040055import android.text.style.ForegroundColorSpan;
56import android.text.style.StyleSpan;
Eric Fischer36e136c2010-01-14 17:42:48 -080057import android.text.Spannable;
58import android.text.SpannableStringBuilder;
Joe Onorato8a9b2202010-02-26 18:56:32 -080059import android.util.Slog;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080060import android.view.View;
61import android.view.ViewGroup;
62import android.view.WindowManager;
63import android.view.WindowManagerImpl;
64import android.widget.ImageView;
65import android.widget.LinearLayout;
66import android.widget.TextView;
67
Wink Saville04e71b32009-04-02 11:00:54 -070068import com.android.internal.app.IBatteryStats;
Wink Saville04e71b32009-04-02 11:00:54 -070069import com.android.internal.telephony.IccCard;
70import com.android.internal.telephony.TelephonyIntents;
Wink Savillee9b06d72009-05-18 21:47:50 -070071import com.android.internal.telephony.cdma.EriInfo;
Wink Saville04e71b32009-04-02 11:00:54 -070072import com.android.internal.telephony.cdma.TtyIntent;
73import com.android.server.am.BatteryStatsService;
74
Joe Onorato798ac4c2010-05-27 16:39:00 -040075import com.android.systemui.R;
76
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080077/**
78 * This class contains all of the policy about which icons are installed in the status
Joe Onorato798ac4c2010-05-27 16:39:00 -040079 * bar at boot time. It goes through the normal API for icons, even though it probably
80 * strictly doesn't need to.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080081 */
82public class StatusBarPolicy {
83 private static final String TAG = "StatusBarPolicy";
84
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080085 // message codes for the handler
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080086 private static final int EVENT_BATTERY_CLOSE = 4;
87
Daniel Sandler2c195f72010-05-21 15:42:06 -040088 private static final int AM_PM_STYLE_NORMAL = 0;
89 private static final int AM_PM_STYLE_SMALL = 1;
90 private static final int AM_PM_STYLE_GONE = 2;
91
92 private static final int AM_PM_STYLE = AM_PM_STYLE_GONE;
93
Dianne Hackborn4840e142009-03-24 22:40:29 -070094 private final Context mContext;
Joe Onorato798ac4c2010-05-27 16:39:00 -040095 private final StatusBarManager mService;
Dianne Hackborn4840e142009-03-24 22:40:29 -070096 private final Handler mHandler = new StatusBarHandler();
97 private final IBatteryStats mBatteryStats;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080098
San Mehat4154c072010-02-09 18:37:54 -080099 // storage
100 private StorageManager mStorageManager;
101
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800102 // battery
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800103 private boolean mBatteryFirst = true;
104 private boolean mBatteryPlugged;
105 private int mBatteryLevel;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800106 private AlertDialog mLowBatteryDialog;
107 private TextView mBatteryLevelTextView;
108 private View mBatteryView;
109 private int mBatteryViewSequence;
110 private boolean mBatteryShowLowOnEndCall = false;
111 private static final boolean SHOW_LOW_BATTERY_WARNING = true;
Daniel Sandler0e9d2af2010-01-25 11:33:03 -0500112 private static final boolean SHOW_BATTERY_WARNINGS_IN_CALL = true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800113
114 // phone
115 private TelephonyManager mPhone;
Joe Onorato0cbda992010-05-02 16:28:15 -0700116 private int mPhoneSignalIconId;
Wink Saville04e71b32009-04-02 11:00:54 -0700117
118 //***** Signal strength icons
Wink Saville04e71b32009-04-02 11:00:54 -0700119 //GSM/UMTS
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800120 private static final int[] sSignalImages = new int[] {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400121 R.drawable.stat_sys_signal_0,
122 R.drawable.stat_sys_signal_1,
123 R.drawable.stat_sys_signal_2,
124 R.drawable.stat_sys_signal_3,
125 R.drawable.stat_sys_signal_4
Wink Savillee9b06d72009-05-18 21:47:50 -0700126 };
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800127 private static final int[] sSignalImages_r = new int[] {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400128 R.drawable.stat_sys_r_signal_0,
129 R.drawable.stat_sys_r_signal_1,
130 R.drawable.stat_sys_r_signal_2,
131 R.drawable.stat_sys_r_signal_3,
132 R.drawable.stat_sys_r_signal_4
Wink Savillee9b06d72009-05-18 21:47:50 -0700133 };
Wink Savillee9b06d72009-05-18 21:47:50 -0700134 private static final int[] sRoamingIndicatorImages_cdma = new int[] {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400135 R.drawable.stat_sys_roaming_cdma_0, //Standard Roaming Indicator
Wink Savillee9b06d72009-05-18 21:47:50 -0700136 // 1 is Standard Roaming Indicator OFF
137 // TODO T: image never used, remove and put 0 instead?
Joe Onorato798ac4c2010-05-27 16:39:00 -0400138 R.drawable.stat_sys_roaming_cdma_0,
Wink Savillee9b06d72009-05-18 21:47:50 -0700139
140 // 2 is Standard Roaming Indicator FLASHING
141 // TODO T: image never used, remove and put 0 instead?
Joe Onorato798ac4c2010-05-27 16:39:00 -0400142 R.drawable.stat_sys_roaming_cdma_0,
Wink Savillee9b06d72009-05-18 21:47:50 -0700143
144 // 3-12 Standard ERI
Joe Onorato798ac4c2010-05-27 16:39:00 -0400145 R.drawable.stat_sys_roaming_cdma_0, //3
146 R.drawable.stat_sys_roaming_cdma_0,
147 R.drawable.stat_sys_roaming_cdma_0,
148 R.drawable.stat_sys_roaming_cdma_0,
149 R.drawable.stat_sys_roaming_cdma_0,
150 R.drawable.stat_sys_roaming_cdma_0,
151 R.drawable.stat_sys_roaming_cdma_0,
152 R.drawable.stat_sys_roaming_cdma_0,
153 R.drawable.stat_sys_roaming_cdma_0,
154 R.drawable.stat_sys_roaming_cdma_0,
Wink Savillee9b06d72009-05-18 21:47:50 -0700155
156 // 13-63 Reserved for Standard ERI
Joe Onorato798ac4c2010-05-27 16:39:00 -0400157 R.drawable.stat_sys_roaming_cdma_0, //13
158 R.drawable.stat_sys_roaming_cdma_0,
159 R.drawable.stat_sys_roaming_cdma_0,
160 R.drawable.stat_sys_roaming_cdma_0,
161 R.drawable.stat_sys_roaming_cdma_0,
162 R.drawable.stat_sys_roaming_cdma_0,
163 R.drawable.stat_sys_roaming_cdma_0,
164 R.drawable.stat_sys_roaming_cdma_0,
165 R.drawable.stat_sys_roaming_cdma_0,
166 R.drawable.stat_sys_roaming_cdma_0,
167 R.drawable.stat_sys_roaming_cdma_0,
168 R.drawable.stat_sys_roaming_cdma_0,
169 R.drawable.stat_sys_roaming_cdma_0,
170 R.drawable.stat_sys_roaming_cdma_0,
171 R.drawable.stat_sys_roaming_cdma_0,
172 R.drawable.stat_sys_roaming_cdma_0,
173 R.drawable.stat_sys_roaming_cdma_0,
174 R.drawable.stat_sys_roaming_cdma_0,
175 R.drawable.stat_sys_roaming_cdma_0,
176 R.drawable.stat_sys_roaming_cdma_0,
177 R.drawable.stat_sys_roaming_cdma_0,
178 R.drawable.stat_sys_roaming_cdma_0,
179 R.drawable.stat_sys_roaming_cdma_0,
180 R.drawable.stat_sys_roaming_cdma_0,
181 R.drawable.stat_sys_roaming_cdma_0,
182 R.drawable.stat_sys_roaming_cdma_0,
183 R.drawable.stat_sys_roaming_cdma_0,
184 R.drawable.stat_sys_roaming_cdma_0,
185 R.drawable.stat_sys_roaming_cdma_0,
186 R.drawable.stat_sys_roaming_cdma_0,
187 R.drawable.stat_sys_roaming_cdma_0,
188 R.drawable.stat_sys_roaming_cdma_0,
189 R.drawable.stat_sys_roaming_cdma_0,
190 R.drawable.stat_sys_roaming_cdma_0,
191 R.drawable.stat_sys_roaming_cdma_0,
192 R.drawable.stat_sys_roaming_cdma_0,
193 R.drawable.stat_sys_roaming_cdma_0,
194 R.drawable.stat_sys_roaming_cdma_0,
195 R.drawable.stat_sys_roaming_cdma_0,
196 R.drawable.stat_sys_roaming_cdma_0,
197 R.drawable.stat_sys_roaming_cdma_0,
198 R.drawable.stat_sys_roaming_cdma_0,
199 R.drawable.stat_sys_roaming_cdma_0,
200 R.drawable.stat_sys_roaming_cdma_0,
201 R.drawable.stat_sys_roaming_cdma_0,
202 R.drawable.stat_sys_roaming_cdma_0,
203 R.drawable.stat_sys_roaming_cdma_0,
204 R.drawable.stat_sys_roaming_cdma_0,
205 R.drawable.stat_sys_roaming_cdma_0,
206 R.drawable.stat_sys_roaming_cdma_0,
207 R.drawable.stat_sys_roaming_cdma_0,
Wink Savillee9b06d72009-05-18 21:47:50 -0700208
209 // 64-127 Reserved for Non Standard (Operator Specific) ERI
Joe Onorato798ac4c2010-05-27 16:39:00 -0400210 R.drawable.stat_sys_roaming_cdma_0, //64
211 R.drawable.stat_sys_roaming_cdma_0,
212 R.drawable.stat_sys_roaming_cdma_0,
213 R.drawable.stat_sys_roaming_cdma_0,
214 R.drawable.stat_sys_roaming_cdma_0,
215 R.drawable.stat_sys_roaming_cdma_0,
216 R.drawable.stat_sys_roaming_cdma_0,
217 R.drawable.stat_sys_roaming_cdma_0,
218 R.drawable.stat_sys_roaming_cdma_0,
219 R.drawable.stat_sys_roaming_cdma_0,
220 R.drawable.stat_sys_roaming_cdma_0,
221 R.drawable.stat_sys_roaming_cdma_0,
222 R.drawable.stat_sys_roaming_cdma_0,
223 R.drawable.stat_sys_roaming_cdma_0,
224 R.drawable.stat_sys_roaming_cdma_0,
225 R.drawable.stat_sys_roaming_cdma_0,
226 R.drawable.stat_sys_roaming_cdma_0,
227 R.drawable.stat_sys_roaming_cdma_0,
228 R.drawable.stat_sys_roaming_cdma_0,
229 R.drawable.stat_sys_roaming_cdma_0 //83
Wink Savillee9b06d72009-05-18 21:47:50 -0700230
231 // 128-255 Reserved
Wink Saville04e71b32009-04-02 11:00:54 -0700232 };
Wink Saville04e71b32009-04-02 11:00:54 -0700233
234 //***** Data connection icons
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800235 private int[] mDataIconList = sDataNetType_g;
Wink Saville04e71b32009-04-02 11:00:54 -0700236 //GSM/UMTS
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800237 private static final int[] sDataNetType_g = new int[] {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400238 R.drawable.stat_sys_data_connected_g,
239 R.drawable.stat_sys_data_in_g,
240 R.drawable.stat_sys_data_out_g,
241 R.drawable.stat_sys_data_inandout_g,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800242 };
243 private static final int[] sDataNetType_3g = new int[] {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400244 R.drawable.stat_sys_data_connected_3g,
245 R.drawable.stat_sys_data_in_3g,
246 R.drawable.stat_sys_data_out_3g,
247 R.drawable.stat_sys_data_inandout_3g,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800248 };
249 private static final int[] sDataNetType_e = new int[] {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400250 R.drawable.stat_sys_data_connected_e,
251 R.drawable.stat_sys_data_in_e,
252 R.drawable.stat_sys_data_out_e,
253 R.drawable.stat_sys_data_inandout_e,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800254 };
Li Zheebe66342009-08-14 19:22:16 +0800255 //3.5G
256 private static final int[] sDataNetType_h = new int[] {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400257 R.drawable.stat_sys_data_connected_h,
258 R.drawable.stat_sys_data_in_h,
259 R.drawable.stat_sys_data_out_h,
260 R.drawable.stat_sys_data_inandout_h,
Li Zheebe66342009-08-14 19:22:16 +0800261 };
262
Wink Saville04e71b32009-04-02 11:00:54 -0700263 //CDMA
johnwang9f87cb22009-08-25 15:25:37 -0700264 // Use 3G icons for EVDO data and 1x icons for 1XRTT data
265 private static final int[] sDataNetType_1x = new int[] {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400266 R.drawable.stat_sys_data_connected_1x,
267 R.drawable.stat_sys_data_in_1x,
268 R.drawable.stat_sys_data_out_1x,
269 R.drawable.stat_sys_data_inandout_1x,
Wink Saville04e71b32009-04-02 11:00:54 -0700270 };
271
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800272 // Assume it's all good unless we hear otherwise. We don't always seem
273 // to get broadcasts that it *is* there.
Wink Saville04e71b32009-04-02 11:00:54 -0700274 IccCard.State mSimState = IccCard.State.READY;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800275 int mPhoneState = TelephonyManager.CALL_STATE_IDLE;
276 int mDataState = TelephonyManager.DATA_DISCONNECTED;
277 int mDataActivity = TelephonyManager.DATA_ACTIVITY_NONE;
278 ServiceState mServiceState;
Wink Savillee9b06d72009-05-18 21:47:50 -0700279 SignalStrength mSignalStrength;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800280
281 // data connection
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800282 private boolean mDataIconVisible;
John Wang33e21fc2009-10-08 10:35:27 -0700283 private boolean mHspaDataDistinguishable;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800284
285 // ringer volume
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800286 private boolean mVolumeVisible;
Wink Saville04e71b32009-04-02 11:00:54 -0700287
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800288 // bluetooth device status
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800289 private int mBluetoothHeadsetState;
Jaikumar Ganesh084c6652009-12-07 10:58:18 -0800290 private boolean mBluetoothA2dpConnected;
Jiafa Liu3f416732009-07-02 16:36:02 +0800291 private int mBluetoothPbapState;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800292 private boolean mBluetoothEnabled;
293
294 // wifi
295 private static final int[] sWifiSignalImages = new int[] {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400296 R.drawable.stat_sys_wifi_signal_1,
297 R.drawable.stat_sys_wifi_signal_2,
298 R.drawable.stat_sys_wifi_signal_3,
299 R.drawable.stat_sys_wifi_signal_4,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800300 };
301 private static final int sWifiTemporarilyNotConnectedImage =
Joe Onorato798ac4c2010-05-27 16:39:00 -0400302 R.drawable.stat_sys_wifi_signal_0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800303
304 private int mLastWifiSignalLevel = -1;
305 private boolean mIsWifiConnected = false;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800306
307 // sync state
308 // If sync is active the SyncActive icon is displayed. If sync is not active but
309 // sync is failing the SyncFailing icon is displayed. Otherwise neither are displayed.
Wink Savillee9b06d72009-05-18 21:47:50 -0700310
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800311 private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
312 @Override
313 public void onReceive(Context context, Intent intent) {
314 String action = intent.getAction();
Joe Onorato263700d2010-05-14 11:54:53 -0700315 if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
Dianne Hackborn8ec5b832009-07-01 21:19:35 -0700316 updateBattery(intent);
317 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800318 else if (action.equals(Intent.ACTION_ALARM_CHANGED)) {
319 updateAlarm(intent);
320 }
321 else if (action.equals(Intent.ACTION_SYNC_STATE_CHANGED)) {
322 updateSyncState(intent);
323 }
Mihai Predaa82842f2009-04-29 15:05:56 +0200324 else if (action.equals(Intent.ACTION_BATTERY_LOW)) {
325 onBatteryLow(intent);
326 }
Mike Lockwood69eb0bf2009-08-01 23:02:28 -0400327 else if (action.equals(Intent.ACTION_BATTERY_OKAY)
328 || action.equals(Intent.ACTION_POWER_CONNECTED)) {
Dianne Hackborn8ec5b832009-07-01 21:19:35 -0700329 onBatteryOkay(intent);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800330 }
Nick Pellyde893f52009-09-08 13:15:33 -0700331 else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED) ||
Nick Pelly005b2282009-09-10 10:21:56 -0700332 action.equals(BluetoothHeadset.ACTION_STATE_CHANGED) ||
333 action.equals(BluetoothA2dp.ACTION_SINK_STATE_CHANGED) ||
Jiafa Liu3f416732009-07-02 16:36:02 +0800334 action.equals(BluetoothPbap.PBAP_STATE_CHANGED_ACTION)) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800335 updateBluetooth(intent);
336 }
337 else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION) ||
338 action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION) ||
339 action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
340 updateWifi(intent);
341 }
Mike Lockwood00b74272010-03-26 10:41:48 -0400342 else if (action.equals(LocationManager.GPS_ENABLED_CHANGE_ACTION) ||
343 action.equals(LocationManager.GPS_FIX_CHANGE_ACTION)) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800344 updateGps(intent);
345 }
346 else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION) ||
347 action.equals(AudioManager.VIBRATE_SETTING_CHANGED_ACTION)) {
348 updateVolume();
349 }
350 else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
351 updateSimState(intent);
352 }
Wink Saville04e71b32009-04-02 11:00:54 -0700353 else if (action.equals(TtyIntent.TTY_ENABLED_CHANGE_ACTION)) {
354 updateTTY(intent);
355 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800356 }
357 };
358
Joe Onorato798ac4c2010-05-27 16:39:00 -0400359 public StatusBarPolicy(Context context) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800360 mContext = context;
Joe Onorato798ac4c2010-05-27 16:39:00 -0400361 mService = (StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE);
Wink Savillee9b06d72009-05-18 21:47:50 -0700362 mSignalStrength = new SignalStrength();
Dianne Hackborn4840e142009-03-24 22:40:29 -0700363 mBatteryStats = BatteryStatsService.getService();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800364
San Mehat4154c072010-02-09 18:37:54 -0800365 // storage
366 mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
367 mStorageManager.registerListener(
368 new com.android.server.status.StorageNotification(context));
369
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800370 // battery
Joe Onorato798ac4c2010-05-27 16:39:00 -0400371 mService.setIcon("battery", com.android.internal.R.drawable.stat_sys_battery_unknown, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800372
373 // phone_signal
374 mPhone = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
Joe Onorato798ac4c2010-05-27 16:39:00 -0400375 mPhoneSignalIconId = R.drawable.stat_sys_signal_null;
376 mService.setIcon("phone_signal", mPhoneSignalIconId, 0);
Wink Savillee9b06d72009-05-18 21:47:50 -0700377
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800378 // register for phone state notifications.
379 ((TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE))
380 .listen(mPhoneStateListener,
381 PhoneStateListener.LISTEN_SERVICE_STATE
Wink Savillee9b06d72009-05-18 21:47:50 -0700382 | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800383 | PhoneStateListener.LISTEN_CALL_STATE
384 | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
385 | PhoneStateListener.LISTEN_DATA_ACTIVITY);
386
387 // data_connection
Joe Onorato798ac4c2010-05-27 16:39:00 -0400388 mService.setIcon("data_connection", R.drawable.stat_sys_data_connected_g, 0);
389 mService.setIconVisibility("data_connection", false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800390
391 // wifi
Joe Onorato798ac4c2010-05-27 16:39:00 -0400392 mService.setIcon("wifi", sWifiSignalImages[0], 0);
393 mService.setIconVisibility("wifi", false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800394 // wifi will get updated by the sticky intents
Wink Saville04e71b32009-04-02 11:00:54 -0700395
396 // TTY status
Joe Onorato798ac4c2010-05-27 16:39:00 -0400397 mService.setIcon("tty", R.drawable.stat_sys_tty_mode, 0);
398 mService.setIconVisibility("tty", false);
Wink Saville04e71b32009-04-02 11:00:54 -0700399
Wink Savillee9b06d72009-05-18 21:47:50 -0700400 // Cdma Roaming Indicator, ERI
Joe Onorato798ac4c2010-05-27 16:39:00 -0400401 mService.setIcon("cdma_eri", R.drawable.stat_sys_roaming_cdma_0, 0);
402 mService.setIconVisibility("cdma_eri", false);
Wink Savillee9b06d72009-05-18 21:47:50 -0700403
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800404 // bluetooth status
Joe Onorato798ac4c2010-05-27 16:39:00 -0400405 mService.setIcon("bluetooth", R.drawable.stat_sys_data_bluetooth, 0);
Nick Pellyf242b7b2009-10-08 00:12:45 +0200406 BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
Nick Pellybd022f42009-08-14 18:33:38 -0700407 if (adapter != null) {
408 mBluetoothEnabled = adapter.isEnabled();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800409 } else {
410 mBluetoothEnabled = false;
411 }
Jaikumar Ganesh084c6652009-12-07 10:58:18 -0800412 mBluetoothA2dpConnected = false;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800413 mBluetoothHeadsetState = BluetoothHeadset.STATE_DISCONNECTED;
Jiafa Liu3f416732009-07-02 16:36:02 +0800414 mBluetoothPbapState = BluetoothPbap.STATE_DISCONNECTED;
Joe Onorato0cbda992010-05-02 16:28:15 -0700415 mService.setIconVisibility("bluetooth", mBluetoothEnabled);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800416
417 // Gps status
Joe Onorato798ac4c2010-05-27 16:39:00 -0400418 mService.setIcon("gps", R.drawable.stat_sys_gps_acquiring_anim, 0);
419 mService.setIconVisibility("gps", false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800420
421 // Alarm clock
Joe Onorato798ac4c2010-05-27 16:39:00 -0400422 mService.setIcon("alarm_clock", R.drawable.stat_notify_alarm, 0);
423 mService.setIconVisibility("alarm_clock", false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800424
425 // Sync state
Joe Onorato798ac4c2010-05-27 16:39:00 -0400426 mService.setIcon("sync_active", com.android.internal.R.drawable.stat_notify_sync_anim0, 0);
427 mService.setIcon("sync_failing", com.android.internal.R.drawable.stat_notify_sync_error, 0);
428 mService.setIconVisibility("sync_active", false);
429 mService.setIconVisibility("sync_failing", false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800430
431 // volume
Joe Onorato798ac4c2010-05-27 16:39:00 -0400432 mService.setIcon("volume", R.drawable.stat_sys_ringer_silent, 0);
433 mService.setIconVisibility("volume", false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800434 updateVolume();
johnwang347c5a22009-08-24 22:11:11 -0700435
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800436 IntentFilter filter = new IntentFilter();
437
438 // Register for Intent broadcasts for...
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800439 filter.addAction(Intent.ACTION_BATTERY_CHANGED);
Mihai Predaa82842f2009-04-29 15:05:56 +0200440 filter.addAction(Intent.ACTION_BATTERY_LOW);
Dianne Hackborn8ec5b832009-07-01 21:19:35 -0700441 filter.addAction(Intent.ACTION_BATTERY_OKAY);
Mike Lockwood69eb0bf2009-08-01 23:02:28 -0400442 filter.addAction(Intent.ACTION_POWER_CONNECTED);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800443 filter.addAction(Intent.ACTION_ALARM_CHANGED);
444 filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED);
445 filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
446 filter.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION);
Nick Pellyde893f52009-09-08 13:15:33 -0700447 filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
Nick Pelly005b2282009-09-10 10:21:56 -0700448 filter.addAction(BluetoothHeadset.ACTION_STATE_CHANGED);
449 filter.addAction(BluetoothA2dp.ACTION_SINK_STATE_CHANGED);
Jiafa Liu3f416732009-07-02 16:36:02 +0800450 filter.addAction(BluetoothPbap.PBAP_STATE_CHANGED_ACTION);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800451 filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
452 filter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
453 filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
454 filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
Mike Lockwood00b74272010-03-26 10:41:48 -0400455 filter.addAction(LocationManager.GPS_ENABLED_CHANGE_ACTION);
456 filter.addAction(LocationManager.GPS_FIX_CHANGE_ACTION);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800457 filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
Wink Saville04e71b32009-04-02 11:00:54 -0700458 filter.addAction(TtyIntent.TTY_ENABLED_CHANGE_ACTION);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800459 mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
John Wang33e21fc2009-10-08 10:35:27 -0700460
461 // load config to determine if to distinguish Hspa data icon
462 try {
463 mHspaDataDistinguishable = mContext.getResources().getBoolean(
Joe Onorato798ac4c2010-05-27 16:39:00 -0400464 R.bool.config_hspa_data_distinguishable);
John Wang33e21fc2009-10-08 10:35:27 -0700465 } catch (Exception e) {
466 mHspaDataDistinguishable = false;
467 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800468 }
469
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800470 private final void updateAlarm(Intent intent) {
471 boolean alarmSet = intent.getBooleanExtra("alarmSet", false);
Joe Onorato0cbda992010-05-02 16:28:15 -0700472 mService.setIconVisibility("alarm_clock", alarmSet);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800473 }
474
475 private final void updateSyncState(Intent intent) {
476 boolean isActive = intent.getBooleanExtra("active", false);
477 boolean isFailing = intent.getBooleanExtra("failing", false);
Joe Onorato0cbda992010-05-02 16:28:15 -0700478 mService.setIconVisibility("sync_active", isActive);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800479 // Don't display sync failing icon: BUG 1297963 Set sync error timeout to "never"
Joe Onorato0cbda992010-05-02 16:28:15 -0700480 //mService.setIconVisibility("sync_failing", isFailing && !isActive);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800481 }
482
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800483 private final void updateBattery(Intent intent) {
Joe Onorato0cbda992010-05-02 16:28:15 -0700484 final int id = intent.getIntExtra("icon-small", 0);
485 int level = intent.getIntExtra("level", 0);
Joe Onorato798ac4c2010-05-27 16:39:00 -0400486 mService.setIcon("battery", id, level);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800487
488 boolean plugged = intent.getIntExtra("plugged", 0) != 0;
Joe Onorato0cbda992010-05-02 16:28:15 -0700489 level = intent.getIntExtra("level", -1);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800490 if (false) {
Joe Onorato8a9b2202010-02-26 18:56:32 -0800491 Slog.d(TAG, "updateBattery level=" + level
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800492 + " plugged=" + plugged
493 + " mBatteryPlugged=" + mBatteryPlugged
494 + " mBatteryLevel=" + mBatteryLevel
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800495 + " mBatteryFirst=" + mBatteryFirst);
496 }
497
498 boolean oldPlugged = mBatteryPlugged;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800499
500 mBatteryPlugged = plugged;
501 mBatteryLevel = level;
502
503 if (mBatteryFirst) {
504 mBatteryFirst = false;
505 }
506 /*
507 * No longer showing the battery view because it draws attention away
508 * from the USB storage notification. We could still show it when
509 * connected to a brick, but that could lead to the user into thinking
510 * the device does not charge when plugged into USB (since he/she would
511 * not see the same battery screen on USB as he sees on brick).
512 */
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800513 if (false) {
Joe Onorato8a9b2202010-02-26 18:56:32 -0800514 Slog.d(TAG, "plugged=" + plugged + " oldPlugged=" + oldPlugged + " level=" + level);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800515 }
Mihai Predaa82842f2009-04-29 15:05:56 +0200516 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800517
Mihai Predaa82842f2009-04-29 15:05:56 +0200518 private void onBatteryLow(Intent intent) {
519 if (SHOW_LOW_BATTERY_WARNING) {
520 if (false) {
Joe Onorato8a9b2202010-02-26 18:56:32 -0800521 Slog.d(TAG, "mPhoneState=" + mPhoneState
Mihai Predaa82842f2009-04-29 15:05:56 +0200522 + " mLowBatteryDialog=" + mLowBatteryDialog
523 + " mBatteryShowLowOnEndCall=" + mBatteryShowLowOnEndCall);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800524 }
Mihai Predaa82842f2009-04-29 15:05:56 +0200525
Daniel Sandler0e9d2af2010-01-25 11:33:03 -0500526 if (SHOW_BATTERY_WARNINGS_IN_CALL || mPhoneState == TelephonyManager.CALL_STATE_IDLE) {
Mihai Predaa82842f2009-04-29 15:05:56 +0200527 showLowBatteryWarning();
528 } else {
529 mBatteryShowLowOnEndCall = true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800530 }
531 }
532 }
533
Dianne Hackborn8ec5b832009-07-01 21:19:35 -0700534 private void onBatteryOkay(Intent intent) {
535 if (mLowBatteryDialog != null
536 && SHOW_LOW_BATTERY_WARNING) {
537 mLowBatteryDialog.dismiss();
538 mBatteryShowLowOnEndCall = false;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800539 }
540 }
541
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800542 private void setBatteryLevel(View parent, int id, int height, int background, int level) {
543 ImageView v = (ImageView)parent.findViewById(id);
544 LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)v.getLayoutParams();
545 lp.weight = height;
546 if (background != 0) {
547 v.setBackgroundResource(background);
548 Drawable bkg = v.getBackground();
549 bkg.setLevel(level);
550 }
551 }
552
553 private void showLowBatteryWarning() {
554 closeLastBatteryView();
555
Mike Lockwoodd81b1f42009-09-25 09:32:19 -0400556 // Show exact battery level.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800557 CharSequence levelText = mContext.getString(
Joe Onorato798ac4c2010-05-27 16:39:00 -0400558 R.string.battery_low_percent_format, mBatteryLevel);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800559
560 if (mBatteryLevelTextView != null) {
561 mBatteryLevelTextView.setText(levelText);
562 } else {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400563 View v = View.inflate(mContext, R.layout.battery_low, null);
564 mBatteryLevelTextView=(TextView)v.findViewById(R.id.level_percent);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800565
566 mBatteryLevelTextView.setText(levelText);
567
568 AlertDialog.Builder b = new AlertDialog.Builder(mContext);
569 b.setCancelable(true);
Joe Onorato798ac4c2010-05-27 16:39:00 -0400570 b.setTitle(R.string.battery_low_title);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800571 b.setView(v);
572 b.setIcon(android.R.drawable.ic_dialog_alert);
573 b.setPositiveButton(android.R.string.ok, null);
johnwang347c5a22009-08-24 22:11:11 -0700574
Dianne Hackborn3d74bb42009-06-19 10:35:21 -0700575 final Intent intent = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY);
576 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
577 | Intent.FLAG_ACTIVITY_MULTIPLE_TASK
578 | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
579 | Intent.FLAG_ACTIVITY_NO_HISTORY);
580 if (intent.resolveActivity(mContext.getPackageManager()) != null) {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400581 b.setNegativeButton(R.string.battery_low_why,
Dianne Hackborn3d74bb42009-06-19 10:35:21 -0700582 new DialogInterface.OnClickListener() {
583 public void onClick(DialogInterface dialog, int which) {
584 mContext.startActivity(intent);
585 if (mLowBatteryDialog != null) {
586 mLowBatteryDialog.dismiss();
587 }
588 }
589 });
590 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800591
592 AlertDialog d = b.create();
593 d.setOnDismissListener(mLowBatteryListener);
594 d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
595 d.show();
596 mLowBatteryDialog = d;
597 }
Daniel Sandler0e9d2af2010-01-25 11:33:03 -0500598
599 final ContentResolver cr = mContext.getContentResolver();
600 if (Settings.System.getInt(cr,
John Wang56c2d2f2010-04-07 08:57:17 -0700601 Settings.System.POWER_SOUNDS_ENABLED, 1) == 1)
Daniel Sandler0e9d2af2010-01-25 11:33:03 -0500602 {
603 final String soundPath = Settings.System.getString(cr,
604 Settings.System.LOW_BATTERY_SOUND);
605 if (soundPath != null) {
606 final Uri soundUri = Uri.parse("file://" + soundPath);
607 if (soundUri != null) {
608 final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri);
Daniel Sandlerec2c88d2010-02-20 01:04:57 -0500609 if (sfx != null) {
610 sfx.setStreamType(AudioManager.STREAM_SYSTEM);
611 sfx.play();
612 }
Daniel Sandler0e9d2af2010-01-25 11:33:03 -0500613 }
614 }
615 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800616 }
617
618 private final void updateCallState(int state) {
619 mPhoneState = state;
620 if (false) {
Joe Onorato8a9b2202010-02-26 18:56:32 -0800621 Slog.d(TAG, "mPhoneState=" + mPhoneState
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800622 + " mLowBatteryDialog=" + mLowBatteryDialog
623 + " mBatteryShowLowOnEndCall=" + mBatteryShowLowOnEndCall);
624 }
625 if (mPhoneState == TelephonyManager.CALL_STATE_IDLE) {
626 if (mBatteryShowLowOnEndCall) {
627 if (!mBatteryPlugged) {
628 showLowBatteryWarning();
629 }
630 mBatteryShowLowOnEndCall = false;
631 }
632 } else {
633 if (mLowBatteryDialog != null) {
634 mLowBatteryDialog.dismiss();
635 mBatteryShowLowOnEndCall = true;
636 }
637 }
638 }
639
640 private DialogInterface.OnDismissListener mLowBatteryListener
641 = new DialogInterface.OnDismissListener() {
642 public void onDismiss(DialogInterface dialog) {
643 mLowBatteryDialog = null;
644 mBatteryLevelTextView = null;
645 }
646 };
647
648 private void scheduleCloseBatteryView() {
649 Message m = mHandler.obtainMessage(EVENT_BATTERY_CLOSE);
650 m.arg1 = (++mBatteryViewSequence);
651 mHandler.sendMessageDelayed(m, 3000);
652 }
653
654 private void closeLastBatteryView() {
655 if (mBatteryView != null) {
656 //mBatteryView.debug();
657 WindowManagerImpl.getDefault().removeView(mBatteryView);
658 mBatteryView = null;
659 }
660 }
661
662 private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
663 @Override
Wink Savillee9b06d72009-05-18 21:47:50 -0700664 public void onSignalStrengthsChanged(SignalStrength signalStrength) {
665 mSignalStrength = signalStrength;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800666 updateSignalStrength();
667 }
668
669 @Override
670 public void onServiceStateChanged(ServiceState state) {
671 mServiceState = state;
672 updateSignalStrength();
Robert Greenwalt98e0b142009-10-08 21:15:52 -0700673 updateCdmaRoamingIcon(state);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800674 updateDataIcon();
675 }
676
677 @Override
678 public void onCallStateChanged(int state, String incomingNumber) {
679 updateCallState(state);
johnwang347c5a22009-08-24 22:11:11 -0700680 // In cdma, if a voice call is made, RSSI should switch to 1x.
681 if (isCdma()) {
682 updateSignalStrength();
683 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800684 }
685
686 @Override
Robert Greenwalt98e0b142009-10-08 21:15:52 -0700687 public void onDataConnectionStateChanged(int state, int networkType) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800688 mDataState = state;
Robert Greenwalt98e0b142009-10-08 21:15:52 -0700689 updateDataNetType(networkType);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800690 updateDataIcon();
691 }
692
693 @Override
694 public void onDataActivity(int direction) {
695 mDataActivity = direction;
696 updateDataIcon();
697 }
698 };
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800699
700 private final void updateSimState(Intent intent) {
Wink Saville04e71b32009-04-02 11:00:54 -0700701 String stateExtra = intent.getStringExtra(IccCard.INTENT_KEY_ICC_STATE);
702 if (IccCard.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)) {
703 mSimState = IccCard.State.ABSENT;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800704 }
Wink Saville04e71b32009-04-02 11:00:54 -0700705 else if (IccCard.INTENT_VALUE_ICC_READY.equals(stateExtra)) {
706 mSimState = IccCard.State.READY;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800707 }
Wink Saville04e71b32009-04-02 11:00:54 -0700708 else if (IccCard.INTENT_VALUE_ICC_LOCKED.equals(stateExtra)) {
709 final String lockedReason = intent.getStringExtra(IccCard.INTENT_KEY_LOCKED_REASON);
710 if (IccCard.INTENT_VALUE_LOCKED_ON_PIN.equals(lockedReason)) {
711 mSimState = IccCard.State.PIN_REQUIRED;
johnwang347c5a22009-08-24 22:11:11 -0700712 }
Wink Saville04e71b32009-04-02 11:00:54 -0700713 else if (IccCard.INTENT_VALUE_LOCKED_ON_PUK.equals(lockedReason)) {
714 mSimState = IccCard.State.PUK_REQUIRED;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800715 }
716 else {
Wink Saville04e71b32009-04-02 11:00:54 -0700717 mSimState = IccCard.State.NETWORK_LOCKED;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800718 }
719 } else {
Wink Saville04e71b32009-04-02 11:00:54 -0700720 mSimState = IccCard.State.UNKNOWN;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800721 }
722 updateDataIcon();
723 }
724
Wink Savillee9b06d72009-05-18 21:47:50 -0700725 private boolean isCdma() {
Robert Greenwalt98e0b142009-10-08 21:15:52 -0700726 return (mSignalStrength != null) && !mSignalStrength.isGsm();
Wink Savillee9b06d72009-05-18 21:47:50 -0700727 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800728
johnwang347c5a22009-08-24 22:11:11 -0700729 private boolean isEvdo() {
730 return ( (mServiceState != null)
731 && ((mServiceState.getRadioTechnology()
732 == ServiceState.RADIO_TECHNOLOGY_EVDO_0)
733 || (mServiceState.getRadioTechnology()
Naveen Kalla0a5174a2010-04-21 14:48:03 -0700734 == ServiceState.RADIO_TECHNOLOGY_EVDO_A)
735 || (mServiceState.getRadioTechnology()
736 == ServiceState.RADIO_TECHNOLOGY_EVDO_B)));
johnwang347c5a22009-08-24 22:11:11 -0700737 }
738
Wink Savillee9b06d72009-05-18 21:47:50 -0700739 private boolean hasService() {
740 if (mServiceState != null) {
741 switch (mServiceState.getState()) {
742 case ServiceState.STATE_OUT_OF_SERVICE:
743 case ServiceState.STATE_POWER_OFF:
744 return false;
745 default:
746 return true;
747 }
748 } else {
749 return false;
750 }
751 }
752
753 private final void updateSignalStrength() {
754 int iconLevel = -1;
Wink Savillee9b06d72009-05-18 21:47:50 -0700755 int[] iconList;
Wink Savillee9b06d72009-05-18 21:47:50 -0700756
John Wang56c2d2f2010-04-07 08:57:17 -0700757 // Display signal strength while in "emergency calls only" mode
758 if (!hasService() && !mServiceState.isEmergencyOnly()) {
Joe Onorato8a9b2202010-02-26 18:56:32 -0800759 //Slog.d(TAG, "updateSignalStrength: no service");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800760 if (Settings.System.getInt(mContext.getContentResolver(),
761 Settings.System.AIRPLANE_MODE_ON, 0) == 1) {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400762 mPhoneSignalIconId = R.drawable.stat_sys_signal_flightmode;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800763 } else {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400764 mPhoneSignalIconId = R.drawable.stat_sys_signal_null;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800765 }
Joe Onorato798ac4c2010-05-27 16:39:00 -0400766 mService.setIcon("phone_signal", mPhoneSignalIconId, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800767 return;
768 }
769
Wink Savillee9b06d72009-05-18 21:47:50 -0700770 if (!isCdma()) {
771 int asu = mSignalStrength.getGsmSignalStrength();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800772
Wink Savillee9b06d72009-05-18 21:47:50 -0700773 // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
774 // asu = 0 (-113dB or less) is very weak
775 // signal, its better to show 0 bars to the user in such cases.
776 // asu = 99 is a special case, where the signal strength is unknown.
jshee63e472010-03-18 11:14:42 -0700777 if (asu <= 2 || asu == 99) iconLevel = 0;
778 else if (asu >= 12) iconLevel = 4;
Wink Savillee9b06d72009-05-18 21:47:50 -0700779 else if (asu >= 8) iconLevel = 3;
jshee63e472010-03-18 11:14:42 -0700780 else if (asu >= 5) iconLevel = 2;
Wink Savillee9b06d72009-05-18 21:47:50 -0700781 else iconLevel = 1;
782
Robert Greenwalt98e0b142009-10-08 21:15:52 -0700783 // Though mPhone is a Manager, this call is not an IPC
Wink Savillee9b06d72009-05-18 21:47:50 -0700784 if (mPhone.isNetworkRoaming()) {
785 iconList = sSignalImages_r;
786 } else {
787 iconList = sSignalImages;
Wink Saville04e71b32009-04-02 11:00:54 -0700788 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800789 } else {
johnwang347c5a22009-08-24 22:11:11 -0700790 iconList = this.sSignalImages;
Wink Savillee9b06d72009-05-18 21:47:50 -0700791
johnwang347c5a22009-08-24 22:11:11 -0700792 // If 3G(EV) and 1x network are available than 3G should be
793 // displayed, displayed RSSI should be from the EV side.
794 // If a voice call is made then RSSI should switch to 1x.
795 if ((mPhoneState == TelephonyManager.CALL_STATE_IDLE) && isEvdo()){
796 iconLevel = getEvdoLevel();
797 if (false) {
Joe Onorato8a9b2202010-02-26 18:56:32 -0800798 Slog.d(TAG, "use Evdo level=" + iconLevel + " to replace Cdma Level=" + getCdmaLevel());
johnwang347c5a22009-08-24 22:11:11 -0700799 }
800 } else {
801 iconLevel = getCdmaLevel();
802 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800803 }
Joe Onorato0cbda992010-05-02 16:28:15 -0700804 mPhoneSignalIconId = iconList[iconLevel];
Joe Onorato798ac4c2010-05-27 16:39:00 -0400805 mService.setIcon("phone_signal", mPhoneSignalIconId, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800806 }
807
johnwang347c5a22009-08-24 22:11:11 -0700808 private int getCdmaLevel() {
809 final int cdmaDbm = mSignalStrength.getCdmaDbm();
810 final int cdmaEcio = mSignalStrength.getCdmaEcio();
811 int levelDbm = 0;
812 int levelEcio = 0;
813
814 if (cdmaDbm >= -75) levelDbm = 4;
815 else if (cdmaDbm >= -85) levelDbm = 3;
816 else if (cdmaDbm >= -95) levelDbm = 2;
817 else if (cdmaDbm >= -100) levelDbm = 1;
818 else levelDbm = 0;
819
820 // Ec/Io are in dB*10
821 if (cdmaEcio >= -90) levelEcio = 4;
822 else if (cdmaEcio >= -110) levelEcio = 3;
823 else if (cdmaEcio >= -130) levelEcio = 2;
824 else if (cdmaEcio >= -150) levelEcio = 1;
825 else levelEcio = 0;
826
827 return (levelDbm < levelEcio) ? levelDbm : levelEcio;
828 }
829
830 private int getEvdoLevel() {
831 int evdoDbm = mSignalStrength.getEvdoDbm();
832 int evdoSnr = mSignalStrength.getEvdoSnr();
833 int levelEvdoDbm = 0;
834 int levelEvdoSnr = 0;
835
836 if (evdoDbm >= -65) levelEvdoDbm = 4;
837 else if (evdoDbm >= -75) levelEvdoDbm = 3;
838 else if (evdoDbm >= -90) levelEvdoDbm = 2;
839 else if (evdoDbm >= -105) levelEvdoDbm = 1;
840 else levelEvdoDbm = 0;
841
John Michelau1336a562009-09-28 10:41:02 -0500842 if (evdoSnr >= 7) levelEvdoSnr = 4;
843 else if (evdoSnr >= 5) levelEvdoSnr = 3;
844 else if (evdoSnr >= 3) levelEvdoSnr = 2;
845 else if (evdoSnr >= 1) levelEvdoSnr = 1;
johnwang347c5a22009-08-24 22:11:11 -0700846 else levelEvdoSnr = 0;
847
848 return (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr;
849 }
850
Robert Greenwalt98e0b142009-10-08 21:15:52 -0700851 private final void updateDataNetType(int net) {
Wink Saville04e71b32009-04-02 11:00:54 -0700852 switch (net) {
Wink Saville04e71b32009-04-02 11:00:54 -0700853 case TelephonyManager.NETWORK_TYPE_EDGE:
854 mDataIconList = sDataNetType_e;
855 break;
856 case TelephonyManager.NETWORK_TYPE_UMTS:
857 mDataIconList = sDataNetType_3g;
858 break;
Li Zheebe66342009-08-14 19:22:16 +0800859 case TelephonyManager.NETWORK_TYPE_HSDPA:
860 case TelephonyManager.NETWORK_TYPE_HSUPA:
861 case TelephonyManager.NETWORK_TYPE_HSPA:
John Wang33e21fc2009-10-08 10:35:27 -0700862 if (mHspaDataDistinguishable) {
863 mDataIconList = sDataNetType_h;
864 } else {
865 mDataIconList = sDataNetType_3g;
866 }
Li Zheebe66342009-08-14 19:22:16 +0800867 break;
Wink Saville04e71b32009-04-02 11:00:54 -0700868 case TelephonyManager.NETWORK_TYPE_CDMA:
869 // display 1xRTT for IS95A/B
johnwang9f87cb22009-08-25 15:25:37 -0700870 mDataIconList = this.sDataNetType_1x;
Wink Saville04e71b32009-04-02 11:00:54 -0700871 break;
872 case TelephonyManager.NETWORK_TYPE_1xRTT:
johnwang9f87cb22009-08-25 15:25:37 -0700873 mDataIconList = this.sDataNetType_1x;
Wink Saville04e71b32009-04-02 11:00:54 -0700874 break;
875 case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through
876 case TelephonyManager.NETWORK_TYPE_EVDO_A:
Naveen Kalla0a5174a2010-04-21 14:48:03 -0700877 case TelephonyManager.NETWORK_TYPE_EVDO_B:
johnwang9f87cb22009-08-25 15:25:37 -0700878 mDataIconList = sDataNetType_3g;
Wink Saville04e71b32009-04-02 11:00:54 -0700879 break;
880 default:
881 mDataIconList = sDataNetType_g;
882 break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800883 }
884 }
885
886 private final void updateDataIcon() {
887 int iconId;
888 boolean visible = true;
889
Wink Savillee9b06d72009-05-18 21:47:50 -0700890 if (!isCdma()) {
891 // GSM case, we have to check also the sim state
892 if (mSimState == IccCard.State.READY || mSimState == IccCard.State.UNKNOWN) {
893 if (hasService() && mDataState == TelephonyManager.DATA_CONNECTED) {
894 switch (mDataActivity) {
895 case TelephonyManager.DATA_ACTIVITY_IN:
896 iconId = mDataIconList[1];
897 break;
898 case TelephonyManager.DATA_ACTIVITY_OUT:
899 iconId = mDataIconList[2];
900 break;
901 case TelephonyManager.DATA_ACTIVITY_INOUT:
902 iconId = mDataIconList[3];
903 break;
904 default:
905 iconId = mDataIconList[0];
906 break;
907 }
Joe Onorato798ac4c2010-05-27 16:39:00 -0400908 mService.setIcon("data_connection", iconId, 0);
Wink Savillee9b06d72009-05-18 21:47:50 -0700909 } else {
910 visible = false;
911 }
912 } else {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400913 iconId = R.drawable.stat_sys_no_sim;
914 mService.setIcon("data_connection", iconId, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800915 }
Wink Savillee9b06d72009-05-18 21:47:50 -0700916 } else {
917 // CDMA case, mDataActivity can be also DATA_ACTIVITY_DORMANT
918 if (hasService() && mDataState == TelephonyManager.DATA_CONNECTED) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800919 switch (mDataActivity) {
920 case TelephonyManager.DATA_ACTIVITY_IN:
Wink Savillee9b06d72009-05-18 21:47:50 -0700921 iconId = mDataIconList[1];
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800922 break;
923 case TelephonyManager.DATA_ACTIVITY_OUT:
Wink Savillee9b06d72009-05-18 21:47:50 -0700924 iconId = mDataIconList[2];
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800925 break;
926 case TelephonyManager.DATA_ACTIVITY_INOUT:
Wink Savillee9b06d72009-05-18 21:47:50 -0700927 iconId = mDataIconList[3];
928 break;
929 case TelephonyManager.DATA_ACTIVITY_DORMANT:
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800930 default:
Wink Savillee9b06d72009-05-18 21:47:50 -0700931 iconId = mDataIconList[0];
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800932 break;
933 }
Joe Onorato798ac4c2010-05-27 16:39:00 -0400934 mService.setIcon("data_connection", iconId, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800935 } else {
936 visible = false;
937 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800938 }
Wink Savillee9b06d72009-05-18 21:47:50 -0700939
Dianne Hackborn4840e142009-03-24 22:40:29 -0700940 long ident = Binder.clearCallingIdentity();
941 try {
Wink Saville04e71b32009-04-02 11:00:54 -0700942 mBatteryStats.notePhoneDataConnectionState(mPhone.getNetworkType(), visible);
Dianne Hackborn4840e142009-03-24 22:40:29 -0700943 } catch (RemoteException e) {
944 } finally {
945 Binder.restoreCallingIdentity(ident);
946 }
Wink Savillee9b06d72009-05-18 21:47:50 -0700947
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800948 if (mDataIconVisible != visible) {
Joe Onorato0cbda992010-05-02 16:28:15 -0700949 mService.setIconVisibility("data_connection", visible);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800950 mDataIconVisible = visible;
951 }
952 }
953
954 private final void updateVolume() {
955 AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
956 final int ringerMode = audioManager.getRingerMode();
957 final boolean visible = ringerMode == AudioManager.RINGER_MODE_SILENT ||
Wink Savillee9b06d72009-05-18 21:47:50 -0700958 ringerMode == AudioManager.RINGER_MODE_VIBRATE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800959 final int iconId = audioManager.shouldVibrate(AudioManager.VIBRATE_TYPE_RINGER)
Joe Onorato798ac4c2010-05-27 16:39:00 -0400960 ? R.drawable.stat_sys_ringer_vibrate
961 : R.drawable.stat_sys_ringer_silent;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800962
963 if (visible) {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400964 mService.setIcon("volume", iconId, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800965 }
966 if (visible != mVolumeVisible) {
Joe Onorato0cbda992010-05-02 16:28:15 -0700967 mService.setIconVisibility("volume", visible);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800968 mVolumeVisible = visible;
969 }
970 }
971
972 private final void updateBluetooth(Intent intent) {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400973 int iconId = R.drawable.stat_sys_data_bluetooth;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800974 String action = intent.getAction();
Nick Pellyde893f52009-09-08 13:15:33 -0700975 if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
Nick Pellyb24e11b2009-09-08 17:40:43 -0700976 int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
Nick Pellyde893f52009-09-08 13:15:33 -0700977 mBluetoothEnabled = state == BluetoothAdapter.STATE_ON;
Nick Pelly005b2282009-09-10 10:21:56 -0700978 } else if (action.equals(BluetoothHeadset.ACTION_STATE_CHANGED)) {
979 mBluetoothHeadsetState = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800980 BluetoothHeadset.STATE_ERROR);
Nick Pelly005b2282009-09-10 10:21:56 -0700981 } else if (action.equals(BluetoothA2dp.ACTION_SINK_STATE_CHANGED)) {
Jaikumar Ganesh084c6652009-12-07 10:58:18 -0800982 BluetoothA2dp a2dp = new BluetoothA2dp(mContext);
983 if (a2dp.getConnectedSinks().size() != 0) {
984 mBluetoothA2dpConnected = true;
985 } else {
986 mBluetoothA2dpConnected = false;
987 }
Jiafa Liu3f416732009-07-02 16:36:02 +0800988 } else if (action.equals(BluetoothPbap.PBAP_STATE_CHANGED_ACTION)) {
989 mBluetoothPbapState = intent.getIntExtra(BluetoothPbap.PBAP_STATE,
990 BluetoothPbap.STATE_DISCONNECTED);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800991 } else {
992 return;
993 }
Wink Savillee9b06d72009-05-18 21:47:50 -0700994
Jaikumar Ganesh084c6652009-12-07 10:58:18 -0800995 if (mBluetoothHeadsetState == BluetoothHeadset.STATE_CONNECTED || mBluetoothA2dpConnected ||
Jiafa Liu3f416732009-07-02 16:36:02 +0800996 mBluetoothPbapState == BluetoothPbap.STATE_CONNECTED) {
Joe Onorato798ac4c2010-05-27 16:39:00 -0400997 iconId = R.drawable.stat_sys_data_bluetooth_connected;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800998 }
999
Joe Onorato798ac4c2010-05-27 16:39:00 -04001000 mService.setIcon("bluetooth", iconId, 0);
Joe Onorato0cbda992010-05-02 16:28:15 -07001001 mService.setIconVisibility("bluetooth", mBluetoothEnabled);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001002 }
1003
1004 private final void updateWifi(Intent intent) {
1005 final String action = intent.getAction();
1006 if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
Wink Savillee9b06d72009-05-18 21:47:50 -07001007
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001008 final boolean enabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
1009 WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED;
Wink Savillee9b06d72009-05-18 21:47:50 -07001010
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001011 if (!enabled) {
1012 // If disabled, hide the icon. (We show icon when connected.)
Joe Onorato0cbda992010-05-02 16:28:15 -07001013 mService.setIconVisibility("wifi", false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001014 }
Wink Savillee9b06d72009-05-18 21:47:50 -07001015
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001016 } else if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
1017 final boolean enabled = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED,
1018 false);
1019 if (!enabled) {
Joe Onorato0cbda992010-05-02 16:28:15 -07001020 mService.setIconVisibility("wifi", false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001021 }
1022 } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
1023
Wink Savillee9b06d72009-05-18 21:47:50 -07001024 final NetworkInfo networkInfo = (NetworkInfo)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001025 intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
Wink Savillee9b06d72009-05-18 21:47:50 -07001026
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001027 int iconId;
1028 if (networkInfo != null && networkInfo.isConnected()) {
1029 mIsWifiConnected = true;
1030 if (mLastWifiSignalLevel == -1) {
1031 iconId = sWifiSignalImages[0];
1032 } else {
1033 iconId = sWifiSignalImages[mLastWifiSignalLevel];
1034 }
Wink Saville04e71b32009-04-02 11:00:54 -07001035
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001036 // Show the icon since wi-fi is connected
Joe Onorato0cbda992010-05-02 16:28:15 -07001037 mService.setIconVisibility("wifi", true);
Wink Saville04e71b32009-04-02 11:00:54 -07001038
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001039 } else {
1040 mLastWifiSignalLevel = -1;
1041 mIsWifiConnected = false;
1042 iconId = sWifiSignalImages[0];
1043
1044 // Hide the icon since we're not connected
Joe Onorato0cbda992010-05-02 16:28:15 -07001045 mService.setIconVisibility("wifi", false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001046 }
1047
Joe Onorato798ac4c2010-05-27 16:39:00 -04001048 mService.setIcon("wifi", iconId, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001049 } else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
Joe Onorato0cbda992010-05-02 16:28:15 -07001050 int iconId;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001051 final int newRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
1052 int newSignalLevel = WifiManager.calculateSignalLevel(newRssi,
1053 sWifiSignalImages.length);
1054 if (newSignalLevel != mLastWifiSignalLevel) {
1055 mLastWifiSignalLevel = newSignalLevel;
1056 if (mIsWifiConnected) {
Joe Onorato0cbda992010-05-02 16:28:15 -07001057 iconId = sWifiSignalImages[newSignalLevel];
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001058 } else {
Joe Onorato0cbda992010-05-02 16:28:15 -07001059 iconId = sWifiTemporarilyNotConnectedImage;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001060 }
Joe Onorato798ac4c2010-05-27 16:39:00 -04001061 mService.setIcon("wifi", iconId, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001062 }
1063 }
1064 }
1065
1066 private final void updateGps(Intent intent) {
1067 final String action = intent.getAction();
Mike Lockwood00b74272010-03-26 10:41:48 -04001068 final boolean enabled = intent.getBooleanExtra(LocationManager.EXTRA_GPS_ENABLED, false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001069
Mike Lockwood00b74272010-03-26 10:41:48 -04001070 if (action.equals(LocationManager.GPS_FIX_CHANGE_ACTION) && enabled) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001071 // GPS is getting fixes
Joe Onorato798ac4c2010-05-27 16:39:00 -04001072 mService.setIcon("gps", com.android.internal.R.drawable.stat_sys_gps_on, 0);
Joe Onorato0cbda992010-05-02 16:28:15 -07001073 mService.setIconVisibility("gps", true);
Mike Lockwood00b74272010-03-26 10:41:48 -04001074 } else if (action.equals(LocationManager.GPS_ENABLED_CHANGE_ACTION) && !enabled) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001075 // GPS is off
Joe Onorato0cbda992010-05-02 16:28:15 -07001076 mService.setIconVisibility("gps", false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001077 } else {
1078 // GPS is on, but not receiving fixes
Joe Onorato798ac4c2010-05-27 16:39:00 -04001079 mService.setIcon("gps", R.drawable.stat_sys_gps_acquiring_anim, 0);
Joe Onorato0cbda992010-05-02 16:28:15 -07001080 mService.setIconVisibility("gps", true);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001081 }
1082 }
1083
Wink Savillee9b06d72009-05-18 21:47:50 -07001084 private final void updateTTY(Intent intent) {
Wink Saville04e71b32009-04-02 11:00:54 -07001085 final String action = intent.getAction();
1086 final boolean enabled = intent.getBooleanExtra(TtyIntent.TTY_ENABLED, false);
1087
Joe Onorato8a9b2202010-02-26 18:56:32 -08001088 if (false) Slog.v(TAG, "updateTTY: enabled: " + enabled);
Wink Saville04e71b32009-04-02 11:00:54 -07001089
1090 if (enabled) {
1091 // TTY is on
Joe Onorato8a9b2202010-02-26 18:56:32 -08001092 if (false) Slog.v(TAG, "updateTTY: set TTY on");
Joe Onorato798ac4c2010-05-27 16:39:00 -04001093 mService.setIcon("tty", R.drawable.stat_sys_tty_mode, 0);
Joe Onorato0cbda992010-05-02 16:28:15 -07001094 mService.setIconVisibility("tty", true);
Wink Saville04e71b32009-04-02 11:00:54 -07001095 } else {
1096 // TTY is off
Joe Onorato8a9b2202010-02-26 18:56:32 -08001097 if (false) Slog.v(TAG, "updateTTY: set TTY off");
Joe Onorato0cbda992010-05-02 16:28:15 -07001098 mService.setIconVisibility("tty", false);
Wink Saville04e71b32009-04-02 11:00:54 -07001099 }
1100 }
1101
Robert Greenwalt98e0b142009-10-08 21:15:52 -07001102 private final void updateCdmaRoamingIcon(ServiceState state) {
Wink Savillee9b06d72009-05-18 21:47:50 -07001103 if (!hasService()) {
Joe Onorato0cbda992010-05-02 16:28:15 -07001104 mService.setIconVisibility("cdma_eri", false);
Wink Savillef3152382009-06-01 14:39:20 -07001105 return;
Wink Savillee9b06d72009-05-18 21:47:50 -07001106 }
1107
1108 if (!isCdma()) {
Joe Onorato0cbda992010-05-02 16:28:15 -07001109 mService.setIconVisibility("cdma_eri", false);
Wink Savillef3152382009-06-01 14:39:20 -07001110 return;
Wink Savillee9b06d72009-05-18 21:47:50 -07001111 }
1112
1113 int[] iconList = sRoamingIndicatorImages_cdma;
Robert Greenwalt98e0b142009-10-08 21:15:52 -07001114 int iconIndex = state.getCdmaEriIconIndex();
1115 int iconMode = state.getCdmaEriIconMode();
Wink Savillee9b06d72009-05-18 21:47:50 -07001116
1117 if (iconIndex == -1) {
Joe Onorato8a9b2202010-02-26 18:56:32 -08001118 Slog.e(TAG, "getCdmaEriIconIndex returned null, skipping ERI icon update");
Wink Savillee9b06d72009-05-18 21:47:50 -07001119 return;
1120 }
1121
1122 if (iconMode == -1) {
Joe Onorato8a9b2202010-02-26 18:56:32 -08001123 Slog.e(TAG, "getCdmeEriIconMode returned null, skipping ERI icon update");
Wink Savillee9b06d72009-05-18 21:47:50 -07001124 return;
1125 }
1126
1127 if (iconIndex == EriInfo.ROAMING_INDICATOR_OFF) {
Joe Onorato8a9b2202010-02-26 18:56:32 -08001128 if (false) Slog.v(TAG, "Cdma ROAMING_INDICATOR_OFF, removing ERI icon");
Joe Onorato0cbda992010-05-02 16:28:15 -07001129 mService.setIconVisibility("cdma_eri", false);
Wink Savillee9b06d72009-05-18 21:47:50 -07001130 return;
1131 }
1132
1133 switch (iconMode) {
1134 case EriInfo.ROAMING_ICON_MODE_NORMAL:
Joe Onorato798ac4c2010-05-27 16:39:00 -04001135 mService.setIcon("cdma_eri", iconList[iconIndex], 0);
Joe Onorato0cbda992010-05-02 16:28:15 -07001136 mService.setIconVisibility("cdma_eri", true);
Wink Savillee9b06d72009-05-18 21:47:50 -07001137 break;
1138 case EriInfo.ROAMING_ICON_MODE_FLASH:
Joe Onorato798ac4c2010-05-27 16:39:00 -04001139 mService.setIcon("cdma_eri", R.drawable.stat_sys_roaming_cdma_flash, 0);
Joe Onorato0cbda992010-05-02 16:28:15 -07001140 mService.setIconVisibility("cdma_eri", true);
Wink Savillee9b06d72009-05-18 21:47:50 -07001141 break;
1142
1143 }
Joe Onorato798ac4c2010-05-27 16:39:00 -04001144 mService.setIcon("phone_signal", mPhoneSignalIconId, 0);
Wink Savillee9b06d72009-05-18 21:47:50 -07001145 }
1146
1147
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001148 private class StatusBarHandler extends Handler {
1149 @Override
1150 public void handleMessage(Message msg) {
1151 switch (msg.what) {
1152 case EVENT_BATTERY_CLOSE:
1153 if (msg.arg1 == mBatteryViewSequence) {
1154 closeLastBatteryView();
1155 }
1156 break;
1157 }
1158 }
1159 }
1160}