blob: c6b085dd572882795cad8bc46edf2c3692f6f52d [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
17package com.android.server.status;
18
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080019import android.app.AlertDialog;
20import android.bluetooth.BluetoothA2dp;
Nick Pellybd022f42009-08-14 18:33:38 -070021import android.bluetooth.BluetoothAdapter;
The Android Open Source Project10592532009-03-18 17:39:46 -070022import android.bluetooth.BluetoothError;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080023import android.bluetooth.BluetoothHeadset;
24import android.bluetooth.BluetoothIntent;
Jiafa Liu3f416732009-07-02 16:36:02 +080025import android.bluetooth.BluetoothPbap;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080026import android.content.BroadcastReceiver;
27import android.content.Context;
28import android.content.DialogInterface;
29import android.content.Intent;
30import android.content.IntentFilter;
31import android.content.res.TypedArray;
32import android.graphics.PixelFormat;
33import android.graphics.drawable.Drawable;
34import android.media.AudioManager;
35import android.net.NetworkInfo;
36import android.net.wifi.WifiManager;
Dianne Hackborn4840e142009-03-24 22:40:29 -070037import android.os.Binder;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080038import android.os.Handler;
39import android.os.IBinder;
40import android.os.Message;
Dianne Hackborn4840e142009-03-24 22:40:29 -070041import android.os.RemoteException;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080042import android.provider.Settings;
43import android.telephony.PhoneStateListener;
44import android.telephony.ServiceState;
Wink Savillee9b06d72009-05-18 21:47:50 -070045import android.telephony.SignalStrength;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080046import android.telephony.TelephonyManager;
47import android.text.format.DateFormat;
48import android.util.Log;
49import android.view.View;
50import android.view.ViewGroup;
51import android.view.WindowManager;
52import android.view.WindowManagerImpl;
53import android.widget.ImageView;
54import android.widget.LinearLayout;
55import android.widget.TextView;
56
Wink Saville04e71b32009-04-02 11:00:54 -070057import com.android.internal.R;
58import com.android.internal.app.IBatteryStats;
59import com.android.internal.location.GpsLocationProvider;
60import com.android.internal.telephony.IccCard;
61import com.android.internal.telephony.TelephonyIntents;
Wink Savillee9b06d72009-05-18 21:47:50 -070062import com.android.internal.telephony.cdma.EriInfo;
Wink Saville04e71b32009-04-02 11:00:54 -070063import com.android.internal.telephony.cdma.TtyIntent;
64import com.android.server.am.BatteryStatsService;
65
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080066import java.util.Calendar;
67import java.util.TimeZone;
68
69/**
70 * This class contains all of the policy about which icons are installed in the status
71 * bar at boot time. In reality, it should go into the android.policy package, but
72 * putting it here is the first step from extracting it.
73 */
74public class StatusBarPolicy {
75 private static final String TAG = "StatusBarPolicy";
76
77 private static StatusBarPolicy sInstance;
78
79 // message codes for the handler
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080080 private static final int EVENT_BATTERY_CLOSE = 4;
81
Dianne Hackborn4840e142009-03-24 22:40:29 -070082 private final Context mContext;
83 private final StatusBarService mService;
84 private final Handler mHandler = new StatusBarHandler();
85 private final IBatteryStats mBatteryStats;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080086
87 // clock
88 private Calendar mCalendar;
89 private IBinder mClockIcon;
90 private IconData mClockData;
91
92 // battery
93 private IBinder mBatteryIcon;
94 private IconData mBatteryData;
95 private boolean mBatteryFirst = true;
96 private boolean mBatteryPlugged;
97 private int mBatteryLevel;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080098 private AlertDialog mLowBatteryDialog;
99 private TextView mBatteryLevelTextView;
100 private View mBatteryView;
101 private int mBatteryViewSequence;
102 private boolean mBatteryShowLowOnEndCall = false;
103 private static final boolean SHOW_LOW_BATTERY_WARNING = true;
104
105 // phone
106 private TelephonyManager mPhone;
107 private IBinder mPhoneIcon;
Wink Savillee9b06d72009-05-18 21:47:50 -0700108 private IBinder mPhoneEvdoIcon;
Wink Saville04e71b32009-04-02 11:00:54 -0700109
110 //***** Signal strength icons
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800111 private IconData mPhoneData;
Wink Savillee9b06d72009-05-18 21:47:50 -0700112 private IconData mPhoneEvdoData;
Wink Saville04e71b32009-04-02 11:00:54 -0700113 //GSM/UMTS
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800114 private static final int[] sSignalImages = new int[] {
Wink Savillee9b06d72009-05-18 21:47:50 -0700115 com.android.internal.R.drawable.stat_sys_signal_0,
116 com.android.internal.R.drawable.stat_sys_signal_1,
117 com.android.internal.R.drawable.stat_sys_signal_2,
118 com.android.internal.R.drawable.stat_sys_signal_3,
119 com.android.internal.R.drawable.stat_sys_signal_4
120 };
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800121 private static final int[] sSignalImages_r = new int[] {
Wink Savillee9b06d72009-05-18 21:47:50 -0700122 com.android.internal.R.drawable.stat_sys_r_signal_0,
123 com.android.internal.R.drawable.stat_sys_r_signal_1,
124 com.android.internal.R.drawable.stat_sys_r_signal_2,
125 com.android.internal.R.drawable.stat_sys_r_signal_3,
126 com.android.internal.R.drawable.stat_sys_r_signal_4
127 };
Wink Saville04e71b32009-04-02 11:00:54 -0700128 //CDMA
129 private static final int[] sSignalImages_cdma = new int[] {
Wink Savillee9b06d72009-05-18 21:47:50 -0700130 com.android.internal.R.drawable.stat_sys_signal_cdma_0,
131 com.android.internal.R.drawable.stat_sys_signal_cdma_1,
132 com.android.internal.R.drawable.stat_sys_signal_cdma_2,
133 com.android.internal.R.drawable.stat_sys_signal_cdma_3,
134 com.android.internal.R.drawable.stat_sys_signal_cdma_4
Wink Saville04e71b32009-04-02 11:00:54 -0700135 };
Wink Savillee9b06d72009-05-18 21:47:50 -0700136 private static final int[] sRoamingIndicatorImages_cdma = new int[] {
137 com.android.internal.R.drawable.stat_sys_roaming_cdma_0, //Standard Roaming Indicator
138 // 1 is Standard Roaming Indicator OFF
139 // TODO T: image never used, remove and put 0 instead?
140 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
141
142 // 2 is Standard Roaming Indicator FLASHING
143 // TODO T: image never used, remove and put 0 instead?
144 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
145
146 // 3-12 Standard ERI
147 com.android.internal.R.drawable.stat_sys_roaming_cdma_0, //3
148 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
149 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
150 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
151 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
152 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
153 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
154 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
155 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
156 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
157
158 // 13-63 Reserved for Standard ERI
159 com.android.internal.R.drawable.stat_sys_roaming_cdma_0, //13
160 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
161 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
162 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
163 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
164 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
165 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
166 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
167 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
168 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
169 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
170 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
171 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
172 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
173 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
174 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
175 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
176 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
177 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
178 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
179 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
180 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
181 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
182 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
183 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
184 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
185 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
186 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
187 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
188 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
189 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
190 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
191 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
192 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
193 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
194 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
195 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
196 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
197 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
198 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
199 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
200 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
201 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
202 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
203 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
204 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
205 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
206 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
207 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
208 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
209 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
210
211 // 64-127 Reserved for Non Standard (Operator Specific) ERI
212 com.android.internal.R.drawable.stat_sys_roaming_cdma_0, //64
213 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
214 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
215 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
216 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
217 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
218 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
219 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
220 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
221 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
222 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
223 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
224 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
225 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
226 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
227 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
228 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
229 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
230 com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
231 com.android.internal.R.drawable.stat_sys_roaming_cdma_0 //83
232
233 // 128-255 Reserved
Wink Saville04e71b32009-04-02 11:00:54 -0700234 };
Wink Savillee9b06d72009-05-18 21:47:50 -0700235 // EVDO
236 private static final int[] sSignalImages_evdo = new int[] {
237 com.android.internal.R.drawable.stat_sys_signal_evdo_0,
238 com.android.internal.R.drawable.stat_sys_signal_evdo_1,
239 com.android.internal.R.drawable.stat_sys_signal_evdo_2,
240 com.android.internal.R.drawable.stat_sys_signal_evdo_3,
241 com.android.internal.R.drawable.stat_sys_signal_evdo_4
Wink Saville04e71b32009-04-02 11:00:54 -0700242 };
243
244 //***** Data connection icons
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800245 private int[] mDataIconList = sDataNetType_g;
Wink Saville04e71b32009-04-02 11:00:54 -0700246 //GSM/UMTS
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800247 private static final int[] sDataNetType_g = new int[] {
248 com.android.internal.R.drawable.stat_sys_data_connected_g,
249 com.android.internal.R.drawable.stat_sys_data_in_g,
250 com.android.internal.R.drawable.stat_sys_data_out_g,
251 com.android.internal.R.drawable.stat_sys_data_inandout_g,
252 };
253 private static final int[] sDataNetType_3g = new int[] {
254 com.android.internal.R.drawable.stat_sys_data_connected_3g,
255 com.android.internal.R.drawable.stat_sys_data_in_3g,
256 com.android.internal.R.drawable.stat_sys_data_out_3g,
257 com.android.internal.R.drawable.stat_sys_data_inandout_3g,
258 };
259 private static final int[] sDataNetType_e = new int[] {
260 com.android.internal.R.drawable.stat_sys_data_connected_e,
261 com.android.internal.R.drawable.stat_sys_data_in_e,
262 com.android.internal.R.drawable.stat_sys_data_out_e,
263 com.android.internal.R.drawable.stat_sys_data_inandout_e,
264 };
Li Zheebe66342009-08-14 19:22:16 +0800265 //3.5G
266 private static final int[] sDataNetType_h = new int[] {
267 com.android.internal.R.drawable.stat_sys_data_connected_h,
268 com.android.internal.R.drawable.stat_sys_data_in_h,
269 com.android.internal.R.drawable.stat_sys_data_out_h,
270 com.android.internal.R.drawable.stat_sys_data_inandout_h,
271 };
272
Wink Saville04e71b32009-04-02 11:00:54 -0700273 //CDMA
274 private static final int[] sDataNetType_evdo = new int[] {
275 com.android.internal.R.drawable.stat_sys_data_connected_evdo,
276 com.android.internal.R.drawable.stat_sys_data_in_evdo,
277 com.android.internal.R.drawable.stat_sys_data_out_evdo,
278 com.android.internal.R.drawable.stat_sys_data_inandout_evdo,
Wink Savillee9b06d72009-05-18 21:47:50 -0700279 com.android.internal.R.drawable.stat_sys_data_dormant_evdo,
Wink Saville04e71b32009-04-02 11:00:54 -0700280 };
281 private static final int[] sDataNetType_1xrtt = new int[] {
282 com.android.internal.R.drawable.stat_sys_data_connected_1xrtt,
283 com.android.internal.R.drawable.stat_sys_data_in_1xrtt,
284 com.android.internal.R.drawable.stat_sys_data_out_1xrtt,
285 com.android.internal.R.drawable.stat_sys_data_inandout_1xrtt,
Wink Savillee9b06d72009-05-18 21:47:50 -0700286 com.android.internal.R.drawable.stat_sys_data_dormant_1xrtt,
Wink Saville04e71b32009-04-02 11:00:54 -0700287 };
288
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800289 // Assume it's all good unless we hear otherwise. We don't always seem
290 // to get broadcasts that it *is* there.
Wink Saville04e71b32009-04-02 11:00:54 -0700291 IccCard.State mSimState = IccCard.State.READY;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800292 int mPhoneState = TelephonyManager.CALL_STATE_IDLE;
293 int mDataState = TelephonyManager.DATA_DISCONNECTED;
294 int mDataActivity = TelephonyManager.DATA_ACTIVITY_NONE;
295 ServiceState mServiceState;
Wink Savillee9b06d72009-05-18 21:47:50 -0700296 SignalStrength mSignalStrength;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800297
298 // data connection
299 private IBinder mDataIcon;
300 private IconData mDataData;
301 private boolean mDataIconVisible;
302
303 // ringer volume
304 private IBinder mVolumeIcon;
305 private IconData mVolumeData;
306 private boolean mVolumeVisible;
Wink Saville04e71b32009-04-02 11:00:54 -0700307
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800308 // bluetooth device status
309 private IBinder mBluetoothIcon;
310 private IconData mBluetoothData;
311 private int mBluetoothHeadsetState;
312 private int mBluetoothA2dpState;
Jiafa Liu3f416732009-07-02 16:36:02 +0800313 private int mBluetoothPbapState;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800314 private boolean mBluetoothEnabled;
315
316 // wifi
317 private static final int[] sWifiSignalImages = new int[] {
318 com.android.internal.R.drawable.stat_sys_wifi_signal_1,
319 com.android.internal.R.drawable.stat_sys_wifi_signal_2,
320 com.android.internal.R.drawable.stat_sys_wifi_signal_3,
321 com.android.internal.R.drawable.stat_sys_wifi_signal_4,
322 };
323 private static final int sWifiTemporarilyNotConnectedImage =
324 com.android.internal.R.drawable.stat_sys_wifi_signal_0;
325
326 private int mLastWifiSignalLevel = -1;
327 private boolean mIsWifiConnected = false;
328 private IBinder mWifiIcon;
329 private IconData mWifiData;
330
331 // gps
332 private IBinder mGpsIcon;
333 private IconData mGpsEnabledIconData;
334 private IconData mGpsFixIconData;
335
336 // alarm clock
337 // Icon lit when clock is set
338 private IBinder mAlarmClockIcon;
339 private IconData mAlarmClockIconData;
340
341 // sync state
342 // If sync is active the SyncActive icon is displayed. If sync is not active but
343 // sync is failing the SyncFailing icon is displayed. Otherwise neither are displayed.
344 private IBinder mSyncActiveIcon;
345 private IBinder mSyncFailingIcon;
346
Wink Saville04e71b32009-04-02 11:00:54 -0700347 // TTY mode
348 // Icon lit when TTY mode is enabled
349 private IBinder mTTYModeIcon;
350 private IconData mTTYModeEnableIconData;
351
Wink Savillee9b06d72009-05-18 21:47:50 -0700352 // Cdma Roaming Indicator, ERI
353 private IBinder mCdmaRoamingIndicatorIcon;
354 private IconData mCdmaRoamingIndicatorIconData;
355
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800356 private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
357 @Override
358 public void onReceive(Context context, Intent intent) {
359 String action = intent.getAction();
360 if (action.equals(Intent.ACTION_TIME_TICK)) {
361 updateClock();
362 }
363 else if (action.equals(Intent.ACTION_TIME_CHANGED)) {
364 updateClock();
365 }
Dianne Hackborn8ec5b832009-07-01 21:19:35 -0700366 else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
367 updateBattery(intent);
368 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800369 else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
370 updateClock();
371 }
372 else if (action.equals(Intent.ACTION_TIMEZONE_CHANGED)) {
373 String tz = intent.getStringExtra("time-zone");
374 mCalendar = Calendar.getInstance(TimeZone.getTimeZone(tz));
375 updateClock();
376 }
377 else if (action.equals(Intent.ACTION_ALARM_CHANGED)) {
378 updateAlarm(intent);
379 }
380 else if (action.equals(Intent.ACTION_SYNC_STATE_CHANGED)) {
381 updateSyncState(intent);
382 }
Mihai Predaa82842f2009-04-29 15:05:56 +0200383 else if (action.equals(Intent.ACTION_BATTERY_LOW)) {
384 onBatteryLow(intent);
385 }
Mike Lockwood69eb0bf2009-08-01 23:02:28 -0400386 else if (action.equals(Intent.ACTION_BATTERY_OKAY)
387 || action.equals(Intent.ACTION_POWER_CONNECTED)) {
Dianne Hackborn8ec5b832009-07-01 21:19:35 -0700388 onBatteryOkay(intent);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800389 }
The Android Open Source Project10592532009-03-18 17:39:46 -0700390 else if (action.equals(BluetoothIntent.BLUETOOTH_STATE_CHANGED_ACTION) ||
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800391 action.equals(BluetoothIntent.HEADSET_STATE_CHANGED_ACTION) ||
Jiafa Liu3f416732009-07-02 16:36:02 +0800392 action.equals(BluetoothA2dp.SINK_STATE_CHANGED_ACTION) ||
393 action.equals(BluetoothPbap.PBAP_STATE_CHANGED_ACTION)) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800394 updateBluetooth(intent);
395 }
396 else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION) ||
397 action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION) ||
398 action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
399 updateWifi(intent);
400 }
401 else if (action.equals(GpsLocationProvider.GPS_ENABLED_CHANGE_ACTION) ||
402 action.equals(GpsLocationProvider.GPS_FIX_CHANGE_ACTION)) {
403 updateGps(intent);
404 }
405 else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION) ||
406 action.equals(AudioManager.VIBRATE_SETTING_CHANGED_ACTION)) {
407 updateVolume();
408 }
409 else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
410 updateSimState(intent);
411 }
Wink Saville04e71b32009-04-02 11:00:54 -0700412 else if (action.equals(TtyIntent.TTY_ENABLED_CHANGE_ACTION)) {
413 updateTTY(intent);
414 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800415 }
416 };
417
418 private StatusBarPolicy(Context context, StatusBarService service) {
419 mContext = context;
420 mService = service;
Wink Savillee9b06d72009-05-18 21:47:50 -0700421 mSignalStrength = new SignalStrength();
Dianne Hackborn4840e142009-03-24 22:40:29 -0700422 mBatteryStats = BatteryStatsService.getService();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800423
424 // clock
425 mCalendar = Calendar.getInstance(TimeZone.getDefault());
426 mClockData = IconData.makeText("clock", "");
427 mClockIcon = service.addIcon(mClockData, null);
428 updateClock();
429
430 // battery
431 mBatteryData = IconData.makeIcon("battery",
432 null, com.android.internal.R.drawable.stat_sys_battery_unknown, 0, 0);
433 mBatteryIcon = service.addIcon(mBatteryData, null);
434
435 // phone_signal
436 mPhone = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
Wink Savillee9b06d72009-05-18 21:47:50 -0700437 mPhoneData = IconData.makeIcon("phone_signal",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800438 null, com.android.internal.R.drawable.stat_sys_signal_null, 0, 0);
439 mPhoneIcon = service.addIcon(mPhoneData, null);
Wink Savillee9b06d72009-05-18 21:47:50 -0700440
441 // phone_evdo_signal
442 mPhoneEvdoData = IconData.makeIcon("phone_evdo_signal",
443 null, com.android.internal.R.drawable.stat_sys_signal_evdo_0, 0, 0);
444 mPhoneEvdoIcon = service.addIcon(mPhoneEvdoData, null);
445 service.setIconVisibility(mPhoneEvdoIcon, false);
446
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800447 // register for phone state notifications.
448 ((TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE))
449 .listen(mPhoneStateListener,
450 PhoneStateListener.LISTEN_SERVICE_STATE
Wink Savillee9b06d72009-05-18 21:47:50 -0700451 | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800452 | PhoneStateListener.LISTEN_CALL_STATE
453 | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
454 | PhoneStateListener.LISTEN_DATA_ACTIVITY);
455
456 // data_connection
457 mDataData = IconData.makeIcon("data_connection",
458 null, com.android.internal.R.drawable.stat_sys_data_connected_g, 0, 0);
459 mDataIcon = service.addIcon(mDataData, null);
460 service.setIconVisibility(mDataIcon, false);
461
462 // wifi
463 mWifiData = IconData.makeIcon("wifi", null, sWifiSignalImages[0], 0, 0);
464 mWifiIcon = service.addIcon(mWifiData, null);
465 service.setIconVisibility(mWifiIcon, false);
466 // wifi will get updated by the sticky intents
Wink Saville04e71b32009-04-02 11:00:54 -0700467
468 // TTY status
469 mTTYModeEnableIconData = IconData.makeIcon("tty",
470 null, com.android.internal.R.drawable.stat_sys_tty_mode, 0, 0);
471 mTTYModeIcon = service.addIcon(mTTYModeEnableIconData, null);
472 service.setIconVisibility(mTTYModeIcon, false);
473
Wink Savillee9b06d72009-05-18 21:47:50 -0700474 // Cdma Roaming Indicator, ERI
475 mCdmaRoamingIndicatorIconData = IconData.makeIcon("cdma_eri",
476 null, com.android.internal.R.drawable.stat_sys_roaming_cdma_0, 0, 0);
477 mCdmaRoamingIndicatorIcon = service.addIcon(mCdmaRoamingIndicatorIconData, null);
478 service.setIconVisibility(mCdmaRoamingIndicatorIcon, false);
479
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800480 // bluetooth status
481 mBluetoothData = IconData.makeIcon("bluetooth",
482 null, com.android.internal.R.drawable.stat_sys_data_bluetooth, 0, 0);
483 mBluetoothIcon = service.addIcon(mBluetoothData, null);
Nick Pellybd022f42009-08-14 18:33:38 -0700484 BluetoothAdapter adapter =
485 (BluetoothAdapter) mContext.getSystemService(Context.BLUETOOTH_SERVICE);
486 if (adapter != null) {
487 mBluetoothEnabled = adapter.isEnabled();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800488 } else {
489 mBluetoothEnabled = false;
490 }
491 mBluetoothA2dpState = BluetoothA2dp.STATE_DISCONNECTED;
492 mBluetoothHeadsetState = BluetoothHeadset.STATE_DISCONNECTED;
Jiafa Liu3f416732009-07-02 16:36:02 +0800493 mBluetoothPbapState = BluetoothPbap.STATE_DISCONNECTED;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800494 mService.setIconVisibility(mBluetoothIcon, mBluetoothEnabled);
495
496 // Gps status
497 mGpsEnabledIconData = IconData.makeIcon("gps",
498 null, com.android.internal.R.drawable.stat_sys_gps_acquiring_anim, 0, 0);
499 mGpsFixIconData = IconData.makeIcon("gps",
500 null, com.android.internal.R.drawable.stat_sys_gps_on, 0, 0);
501 mGpsIcon = service.addIcon(mGpsEnabledIconData, null);
502 service.setIconVisibility(mGpsIcon, false);
503
504 // Alarm clock
505 mAlarmClockIconData = IconData.makeIcon(
506 "alarm_clock",
507 null, com.android.internal.R.drawable.stat_notify_alarm, 0, 0);
508 mAlarmClockIcon = service.addIcon(mAlarmClockIconData, null);
509 service.setIconVisibility(mAlarmClockIcon, false);
510
511 // Sync state
512 mSyncActiveIcon = service.addIcon(IconData.makeIcon("sync_active",
513 null, R.drawable.stat_notify_sync_anim0, 0, 0), null);
514 mSyncFailingIcon = service.addIcon(IconData.makeIcon("sync_failing",
515 null, R.drawable.stat_notify_sync_error, 0, 0), null);
516 service.setIconVisibility(mSyncActiveIcon, false);
517 service.setIconVisibility(mSyncFailingIcon, false);
518
519 // volume
520 mVolumeData = IconData.makeIcon("volume",
521 null, com.android.internal.R.drawable.stat_sys_ringer_silent, 0, 0);
522 mVolumeIcon = service.addIcon(mVolumeData, null);
523 service.setIconVisibility(mVolumeIcon, false);
524 updateVolume();
525
526 IntentFilter filter = new IntentFilter();
527
528 // Register for Intent broadcasts for...
529 filter.addAction(Intent.ACTION_TIME_TICK);
530 filter.addAction(Intent.ACTION_TIME_CHANGED);
531 filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
532 filter.addAction(Intent.ACTION_BATTERY_CHANGED);
Mihai Predaa82842f2009-04-29 15:05:56 +0200533 filter.addAction(Intent.ACTION_BATTERY_LOW);
Dianne Hackborn8ec5b832009-07-01 21:19:35 -0700534 filter.addAction(Intent.ACTION_BATTERY_OKAY);
Mike Lockwood69eb0bf2009-08-01 23:02:28 -0400535 filter.addAction(Intent.ACTION_POWER_CONNECTED);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800536 filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
537 filter.addAction(Intent.ACTION_ALARM_CHANGED);
538 filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED);
539 filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
540 filter.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION);
The Android Open Source Project10592532009-03-18 17:39:46 -0700541 filter.addAction(BluetoothIntent.BLUETOOTH_STATE_CHANGED_ACTION);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800542 filter.addAction(BluetoothIntent.HEADSET_STATE_CHANGED_ACTION);
543 filter.addAction(BluetoothA2dp.SINK_STATE_CHANGED_ACTION);
Jiafa Liu3f416732009-07-02 16:36:02 +0800544 filter.addAction(BluetoothPbap.PBAP_STATE_CHANGED_ACTION);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800545 filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
546 filter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
547 filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
548 filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
549 filter.addAction(GpsLocationProvider.GPS_ENABLED_CHANGE_ACTION);
550 filter.addAction(GpsLocationProvider.GPS_FIX_CHANGE_ACTION);
551 filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
Wink Saville04e71b32009-04-02 11:00:54 -0700552 filter.addAction(TtyIntent.TTY_ENABLED_CHANGE_ACTION);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800553 mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
554 }
555
556 public static void installIcons(Context context, StatusBarService service) {
557 sInstance = new StatusBarPolicy(context, service);
558 }
559
560 private final void updateClock() {
561 mCalendar.setTimeInMillis(System.currentTimeMillis());
562 mClockData.text = DateFormat.getTimeFormat(mContext)
563 .format(mCalendar.getTime());
564 mService.updateIcon(mClockIcon, mClockData, null);
565 }
566
567 private final void updateAlarm(Intent intent) {
568 boolean alarmSet = intent.getBooleanExtra("alarmSet", false);
569 mService.setIconVisibility(mAlarmClockIcon, alarmSet);
570 }
571
572 private final void updateSyncState(Intent intent) {
573 boolean isActive = intent.getBooleanExtra("active", false);
574 boolean isFailing = intent.getBooleanExtra("failing", false);
575 mService.setIconVisibility(mSyncActiveIcon, isActive);
576 // Don't display sync failing icon: BUG 1297963 Set sync error timeout to "never"
577 //mService.setIconVisibility(mSyncFailingIcon, isFailing && !isActive);
578 }
579
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800580 private final void updateBattery(Intent intent) {
581 mBatteryData.iconId = intent.getIntExtra("icon-small", 0);
582 mBatteryData.iconLevel = intent.getIntExtra("level", 0);
583 mService.updateIcon(mBatteryIcon, mBatteryData, null);
584
585 boolean plugged = intent.getIntExtra("plugged", 0) != 0;
586 int level = intent.getIntExtra("level", -1);
587 if (false) {
588 Log.d(TAG, "updateBattery level=" + level
589 + " plugged=" + plugged
590 + " mBatteryPlugged=" + mBatteryPlugged
591 + " mBatteryLevel=" + mBatteryLevel
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800592 + " mBatteryFirst=" + mBatteryFirst);
593 }
594
595 boolean oldPlugged = mBatteryPlugged;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800596
597 mBatteryPlugged = plugged;
598 mBatteryLevel = level;
599
600 if (mBatteryFirst) {
601 mBatteryFirst = false;
602 }
603 /*
604 * No longer showing the battery view because it draws attention away
605 * from the USB storage notification. We could still show it when
606 * connected to a brick, but that could lead to the user into thinking
607 * the device does not charge when plugged into USB (since he/she would
608 * not see the same battery screen on USB as he sees on brick).
609 */
610 /* else {
611 if (plugged && !oldPlugged) {
612 showBatteryView();
613 }
614 }
615 */
616 if (false) {
Mihai Predaa82842f2009-04-29 15:05:56 +0200617 Log.d(TAG, "plugged=" + plugged + " oldPlugged=" + oldPlugged + " level=" + level);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800618 }
Mihai Predaa82842f2009-04-29 15:05:56 +0200619 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800620
Mihai Predaa82842f2009-04-29 15:05:56 +0200621 private void onBatteryLow(Intent intent) {
622 if (SHOW_LOW_BATTERY_WARNING) {
623 if (false) {
624 Log.d(TAG, "mPhoneState=" + mPhoneState
625 + " mLowBatteryDialog=" + mLowBatteryDialog
626 + " mBatteryShowLowOnEndCall=" + mBatteryShowLowOnEndCall);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800627 }
Mihai Predaa82842f2009-04-29 15:05:56 +0200628
629 if (mPhoneState == TelephonyManager.CALL_STATE_IDLE) {
630 showLowBatteryWarning();
631 } else {
632 mBatteryShowLowOnEndCall = true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800633 }
634 }
635 }
636
Dianne Hackborn8ec5b832009-07-01 21:19:35 -0700637 private void onBatteryOkay(Intent intent) {
638 if (mLowBatteryDialog != null
639 && SHOW_LOW_BATTERY_WARNING) {
640 mLowBatteryDialog.dismiss();
641 mBatteryShowLowOnEndCall = false;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800642 }
643 }
644
645 private void showBatteryView() {
646 closeLastBatteryView();
647 if (mLowBatteryDialog != null) {
648 mLowBatteryDialog.dismiss();
649 }
650
651 int level = mBatteryLevel;
652
653 View v = View.inflate(mContext, com.android.internal.R.layout.battery_status, null);
654 mBatteryView = v;
655 int pixelFormat = PixelFormat.TRANSLUCENT;
656 Drawable bg = v.getBackground();
657 if (bg != null) {
658 pixelFormat = bg.getOpacity();
659 }
660
661 WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
662 ViewGroup.LayoutParams.WRAP_CONTENT,
663 ViewGroup.LayoutParams.WRAP_CONTENT,
664 WindowManager.LayoutParams.TYPE_TOAST,
665 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
666 | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
667 | WindowManager.LayoutParams.FLAG_BLUR_BEHIND
668 | WindowManager.LayoutParams.FLAG_DIM_BEHIND,
669 pixelFormat);
670
671 // Get the dim amount from the theme
672 TypedArray a = mContext.obtainStyledAttributes(
673 com.android.internal.R.styleable.Theme);
674 lp.dimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f);
675 a.recycle();
Wink Saville04e71b32009-04-02 11:00:54 -0700676
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800677 lp.setTitle("Battery");
678
679 TextView levelTextView = (TextView)v.findViewById(com.android.internal.R.id.level_percent);
680 levelTextView.setText(mContext.getString(
681 com.android.internal.R.string.battery_status_text_percent_format, level));
682
683 setBatteryLevel(v, com.android.internal.R.id.spacer, 100-level, 0, 0);
684 setBatteryLevel(v, com.android.internal.R.id.level, level,
685 com.android.internal.R.drawable.battery_charge_fill, level);
686
687 WindowManagerImpl.getDefault().addView(v, lp);
688
689 scheduleCloseBatteryView();
690 }
691
692 private void setBatteryLevel(View parent, int id, int height, int background, int level) {
693 ImageView v = (ImageView)parent.findViewById(id);
694 LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)v.getLayoutParams();
695 lp.weight = height;
696 if (background != 0) {
697 v.setBackgroundResource(background);
698 Drawable bkg = v.getBackground();
699 bkg.setLevel(level);
700 }
701 }
702
703 private void showLowBatteryWarning() {
704 closeLastBatteryView();
705
Mihai Predaa82842f2009-04-29 15:05:56 +0200706 /* Show exact battery level.
707 * Add 1 because the text says "less than X%".
708 */
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800709 CharSequence levelText = mContext.getString(
Mihai Predaa82842f2009-04-29 15:05:56 +0200710 com.android.internal.R.string.battery_low_percent_format, mBatteryLevel + 1);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800711
712 if (mBatteryLevelTextView != null) {
713 mBatteryLevelTextView.setText(levelText);
714 } else {
715 View v = View.inflate(mContext, com.android.internal.R.layout.battery_low, null);
716 mBatteryLevelTextView=(TextView)v.findViewById(com.android.internal.R.id.level_percent);
717
718 mBatteryLevelTextView.setText(levelText);
719
720 AlertDialog.Builder b = new AlertDialog.Builder(mContext);
721 b.setCancelable(true);
722 b.setTitle(com.android.internal.R.string.battery_low_title);
723 b.setView(v);
724 b.setIcon(android.R.drawable.ic_dialog_alert);
725 b.setPositiveButton(android.R.string.ok, null);
Dianne Hackborn3d74bb42009-06-19 10:35:21 -0700726
727 final Intent intent = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY);
728 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
729 | Intent.FLAG_ACTIVITY_MULTIPLE_TASK
730 | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
731 | Intent.FLAG_ACTIVITY_NO_HISTORY);
732 if (intent.resolveActivity(mContext.getPackageManager()) != null) {
733 b.setNegativeButton(com.android.internal.R.string.battery_low_why,
734 new DialogInterface.OnClickListener() {
735 public void onClick(DialogInterface dialog, int which) {
736 mContext.startActivity(intent);
737 if (mLowBatteryDialog != null) {
738 mLowBatteryDialog.dismiss();
739 }
740 }
741 });
742 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800743
744 AlertDialog d = b.create();
745 d.setOnDismissListener(mLowBatteryListener);
746 d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
747 d.show();
748 mLowBatteryDialog = d;
749 }
750 }
751
752 private final void updateCallState(int state) {
753 mPhoneState = state;
754 if (false) {
755 Log.d(TAG, "mPhoneState=" + mPhoneState
756 + " mLowBatteryDialog=" + mLowBatteryDialog
757 + " mBatteryShowLowOnEndCall=" + mBatteryShowLowOnEndCall);
758 }
759 if (mPhoneState == TelephonyManager.CALL_STATE_IDLE) {
760 if (mBatteryShowLowOnEndCall) {
761 if (!mBatteryPlugged) {
762 showLowBatteryWarning();
763 }
764 mBatteryShowLowOnEndCall = false;
765 }
766 } else {
767 if (mLowBatteryDialog != null) {
768 mLowBatteryDialog.dismiss();
769 mBatteryShowLowOnEndCall = true;
770 }
771 }
772 }
773
774 private DialogInterface.OnDismissListener mLowBatteryListener
775 = new DialogInterface.OnDismissListener() {
776 public void onDismiss(DialogInterface dialog) {
777 mLowBatteryDialog = null;
778 mBatteryLevelTextView = null;
779 }
780 };
781
782 private void scheduleCloseBatteryView() {
783 Message m = mHandler.obtainMessage(EVENT_BATTERY_CLOSE);
784 m.arg1 = (++mBatteryViewSequence);
785 mHandler.sendMessageDelayed(m, 3000);
786 }
787
788 private void closeLastBatteryView() {
789 if (mBatteryView != null) {
790 //mBatteryView.debug();
791 WindowManagerImpl.getDefault().removeView(mBatteryView);
792 mBatteryView = null;
793 }
794 }
795
796 private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
797 @Override
Wink Savillee9b06d72009-05-18 21:47:50 -0700798 public void onSignalStrengthsChanged(SignalStrength signalStrength) {
799 mSignalStrength = signalStrength;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800800 updateSignalStrength();
801 }
802
803 @Override
804 public void onServiceStateChanged(ServiceState state) {
805 mServiceState = state;
806 updateSignalStrength();
Wink Savillee9b06d72009-05-18 21:47:50 -0700807 updateCdmaRoamingIcon();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800808 updateDataIcon();
809 }
810
811 @Override
812 public void onCallStateChanged(int state, String incomingNumber) {
813 updateCallState(state);
814 }
815
816 @Override
817 public void onDataConnectionStateChanged(int state) {
818 mDataState = state;
819 updateDataNetType();
820 updateDataIcon();
821 }
822
823 @Override
824 public void onDataActivity(int direction) {
825 mDataActivity = direction;
826 updateDataIcon();
827 }
828 };
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800829
830 private final void updateSimState(Intent intent) {
Wink Saville04e71b32009-04-02 11:00:54 -0700831 String stateExtra = intent.getStringExtra(IccCard.INTENT_KEY_ICC_STATE);
832 if (IccCard.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)) {
833 mSimState = IccCard.State.ABSENT;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800834 }
Wink Saville04e71b32009-04-02 11:00:54 -0700835 else if (IccCard.INTENT_VALUE_ICC_READY.equals(stateExtra)) {
836 mSimState = IccCard.State.READY;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800837 }
Wink Saville04e71b32009-04-02 11:00:54 -0700838 else if (IccCard.INTENT_VALUE_ICC_LOCKED.equals(stateExtra)) {
839 final String lockedReason = intent.getStringExtra(IccCard.INTENT_KEY_LOCKED_REASON);
840 if (IccCard.INTENT_VALUE_LOCKED_ON_PIN.equals(lockedReason)) {
841 mSimState = IccCard.State.PIN_REQUIRED;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800842 }
Wink Saville04e71b32009-04-02 11:00:54 -0700843 else if (IccCard.INTENT_VALUE_LOCKED_ON_PUK.equals(lockedReason)) {
844 mSimState = IccCard.State.PUK_REQUIRED;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800845 }
846 else {
Wink Saville04e71b32009-04-02 11:00:54 -0700847 mSimState = IccCard.State.NETWORK_LOCKED;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800848 }
849 } else {
Wink Saville04e71b32009-04-02 11:00:54 -0700850 mSimState = IccCard.State.UNKNOWN;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800851 }
852 updateDataIcon();
853 }
854
Wink Savillee9b06d72009-05-18 21:47:50 -0700855 private boolean isCdma() {
Wink Savillef3152382009-06-01 14:39:20 -0700856 return ((mPhone != null) && (mPhone.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA));
Wink Savillee9b06d72009-05-18 21:47:50 -0700857 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800858
Wink Savillee9b06d72009-05-18 21:47:50 -0700859 private boolean hasService() {
860 if (mServiceState != null) {
861 switch (mServiceState.getState()) {
862 case ServiceState.STATE_OUT_OF_SERVICE:
863 case ServiceState.STATE_POWER_OFF:
864 return false;
865 default:
866 return true;
867 }
868 } else {
869 return false;
870 }
871 }
872
873 private final void updateSignalStrength() {
874 int iconLevel = -1;
875 int evdoIconLevel = -1;
876 int[] iconList;
877 int[] evdoIconList;
878
879 if (!hasService()) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800880 //Log.d(TAG, "updateSignalStrength: no service");
881 if (Settings.System.getInt(mContext.getContentResolver(),
882 Settings.System.AIRPLANE_MODE_ON, 0) == 1) {
883 mPhoneData.iconId = com.android.internal.R.drawable.stat_sys_signal_flightmode;
884 } else {
885 mPhoneData.iconId = com.android.internal.R.drawable.stat_sys_signal_null;
886 }
887 mService.updateIcon(mPhoneIcon, mPhoneData, null);
Wink Savillee9b06d72009-05-18 21:47:50 -0700888 mService.setIconVisibility(mPhoneEvdoIcon,false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800889 return;
890 }
891
Wink Savillee9b06d72009-05-18 21:47:50 -0700892 if (!isCdma()) {
893 int asu = mSignalStrength.getGsmSignalStrength();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800894
Wink Savillee9b06d72009-05-18 21:47:50 -0700895 // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
896 // asu = 0 (-113dB or less) is very weak
897 // signal, its better to show 0 bars to the user in such cases.
898 // asu = 99 is a special case, where the signal strength is unknown.
899 if (asu <= 0 || asu == 99) iconLevel = 0;
900 else if (asu >= 16) iconLevel = 4;
901 else if (asu >= 8) iconLevel = 3;
902 else if (asu >= 4) iconLevel = 2;
903 else iconLevel = 1;
904
905 if (mPhone.isNetworkRoaming()) {
906 iconList = sSignalImages_r;
907 } else {
908 iconList = sSignalImages;
Wink Saville04e71b32009-04-02 11:00:54 -0700909 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800910 } else {
Wink Savillee9b06d72009-05-18 21:47:50 -0700911 iconList = this.sSignalImages_cdma;
912
913 int cdmaDbm = mSignalStrength.getCdmaDbm();
914 int cdmaEcio = mSignalStrength.getCdmaEcio();
915 int levelDbm = 0;
916 int levelEcio = 0;
917
918 if (cdmaDbm >= -75) levelDbm = 4;
919 else if (cdmaDbm >= -85) levelDbm = 3;
920 else if (cdmaDbm >= -95) levelDbm = 2;
921 else if (cdmaDbm >= -100) levelDbm = 1;
922 else levelDbm = 0;
923
924 // Ec/Io are in dB*10
925 if (cdmaEcio >= -90) levelEcio = 4;
926 else if (cdmaEcio >= -110) levelEcio = 3;
927 else if (cdmaEcio >= -130) levelEcio = 2;
928 else if (cdmaEcio >= -150) levelEcio = 1;
929 else levelEcio = 0;
930
931 iconLevel = (levelDbm < levelEcio) ? levelDbm : levelEcio;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800932 }
Wink Saville04e71b32009-04-02 11:00:54 -0700933
Wink Savillee9b06d72009-05-18 21:47:50 -0700934 if ((mServiceState.getRadioTechnology() == ServiceState.RADIO_TECHNOLOGY_EVDO_0)
935 || (mServiceState.getRadioTechnology() == ServiceState.RADIO_TECHNOLOGY_EVDO_A)) {
936 // Use Evdo icon
937 evdoIconList = this.sSignalImages_evdo;
938
Yong Zhang96f27472009-07-22 17:25:30 -0500939 int evdoDbm = mSignalStrength.getEvdoDbm();
Wink Savillee9b06d72009-05-18 21:47:50 -0700940 int evdoSnr = mSignalStrength.getEvdoSnr();
Yong Zhang96f27472009-07-22 17:25:30 -0500941 int levelEvdoDbm = 0;
Wink Savillee9b06d72009-05-18 21:47:50 -0700942 int levelEvdoSnr = 0;
943
Yong Zhang96f27472009-07-22 17:25:30 -0500944 if (evdoDbm >= -65) levelEvdoDbm = 4;
945 else if (evdoDbm >= -75) levelEvdoDbm = 3;
946 else if (evdoDbm >= -90) levelEvdoDbm = 2;
947 else if (evdoDbm >= -105) levelEvdoDbm = 1;
948 else levelEvdoDbm = 0;
Wink Savillee9b06d72009-05-18 21:47:50 -0700949
950 if (evdoSnr > 7) levelEvdoSnr = 4;
951 else if (evdoSnr > 5) levelEvdoSnr = 3;
952 else if (evdoSnr > 3) levelEvdoSnr = 2;
953 else if (evdoSnr > 1) levelEvdoSnr = 1;
954 else levelEvdoSnr = 0;
955
Yong Zhang96f27472009-07-22 17:25:30 -0500956 evdoIconLevel = (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr;
Wink Savillee9b06d72009-05-18 21:47:50 -0700957
958 mPhoneEvdoData.iconId = evdoIconList[evdoIconLevel];
959 mService.updateIcon(mPhoneEvdoIcon, mPhoneEvdoData, null);
960 mService.setIconVisibility(mPhoneEvdoIcon,true);
961 } else {
962 mService.setIconVisibility(mPhoneEvdoIcon,false);
963 }
964
965 mPhoneData.iconId = iconList[iconLevel];
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800966 mService.updateIcon(mPhoneIcon, mPhoneData, null);
967 }
968
969 private final void updateDataNetType() {
Wink Saville04e71b32009-04-02 11:00:54 -0700970 int net = mPhone.getNetworkType();
Wink Saville04e71b32009-04-02 11:00:54 -0700971
972 switch (net) {
Wink Saville04e71b32009-04-02 11:00:54 -0700973 case TelephonyManager.NETWORK_TYPE_EDGE:
974 mDataIconList = sDataNetType_e;
975 break;
976 case TelephonyManager.NETWORK_TYPE_UMTS:
977 mDataIconList = sDataNetType_3g;
978 break;
Li Zheebe66342009-08-14 19:22:16 +0800979 case TelephonyManager.NETWORK_TYPE_HSDPA:
980 case TelephonyManager.NETWORK_TYPE_HSUPA:
981 case TelephonyManager.NETWORK_TYPE_HSPA:
982 mDataIconList = sDataNetType_h;
983 break;
Wink Saville04e71b32009-04-02 11:00:54 -0700984 case TelephonyManager.NETWORK_TYPE_CDMA:
985 // display 1xRTT for IS95A/B
986 mDataIconList = this.sDataNetType_1xrtt;
987 break;
988 case TelephonyManager.NETWORK_TYPE_1xRTT:
989 mDataIconList = this.sDataNetType_1xrtt;
990 break;
991 case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through
992 case TelephonyManager.NETWORK_TYPE_EVDO_A:
993 mDataIconList = sDataNetType_evdo;
994 break;
995 default:
996 mDataIconList = sDataNetType_g;
997 break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800998 }
999 }
1000
1001 private final void updateDataIcon() {
1002 int iconId;
1003 boolean visible = true;
1004
Wink Savillee9b06d72009-05-18 21:47:50 -07001005 if (!isCdma()) {
1006 // GSM case, we have to check also the sim state
1007 if (mSimState == IccCard.State.READY || mSimState == IccCard.State.UNKNOWN) {
1008 if (hasService() && mDataState == TelephonyManager.DATA_CONNECTED) {
1009 switch (mDataActivity) {
1010 case TelephonyManager.DATA_ACTIVITY_IN:
1011 iconId = mDataIconList[1];
1012 break;
1013 case TelephonyManager.DATA_ACTIVITY_OUT:
1014 iconId = mDataIconList[2];
1015 break;
1016 case TelephonyManager.DATA_ACTIVITY_INOUT:
1017 iconId = mDataIconList[3];
1018 break;
1019 default:
1020 iconId = mDataIconList[0];
1021 break;
1022 }
1023 mDataData.iconId = iconId;
1024 mService.updateIcon(mDataIcon, mDataData, null);
1025 } else {
1026 visible = false;
1027 }
1028 } else {
1029 mDataData.iconId = com.android.internal.R.drawable.stat_sys_no_sim;
1030 mService.updateIcon(mDataIcon, mDataData, null);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001031 }
Wink Savillee9b06d72009-05-18 21:47:50 -07001032 } else {
1033 // CDMA case, mDataActivity can be also DATA_ACTIVITY_DORMANT
1034 if (hasService() && mDataState == TelephonyManager.DATA_CONNECTED) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001035 switch (mDataActivity) {
1036 case TelephonyManager.DATA_ACTIVITY_IN:
Wink Savillee9b06d72009-05-18 21:47:50 -07001037 iconId = mDataIconList[1];
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001038 break;
1039 case TelephonyManager.DATA_ACTIVITY_OUT:
Wink Savillee9b06d72009-05-18 21:47:50 -07001040 iconId = mDataIconList[2];
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001041 break;
1042 case TelephonyManager.DATA_ACTIVITY_INOUT:
Wink Savillee9b06d72009-05-18 21:47:50 -07001043 iconId = mDataIconList[3];
1044 break;
1045 case TelephonyManager.DATA_ACTIVITY_DORMANT:
1046 iconId = mDataIconList[4];
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001047 break;
1048 default:
Wink Savillee9b06d72009-05-18 21:47:50 -07001049 iconId = mDataIconList[0];
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001050 break;
1051 }
1052 mDataData.iconId = iconId;
1053 mService.updateIcon(mDataIcon, mDataData, null);
1054 } else {
1055 visible = false;
1056 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001057 }
Wink Savillee9b06d72009-05-18 21:47:50 -07001058
Dianne Hackborn4840e142009-03-24 22:40:29 -07001059 long ident = Binder.clearCallingIdentity();
1060 try {
Wink Saville04e71b32009-04-02 11:00:54 -07001061 mBatteryStats.notePhoneDataConnectionState(mPhone.getNetworkType(), visible);
Dianne Hackborn4840e142009-03-24 22:40:29 -07001062 } catch (RemoteException e) {
1063 } finally {
1064 Binder.restoreCallingIdentity(ident);
1065 }
Wink Savillee9b06d72009-05-18 21:47:50 -07001066
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001067 if (mDataIconVisible != visible) {
1068 mService.setIconVisibility(mDataIcon, visible);
1069 mDataIconVisible = visible;
1070 }
1071 }
1072
1073 private final void updateVolume() {
1074 AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
1075 final int ringerMode = audioManager.getRingerMode();
1076 final boolean visible = ringerMode == AudioManager.RINGER_MODE_SILENT ||
Wink Savillee9b06d72009-05-18 21:47:50 -07001077 ringerMode == AudioManager.RINGER_MODE_VIBRATE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001078 final int iconId = audioManager.shouldVibrate(AudioManager.VIBRATE_TYPE_RINGER)
1079 ? com.android.internal.R.drawable.stat_sys_ringer_vibrate
1080 : com.android.internal.R.drawable.stat_sys_ringer_silent;
1081
1082 if (visible) {
1083 mVolumeData.iconId = iconId;
1084 mService.updateIcon(mVolumeIcon, mVolumeData, null);
1085 }
1086 if (visible != mVolumeVisible) {
1087 mService.setIconVisibility(mVolumeIcon, visible);
1088 mVolumeVisible = visible;
1089 }
1090 }
1091
1092 private final void updateBluetooth(Intent intent) {
1093 int iconId = com.android.internal.R.drawable.stat_sys_data_bluetooth;
1094
1095 String action = intent.getAction();
The Android Open Source Project10592532009-03-18 17:39:46 -07001096 if (action.equals(BluetoothIntent.BLUETOOTH_STATE_CHANGED_ACTION)) {
1097 int state = intent.getIntExtra(BluetoothIntent.BLUETOOTH_STATE,
1098 BluetoothError.ERROR);
Nick Pellybd022f42009-08-14 18:33:38 -07001099 mBluetoothEnabled = state == BluetoothAdapter.BLUETOOTH_STATE_ON;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001100 } else if (action.equals(BluetoothIntent.HEADSET_STATE_CHANGED_ACTION)) {
1101 mBluetoothHeadsetState = intent.getIntExtra(BluetoothIntent.HEADSET_STATE,
1102 BluetoothHeadset.STATE_ERROR);
1103 } else if (action.equals(BluetoothA2dp.SINK_STATE_CHANGED_ACTION)) {
1104 mBluetoothA2dpState = intent.getIntExtra(BluetoothA2dp.SINK_STATE,
1105 BluetoothA2dp.STATE_DISCONNECTED);
Jiafa Liu3f416732009-07-02 16:36:02 +08001106 } else if (action.equals(BluetoothPbap.PBAP_STATE_CHANGED_ACTION)) {
1107 mBluetoothPbapState = intent.getIntExtra(BluetoothPbap.PBAP_STATE,
1108 BluetoothPbap.STATE_DISCONNECTED);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001109 } else {
1110 return;
1111 }
Wink Savillee9b06d72009-05-18 21:47:50 -07001112
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001113 if (mBluetoothHeadsetState == BluetoothHeadset.STATE_CONNECTED ||
1114 mBluetoothA2dpState == BluetoothA2dp.STATE_CONNECTED ||
Jiafa Liu3f416732009-07-02 16:36:02 +08001115 mBluetoothA2dpState == BluetoothA2dp.STATE_PLAYING ||
1116 mBluetoothPbapState == BluetoothPbap.STATE_CONNECTED) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001117 iconId = com.android.internal.R.drawable.stat_sys_data_bluetooth_connected;
1118 }
1119
1120 mBluetoothData.iconId = iconId;
1121 mService.updateIcon(mBluetoothIcon, mBluetoothData, null);
1122 mService.setIconVisibility(mBluetoothIcon, mBluetoothEnabled);
1123 }
1124
1125 private final void updateWifi(Intent intent) {
1126 final String action = intent.getAction();
1127 if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
Wink Savillee9b06d72009-05-18 21:47:50 -07001128
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001129 final boolean enabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
1130 WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED;
Wink Savillee9b06d72009-05-18 21:47:50 -07001131
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001132 if (!enabled) {
1133 // If disabled, hide the icon. (We show icon when connected.)
1134 mService.setIconVisibility(mWifiIcon, false);
1135 }
Wink Savillee9b06d72009-05-18 21:47:50 -07001136
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001137 } else if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
1138 final boolean enabled = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED,
1139 false);
1140 if (!enabled) {
1141 mService.setIconVisibility(mWifiIcon, false);
1142 }
1143 } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
1144
Wink Savillee9b06d72009-05-18 21:47:50 -07001145 final NetworkInfo networkInfo = (NetworkInfo)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001146 intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
Wink Savillee9b06d72009-05-18 21:47:50 -07001147
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001148 int iconId;
1149 if (networkInfo != null && networkInfo.isConnected()) {
1150 mIsWifiConnected = true;
1151 if (mLastWifiSignalLevel == -1) {
1152 iconId = sWifiSignalImages[0];
1153 } else {
1154 iconId = sWifiSignalImages[mLastWifiSignalLevel];
1155 }
Wink Saville04e71b32009-04-02 11:00:54 -07001156
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001157 // Show the icon since wi-fi is connected
1158 mService.setIconVisibility(mWifiIcon, true);
Wink Saville04e71b32009-04-02 11:00:54 -07001159
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001160 } else {
1161 mLastWifiSignalLevel = -1;
1162 mIsWifiConnected = false;
1163 iconId = sWifiSignalImages[0];
1164
1165 // Hide the icon since we're not connected
1166 mService.setIconVisibility(mWifiIcon, false);
1167 }
1168
1169 mWifiData.iconId = iconId;
1170 mService.updateIcon(mWifiIcon, mWifiData, null);
1171 } else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
1172 final int newRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
1173 int newSignalLevel = WifiManager.calculateSignalLevel(newRssi,
1174 sWifiSignalImages.length);
1175 if (newSignalLevel != mLastWifiSignalLevel) {
1176 mLastWifiSignalLevel = newSignalLevel;
1177 if (mIsWifiConnected) {
1178 mWifiData.iconId = sWifiSignalImages[newSignalLevel];
1179 } else {
1180 mWifiData.iconId = sWifiTemporarilyNotConnectedImage;
1181 }
1182 mService.updateIcon(mWifiIcon, mWifiData, null);
1183 }
1184 }
1185 }
1186
1187 private final void updateGps(Intent intent) {
1188 final String action = intent.getAction();
1189 final boolean enabled = intent.getBooleanExtra(GpsLocationProvider.EXTRA_ENABLED, false);
1190
1191 if (action.equals(GpsLocationProvider.GPS_FIX_CHANGE_ACTION) && enabled) {
1192 // GPS is getting fixes
1193 mService.updateIcon(mGpsIcon, mGpsFixIconData, null);
Wink Savillee9b06d72009-05-18 21:47:50 -07001194 mService.setIconVisibility(mGpsIcon, true);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001195 } else if (action.equals(GpsLocationProvider.GPS_ENABLED_CHANGE_ACTION) && !enabled) {
1196 // GPS is off
Wink Savillee9b06d72009-05-18 21:47:50 -07001197 mService.setIconVisibility(mGpsIcon, false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001198 } else {
1199 // GPS is on, but not receiving fixes
1200 mService.updateIcon(mGpsIcon, mGpsEnabledIconData, null);
Wink Savillee9b06d72009-05-18 21:47:50 -07001201 mService.setIconVisibility(mGpsIcon, true);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001202 }
1203 }
1204
Wink Savillee9b06d72009-05-18 21:47:50 -07001205 private final void updateTTY(Intent intent) {
Wink Saville04e71b32009-04-02 11:00:54 -07001206 final String action = intent.getAction();
1207 final boolean enabled = intent.getBooleanExtra(TtyIntent.TTY_ENABLED, false);
1208
1209 Log.i(TAG, "updateTTY: enabled: " + enabled);
1210
1211 if (enabled) {
1212 // TTY is on
1213 Log.i(TAG, "updateTTY: set TTY on");
1214 mService.updateIcon(mTTYModeIcon, mTTYModeEnableIconData, null);
Wink Savillee9b06d72009-05-18 21:47:50 -07001215 mService.setIconVisibility(mTTYModeIcon, true);
Wink Saville04e71b32009-04-02 11:00:54 -07001216 } else {
1217 // TTY is off
1218 Log.i(TAG, "updateTTY: set TTY off");
Wink Savillee9b06d72009-05-18 21:47:50 -07001219 mService.setIconVisibility(mTTYModeIcon, false);
Wink Saville04e71b32009-04-02 11:00:54 -07001220 }
1221 }
1222
Wink Savillee9b06d72009-05-18 21:47:50 -07001223 private final void updateCdmaRoamingIcon() {
1224 if (!hasService()) {
1225 mService.setIconVisibility(mCdmaRoamingIndicatorIcon, false);
Wink Savillef3152382009-06-01 14:39:20 -07001226 return;
Wink Savillee9b06d72009-05-18 21:47:50 -07001227 }
1228
1229 if (!isCdma()) {
1230 mService.setIconVisibility(mCdmaRoamingIndicatorIcon, false);
Wink Savillef3152382009-06-01 14:39:20 -07001231 return;
Wink Savillee9b06d72009-05-18 21:47:50 -07001232 }
1233
1234 int[] iconList = sRoamingIndicatorImages_cdma;
1235 int iconIndex = mPhone.getCdmaEriIconIndex();
1236 int iconMode = mPhone.getCdmaEriIconMode();
1237
1238 if (iconIndex == -1) {
1239 Log.e(TAG, "getCdmaEriIconIndex returned null, skipping ERI icon update");
1240 return;
1241 }
1242
1243 if (iconMode == -1) {
1244 Log.e(TAG, "getCdmeEriIconMode returned null, skipping ERI icon update");
1245 return;
1246 }
1247
1248 if (iconIndex == EriInfo.ROAMING_INDICATOR_OFF) {
1249 Log.d(TAG, "Cdma ROAMING_INDICATOR_OFF, removing ERI icon");
1250 mService.setIconVisibility(mCdmaRoamingIndicatorIcon, false);
1251 return;
1252 }
1253
1254 switch (iconMode) {
1255 case EriInfo.ROAMING_ICON_MODE_NORMAL:
1256 mCdmaRoamingIndicatorIconData.iconId = iconList[iconIndex];
1257 mService.updateIcon(mCdmaRoamingIndicatorIcon, mCdmaRoamingIndicatorIconData, null);
1258 mService.setIconVisibility(mCdmaRoamingIndicatorIcon, true);
1259 break;
1260 case EriInfo.ROAMING_ICON_MODE_FLASH:
Wink Savillef3152382009-06-01 14:39:20 -07001261 mCdmaRoamingIndicatorIconData.iconId =
1262 com.android.internal.R.drawable.stat_sys_roaming_cdma_flash;
Wink Savillee9b06d72009-05-18 21:47:50 -07001263 mService.updateIcon(mCdmaRoamingIndicatorIcon, mCdmaRoamingIndicatorIconData, null);
Wink Savillef3152382009-06-01 14:39:20 -07001264 mService.setIconVisibility(mCdmaRoamingIndicatorIcon, true);
Wink Savillee9b06d72009-05-18 21:47:50 -07001265 break;
1266
1267 }
1268 mService.updateIcon(mPhoneIcon, mPhoneData, null);
1269 }
1270
1271
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001272 private class StatusBarHandler extends Handler {
1273 @Override
1274 public void handleMessage(Message msg) {
1275 switch (msg.what) {
1276 case EVENT_BATTERY_CLOSE:
1277 if (msg.arg1 == mBatteryViewSequence) {
1278 closeLastBatteryView();
1279 }
1280 break;
1281 }
1282 }
1283 }
1284}