19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server.status;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.AlertDialog;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.bluetooth.BluetoothA2dp;
21bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport android.bluetooth.BluetoothAdapter;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.bluetooth.BluetoothHeadset;
233f41673265dcaaef058703311c5481e8a51fd8beJiafa Liuimport android.bluetooth.BluetoothPbap;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver;
250e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandlerimport android.content.ContentResolver;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.DialogInterface;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
340e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandlerimport android.media.Ringtone;
350e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandlerimport android.media.RingtoneManager;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.NetworkInfo;
370e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandlerimport android.net.Uri;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.wifi.WifiManager;
394840e143df9804e3399a4e0341c0601f80d65d6eDianne Hackbornimport android.os.Binder;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
434840e143df9804e3399a4e0341c0601f80d65d6eDianne Hackbornimport android.os.RemoteException;
444154c07c5cabc74029a2df379075391d782a682cSan Mehatimport android.os.storage.StorageManager;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.PhoneStateListener;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.ServiceState;
48e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.format.DateFormat;
5136e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischerimport android.text.style.RelativeSizeSpan;
5236e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischerimport android.text.Spannable;
5336e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischerimport android.text.SpannableStringBuilder;
548a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManagerImpl;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ImageView;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.LinearLayout;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.TextView;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport com.android.internal.R;
6404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport com.android.internal.app.IBatteryStats;
6504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport com.android.internal.location.GpsLocationProvider;
6604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport com.android.internal.telephony.IccCard;
6704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport com.android.internal.telephony.TelephonyIntents;
68e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport com.android.internal.telephony.cdma.EriInfo;
6904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport com.android.internal.telephony.cdma.TtyIntent;
7004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport com.android.server.am.BatteryStatsService;
7104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
7236e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischerimport java.text.SimpleDateFormat;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Calendar;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.TimeZone;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class contains all of the policy about which icons are installed in the status
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bar at boot time.  In reality, it should go into the android.policy package, but
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * putting it here is the first step from extracting it.
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class StatusBarPolicy {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "StatusBarPolicy";
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static StatusBarPolicy sInstance;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // message codes for the handler
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int EVENT_BATTERY_CLOSE = 4;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
894840e143df9804e3399a4e0341c0601f80d65d6eDianne Hackborn    private final Context mContext;
904840e143df9804e3399a4e0341c0601f80d65d6eDianne Hackborn    private final StatusBarService mService;
914840e143df9804e3399a4e0341c0601f80d65d6eDianne Hackborn    private final Handler mHandler = new StatusBarHandler();
924840e143df9804e3399a4e0341c0601f80d65d6eDianne Hackborn    private final IBatteryStats mBatteryStats;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // clock
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Calendar mCalendar;
9663ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato    private String mClockFormatString;
9763ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato    private SimpleDateFormat mClockFormat;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mClockIcon;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IconData mClockData;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1014154c07c5cabc74029a2df379075391d782a682cSan Mehat    // storage
1024154c07c5cabc74029a2df379075391d782a682cSan Mehat    private StorageManager mStorageManager;
1034154c07c5cabc74029a2df379075391d782a682cSan Mehat
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // battery
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mBatteryIcon;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IconData mBatteryData;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mBatteryFirst = true;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mBatteryPlugged;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mBatteryLevel;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private AlertDialog mLowBatteryDialog;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TextView mBatteryLevelTextView;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private View mBatteryView;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mBatteryViewSequence;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mBatteryShowLowOnEndCall = false;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean SHOW_LOW_BATTERY_WARNING = true;
1160e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandler    private static final boolean SHOW_BATTERY_WARNINGS_IN_CALL = true;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // phone
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TelephonyManager mPhone;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mPhoneIcon;
12104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
12204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    //***** Signal strength icons
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IconData mPhoneData;
12404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    //GSM/UMTS
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int[] sSignalImages = new int[] {
126e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_signal_0,
127e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_signal_1,
128e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_signal_2,
129e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_signal_3,
130e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_signal_4
131e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    };
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int[] sSignalImages_r = new int[] {
133e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_r_signal_0,
134e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_r_signal_1,
135e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_r_signal_2,
136e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_r_signal_3,
137e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_r_signal_4
138e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    };
139e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    private static final int[] sRoamingIndicatorImages_cdma = new int[] {
140e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0, //Standard Roaming Indicator
141e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        // 1 is Standard Roaming Indicator OFF
142e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        // TODO T: image never used, remove and put 0 instead?
143e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
144e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
145e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        // 2 is Standard Roaming Indicator FLASHING
146e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        // TODO T: image never used, remove and put 0 instead?
147e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
148e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
149e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        // 3-12 Standard ERI
150e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0, //3
151e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
152e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
153e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
154e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
155e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
156e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
157e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
158e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
159e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
160e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
161e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        // 13-63 Reserved for Standard ERI
162e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0, //13
163e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
164e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
165e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
166e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
167e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
168e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
169e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
170e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
171e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
172e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
173e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
174e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
175e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
176e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
177e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
178e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
179e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
180e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
181e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
182e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
183e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
184e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
185e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
186e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
187e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
188e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
189e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
190e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
191e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
192e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
193e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
194e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
195e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
196e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
197e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
198e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
199e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
200e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
201e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
202e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
203e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
204e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
205e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
206e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
207e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
208e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
209e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
210e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
211e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
212e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
213e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
214e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        // 64-127 Reserved for Non Standard (Operator Specific) ERI
215e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0, //64
216e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
217e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
218e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
219e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
220e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
221e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
222e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
223e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
224e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
225e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
226e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
227e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
228e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
229e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
230e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
231e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
232e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
233e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0,
234e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        com.android.internal.R.drawable.stat_sys_roaming_cdma_0 //83
235e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
236e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        // 128-255 Reserved
23704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    };
23804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
23904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    //***** Data connection icons
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int[] mDataIconList = sDataNetType_g;
24104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    //GSM/UMTS
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int[] sDataNetType_g = new int[] {
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_data_connected_g,
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_data_in_g,
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_data_out_g,
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_data_inandout_g,
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int[] sDataNetType_3g = new int[] {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_data_connected_3g,
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_data_in_3g,
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_data_out_3g,
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_data_inandout_3g,
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int[] sDataNetType_e = new int[] {
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_data_connected_e,
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_data_in_e,
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_data_out_e,
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_data_inandout_e,
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
260ebe66345e7099ca6fc95e8aa4d31a5b5cbbd6224Li Zhe    //3.5G
261ebe66345e7099ca6fc95e8aa4d31a5b5cbbd6224Li Zhe    private static final int[] sDataNetType_h = new int[] {
262ebe66345e7099ca6fc95e8aa4d31a5b5cbbd6224Li Zhe            com.android.internal.R.drawable.stat_sys_data_connected_h,
263ebe66345e7099ca6fc95e8aa4d31a5b5cbbd6224Li Zhe            com.android.internal.R.drawable.stat_sys_data_in_h,
264ebe66345e7099ca6fc95e8aa4d31a5b5cbbd6224Li Zhe            com.android.internal.R.drawable.stat_sys_data_out_h,
265ebe66345e7099ca6fc95e8aa4d31a5b5cbbd6224Li Zhe            com.android.internal.R.drawable.stat_sys_data_inandout_h,
266ebe66345e7099ca6fc95e8aa4d31a5b5cbbd6224Li Zhe    };
267ebe66345e7099ca6fc95e8aa4d31a5b5cbbd6224Li Zhe
26804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    //CDMA
2699f87cb2f8d796f57054c1c0f0ce4b9bef9414642johnwang    // Use 3G icons for EVDO data and 1x icons for 1XRTT data
2709f87cb2f8d796f57054c1c0f0ce4b9bef9414642johnwang    private static final int[] sDataNetType_1x = new int[] {
2719f87cb2f8d796f57054c1c0f0ce4b9bef9414642johnwang        com.android.internal.R.drawable.stat_sys_data_connected_1x,
2729f87cb2f8d796f57054c1c0f0ce4b9bef9414642johnwang        com.android.internal.R.drawable.stat_sys_data_in_1x,
2739f87cb2f8d796f57054c1c0f0ce4b9bef9414642johnwang        com.android.internal.R.drawable.stat_sys_data_out_1x,
2749f87cb2f8d796f57054c1c0f0ce4b9bef9414642johnwang        com.android.internal.R.drawable.stat_sys_data_inandout_1x,
27504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    };
27604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Assume it's all good unless we hear otherwise.  We don't always seem
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // to get broadcasts that it *is* there.
27904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    IccCard.State mSimState = IccCard.State.READY;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mPhoneState = TelephonyManager.CALL_STATE_IDLE;
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mDataState = TelephonyManager.DATA_DISCONNECTED;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mDataActivity = TelephonyManager.DATA_ACTIVITY_NONE;
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ServiceState mServiceState;
284e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    SignalStrength mSignalStrength;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // data connection
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mDataIcon;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IconData mDataData;
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mDataIconVisible;
29033e21fcc99dd91061ea245984c4e9a1544cb943fJohn Wang    private boolean mHspaDataDistinguishable;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ringer volume
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mVolumeIcon;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IconData mVolumeData;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mVolumeVisible;
29604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // bluetooth device status
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mBluetoothIcon;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IconData mBluetoothData;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mBluetoothHeadsetState;
301084c665421502b13271e94bd0a342b0ddbbaa7caJaikumar Ganesh    private boolean mBluetoothA2dpConnected;
3023f41673265dcaaef058703311c5481e8a51fd8beJiafa Liu    private int mBluetoothPbapState;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mBluetoothEnabled;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // wifi
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int[] sWifiSignalImages = new int[] {
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_wifi_signal_1,
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_wifi_signal_2,
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_wifi_signal_3,
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_wifi_signal_4,
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int sWifiTemporarilyNotConnectedImage =
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            com.android.internal.R.drawable.stat_sys_wifi_signal_0;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mLastWifiSignalLevel = -1;
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mIsWifiConnected = false;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mWifiIcon;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IconData mWifiData;
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // gps
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mGpsIcon;
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IconData mGpsEnabledIconData;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IconData mGpsFixIconData;
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // alarm clock
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Icon lit when clock is set
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mAlarmClockIcon;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IconData mAlarmClockIconData;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // sync state
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // If sync is active the SyncActive icon is displayed. If sync is not active but
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // sync is failing the SyncFailing icon is displayed. Otherwise neither are displayed.
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mSyncActiveIcon;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IBinder mSyncFailingIcon;
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    // TTY mode
33704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    // Icon lit when TTY mode is enabled
33804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    private IBinder mTTYModeIcon;
33904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    private IconData mTTYModeEnableIconData;
34004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
341e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    // Cdma Roaming Indicator, ERI
342e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    private IBinder mCdmaRoamingIndicatorIcon;
343e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    private IconData mCdmaRoamingIndicatorIconData;
344e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onReceive(Context context, Intent intent) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String action = intent.getAction();
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (action.equals(Intent.ACTION_TIME_TICK)) {
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateClock();
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (action.equals(Intent.ACTION_TIME_CHANGED)) {
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateClock();
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3558ec5b83fc8f8aa68805c4d5987f8f75bb28250caDianne Hackborn            else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
3568ec5b83fc8f8aa68805c4d5987f8f75bb28250caDianne Hackborn                updateBattery(intent);
3578ec5b83fc8f8aa68805c4d5987f8f75bb28250caDianne Hackborn            }
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateClock();
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (action.equals(Intent.ACTION_TIMEZONE_CHANGED)) {
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String tz = intent.getStringExtra("time-zone");
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCalendar = Calendar.getInstance(TimeZone.getTimeZone(tz));
364c4938fd6190e04a454e8a10d4cba95ab6b805e71Amith Yamasani                if (mClockFormat != null) {
365c4938fd6190e04a454e8a10d4cba95ab6b805e71Amith Yamasani                    mClockFormat.setTimeZone(mCalendar.getTimeZone());
366c4938fd6190e04a454e8a10d4cba95ab6b805e71Amith Yamasani                }
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateClock();
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (action.equals(Intent.ACTION_ALARM_CHANGED)) {
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateAlarm(intent);
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (action.equals(Intent.ACTION_SYNC_STATE_CHANGED)) {
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateSyncState(intent);
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
375a82842f98d64897e92e1012404863f940bd03d26Mihai Preda            else if (action.equals(Intent.ACTION_BATTERY_LOW)) {
376a82842f98d64897e92e1012404863f940bd03d26Mihai Preda                onBatteryLow(intent);
377a82842f98d64897e92e1012404863f940bd03d26Mihai Preda            }
37869eb0bfcce7ec68a9771dbcf53434dfbca183d0cMike Lockwood            else if (action.equals(Intent.ACTION_BATTERY_OKAY)
37969eb0bfcce7ec68a9771dbcf53434dfbca183d0cMike Lockwood                    || action.equals(Intent.ACTION_POWER_CONNECTED)) {
3808ec5b83fc8f8aa68805c4d5987f8f75bb28250caDianne Hackborn                onBatteryOkay(intent);
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
382de893f550301a60274e87aa8168225e7a7a42184Nick Pelly            else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED) ||
383005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly                    action.equals(BluetoothHeadset.ACTION_STATE_CHANGED) ||
384005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly                    action.equals(BluetoothA2dp.ACTION_SINK_STATE_CHANGED) ||
3853f41673265dcaaef058703311c5481e8a51fd8beJiafa Liu                    action.equals(BluetoothPbap.PBAP_STATE_CHANGED_ACTION)) {
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateBluetooth(intent);
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION) ||
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION) ||
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateWifi(intent);
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (action.equals(GpsLocationProvider.GPS_ENABLED_CHANGE_ACTION) ||
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    action.equals(GpsLocationProvider.GPS_FIX_CHANGE_ACTION)) {
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateGps(intent);
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION) ||
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    action.equals(AudioManager.VIBRATE_SETTING_CHANGED_ACTION)) {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateVolume();
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateSimState(intent);
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            else if (action.equals(TtyIntent.TTY_ENABLED_CHANGE_ACTION)) {
40504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                updateTTY(intent);
40604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            }
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private StatusBarPolicy(Context context, StatusBarService service) {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mService = service;
413e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        mSignalStrength = new SignalStrength();
4144840e143df9804e3399a4e0341c0601f80d65d6eDianne Hackborn        mBatteryStats = BatteryStatsService.getService();
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // clock
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalendar = Calendar.getInstance(TimeZone.getDefault());
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mClockData = IconData.makeText("clock", "");
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mClockIcon = service.addIcon(mClockData, null);
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        updateClock();
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4224154c07c5cabc74029a2df379075391d782a682cSan Mehat        // storage
4234154c07c5cabc74029a2df379075391d782a682cSan Mehat        mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
4244154c07c5cabc74029a2df379075391d782a682cSan Mehat        mStorageManager.registerListener(
4254154c07c5cabc74029a2df379075391d782a682cSan Mehat                new com.android.server.status.StorageNotification(context));
4264154c07c5cabc74029a2df379075391d782a682cSan Mehat
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // battery
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryData = IconData.makeIcon("battery",
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null, com.android.internal.R.drawable.stat_sys_battery_unknown, 0, 0);
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryIcon = service.addIcon(mBatteryData, null);
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // phone_signal
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhone = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
434e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        mPhoneData = IconData.makeIcon("phone_signal",
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null, com.android.internal.R.drawable.stat_sys_signal_null, 0, 0);
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneIcon = service.addIcon(mPhoneData, null);
437e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // register for phone state notifications.
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ((TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE))
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .listen(mPhoneStateListener,
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          PhoneStateListener.LISTEN_SERVICE_STATE
442e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                        | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        | PhoneStateListener.LISTEN_CALL_STATE
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        | PhoneStateListener.LISTEN_DATA_ACTIVITY);
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // data_connection
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDataData = IconData.makeIcon("data_connection",
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null, com.android.internal.R.drawable.stat_sys_data_connected_g, 0, 0);
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDataIcon = service.addIcon(mDataData, null);
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        service.setIconVisibility(mDataIcon, false);
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // wifi
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWifiData = IconData.makeIcon("wifi", null, sWifiSignalImages[0], 0, 0);
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWifiIcon = service.addIcon(mWifiData, null);
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        service.setIconVisibility(mWifiIcon, false);
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // wifi will get updated by the sticky intents
45804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
45904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        // TTY status
46004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        mTTYModeEnableIconData = IconData.makeIcon("tty",
46104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                null, com.android.internal.R.drawable.stat_sys_tty_mode, 0, 0);
46204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        mTTYModeIcon = service.addIcon(mTTYModeEnableIconData, null);
46304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        service.setIconVisibility(mTTYModeIcon, false);
46404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
465e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        // Cdma Roaming Indicator, ERI
466e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        mCdmaRoamingIndicatorIconData = IconData.makeIcon("cdma_eri",
467e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                null, com.android.internal.R.drawable.stat_sys_roaming_cdma_0, 0, 0);
468e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        mCdmaRoamingIndicatorIcon = service.addIcon(mCdmaRoamingIndicatorIconData, null);
469e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        service.setIconVisibility(mCdmaRoamingIndicatorIcon, false);
470e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // bluetooth status
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBluetoothData = IconData.makeIcon("bluetooth",
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null, com.android.internal.R.drawable.stat_sys_data_bluetooth, 0, 0);
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBluetoothIcon = service.addIcon(mBluetoothData, null);
475f242b7b931898856bcbcb7ec36cacf43098ba544Nick Pelly        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
476bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly        if (adapter != null) {
477bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly            mBluetoothEnabled = adapter.isEnabled();
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBluetoothEnabled = false;
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
481084c665421502b13271e94bd0a342b0ddbbaa7caJaikumar Ganesh        mBluetoothA2dpConnected = false;
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBluetoothHeadsetState = BluetoothHeadset.STATE_DISCONNECTED;
4833f41673265dcaaef058703311c5481e8a51fd8beJiafa Liu        mBluetoothPbapState = BluetoothPbap.STATE_DISCONNECTED;
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mService.setIconVisibility(mBluetoothIcon, mBluetoothEnabled);
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Gps status
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mGpsEnabledIconData = IconData.makeIcon("gps",
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null, com.android.internal.R.drawable.stat_sys_gps_acquiring_anim, 0, 0);
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mGpsFixIconData = IconData.makeIcon("gps",
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null, com.android.internal.R.drawable.stat_sys_gps_on, 0, 0);
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mGpsIcon = service.addIcon(mGpsEnabledIconData, null);
492347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        service.setIconVisibility(mGpsIcon, false);
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Alarm clock
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAlarmClockIconData = IconData.makeIcon(
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "alarm_clock",
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null, com.android.internal.R.drawable.stat_notify_alarm, 0, 0);
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAlarmClockIcon = service.addIcon(mAlarmClockIconData, null);
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        service.setIconVisibility(mAlarmClockIcon, false);
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Sync state
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSyncActiveIcon = service.addIcon(IconData.makeIcon("sync_active",
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null, R.drawable.stat_notify_sync_anim0, 0, 0), null);
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSyncFailingIcon = service.addIcon(IconData.makeIcon("sync_failing",
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null, R.drawable.stat_notify_sync_error, 0, 0), null);
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        service.setIconVisibility(mSyncActiveIcon, false);
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        service.setIconVisibility(mSyncFailingIcon, false);
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // volume
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mVolumeData = IconData.makeIcon("volume",
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                null, com.android.internal.R.drawable.stat_sys_ringer_silent, 0, 0);
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mVolumeIcon = service.addIcon(mVolumeData, null);
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        service.setIconVisibility(mVolumeIcon, false);
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        updateVolume();
515347c5a22a915df5aa180573573adf6b2213a35dcjohnwang
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IntentFilter filter = new IntentFilter();
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Register for Intent broadcasts for...
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        filter.addAction(Intent.ACTION_TIME_TICK);
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        filter.addAction(Intent.ACTION_TIME_CHANGED);
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
523a82842f98d64897e92e1012404863f940bd03d26Mihai Preda        filter.addAction(Intent.ACTION_BATTERY_LOW);
5248ec5b83fc8f8aa68805c4d5987f8f75bb28250caDianne Hackborn        filter.addAction(Intent.ACTION_BATTERY_OKAY);
52569eb0bfcce7ec68a9771dbcf53434dfbca183d0cMike Lockwood        filter.addAction(Intent.ACTION_POWER_CONNECTED);
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        filter.addAction(Intent.ACTION_ALARM_CHANGED);
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED);
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        filter.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION);
531de893f550301a60274e87aa8168225e7a7a42184Nick Pelly        filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
532005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly        filter.addAction(BluetoothHeadset.ACTION_STATE_CHANGED);
533005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly        filter.addAction(BluetoothA2dp.ACTION_SINK_STATE_CHANGED);
5343f41673265dcaaef058703311c5481e8a51fd8beJiafa Liu        filter.addAction(BluetoothPbap.PBAP_STATE_CHANGED_ACTION);
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        filter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        filter.addAction(GpsLocationProvider.GPS_ENABLED_CHANGE_ACTION);
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        filter.addAction(GpsLocationProvider.GPS_FIX_CHANGE_ACTION);
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
54204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        filter.addAction(TtyIntent.TTY_ENABLED_CHANGE_ACTION);
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
54433e21fcc99dd91061ea245984c4e9a1544cb943fJohn Wang
54533e21fcc99dd91061ea245984c4e9a1544cb943fJohn Wang        // load config to determine if to distinguish Hspa data icon
54633e21fcc99dd91061ea245984c4e9a1544cb943fJohn Wang        try {
54733e21fcc99dd91061ea245984c4e9a1544cb943fJohn Wang            mHspaDataDistinguishable = mContext.getResources().getBoolean(
54833e21fcc99dd91061ea245984c4e9a1544cb943fJohn Wang                    com.android.internal.R.bool.config_hspa_data_distinguishable);
54933e21fcc99dd91061ea245984c4e9a1544cb943fJohn Wang        } catch (Exception e) {
55033e21fcc99dd91061ea245984c4e9a1544cb943fJohn Wang            mHspaDataDistinguishable = false;
55133e21fcc99dd91061ea245984c4e9a1544cb943fJohn Wang        }
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void installIcons(Context context, StatusBarService service) {
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sInstance = new StatusBarPolicy(context, service);
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55836e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer    private final CharSequence getSmallTime() {
55936e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer        boolean b24 = DateFormat.is24HourFormat(mContext);
56036e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer        int res;
56136e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer
56236e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer        if (b24) {
56336e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer            res = R.string.twenty_four_hour_time_format;
56436e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer        } else {
56536e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer            res = R.string.twelve_hour_time_format;
56636e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer        }
56736e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer
56863ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato        final char MAGIC1 = '\uEF00';
56963ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato        final char MAGIC2 = '\uEF01';
57036e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer
57163ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato        SimpleDateFormat sdf;
57263ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato        String format = mContext.getString(res);
57363ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato        if (!format.equals(mClockFormatString)) {
57463ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato            /*
57563ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato             * Search for an unquoted "a" in the format string, so we can
57663ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato             * add dummy characters around it to let us find it again after
57763ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato             * formatting and change its size.
57863ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato             */
57963ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato            int a = -1;
58063ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato            boolean quoted = false;
58163ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato            for (int i = 0; i < format.length(); i++) {
58263ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato                char c = format.charAt(i);
58363ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato
58463ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato                if (c == '\'') {
58563ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato                    quoted = !quoted;
58663ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato                }
58763ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato
58863ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato                if (!quoted && c == 'a') {
58963ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato                    a = i;
59063ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato                    break;
59163ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato                }
59236e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer            }
59336e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer
59463ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato            if (a >= 0) {
59563ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato                // Move a back so any whitespace before the AM/PM is also in the alternate size.
59663ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato                final int b = a;
59763ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato                while (a > 0 && Character.isWhitespace(format.charAt(a-1))) {
59863ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato                    a--;
59963ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato                }
60063ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato                format = format.substring(0, a) + MAGIC1 + format.substring(a, b)
60163ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato                        + "a" + MAGIC2 + format.substring(b + 1);
60236e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer            }
60336e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer
60463ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato            mClockFormat = sdf = new SimpleDateFormat(format);
60563ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato            mClockFormatString = format;
60663ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato        } else {
60763ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato            sdf = mClockFormat;
60836e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer        }
60963ce8e817c9b800b4f08b64c343e533783961b6eJoe Onorato        String result = sdf.format(mCalendar.getTime());
61036e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer
61136e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer        int magic1 = result.indexOf(MAGIC1);
61236e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer        int magic2 = result.indexOf(MAGIC2);
61336e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer
61436e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer        if (magic1 >= 0 && magic2 > magic1) {
61536e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer            SpannableStringBuilder formatted = new SpannableStringBuilder(result);
61636e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer
61736e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer            formatted.setSpan(new RelativeSizeSpan(0.7f), magic1, magic2,
61836e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer                              Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
61936e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer
62036e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer            formatted.delete(magic2, magic2 + 1);
62136e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer            formatted.delete(magic1, magic1 + 1);
62236e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer
62336e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer            return formatted;
62436e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer        } else {
62536e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer            return result;
62636e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer        }
62736e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer    }
62836e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void updateClock() {
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCalendar.setTimeInMillis(System.currentTimeMillis());
63136e136c2c86f39f03cdd4275f07deb30dc2c95aaEric Fischer        mClockData.text = getSmallTime();
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mService.updateIcon(mClockIcon, mClockData, null);
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void updateAlarm(Intent intent) {
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean alarmSet = intent.getBooleanExtra("alarmSet", false);
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mService.setIconVisibility(mAlarmClockIcon, alarmSet);
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void updateSyncState(Intent intent) {
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isActive = intent.getBooleanExtra("active", false);
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isFailing = intent.getBooleanExtra("failing", false);
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mService.setIconVisibility(mSyncActiveIcon, isActive);
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Don't display sync failing icon: BUG 1297963 Set sync error timeout to "never"
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //mService.setIconVisibility(mSyncFailingIcon, isFailing && !isActive);
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void updateBattery(Intent intent) {
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryData.iconId = intent.getIntExtra("icon-small", 0);
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryData.iconLevel = intent.getIntExtra("level", 0);
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mService.updateIcon(mBatteryIcon, mBatteryData, null);
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean plugged = intent.getIntExtra("plugged", 0) != 0;
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int level = intent.getIntExtra("level", -1);
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (false) {
6568a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.d(TAG, "updateBattery level=" + level
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " plugged=" + plugged
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mBatteryPlugged=" + mBatteryPlugged
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mBatteryLevel=" + mBatteryLevel
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mBatteryFirst=" + mBatteryFirst);
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean oldPlugged = mBatteryPlugged;
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryPlugged = plugged;
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLevel = level;
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mBatteryFirst) {
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBatteryFirst = false;
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * No longer showing the battery view because it draws attention away
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * from the USB storage notification. We could still show it when
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * connected to a brick, but that could lead to the user into thinking
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the device does not charge when plugged into USB (since he/she would
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * not see the same battery screen on USB as he sees on brick).
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* else {
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (plugged && !oldPlugged) {
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                showBatteryView();
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        */
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (false) {
6858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.d(TAG, "plugged=" + plugged + " oldPlugged=" + oldPlugged + " level=" + level);
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
687a82842f98d64897e92e1012404863f940bd03d26Mihai Preda    }
688a82842f98d64897e92e1012404863f940bd03d26Mihai Preda
689a82842f98d64897e92e1012404863f940bd03d26Mihai Preda    private void onBatteryLow(Intent intent) {
690a82842f98d64897e92e1012404863f940bd03d26Mihai Preda        if (SHOW_LOW_BATTERY_WARNING) {
691a82842f98d64897e92e1012404863f940bd03d26Mihai Preda            if (false) {
6928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                Slog.d(TAG, "mPhoneState=" + mPhoneState
693a82842f98d64897e92e1012404863f940bd03d26Mihai Preda                      + " mLowBatteryDialog=" + mLowBatteryDialog
694a82842f98d64897e92e1012404863f940bd03d26Mihai Preda                      + " mBatteryShowLowOnEndCall=" + mBatteryShowLowOnEndCall);
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
696a82842f98d64897e92e1012404863f940bd03d26Mihai Preda
6970e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandler            if (SHOW_BATTERY_WARNINGS_IN_CALL || mPhoneState == TelephonyManager.CALL_STATE_IDLE) {
698a82842f98d64897e92e1012404863f940bd03d26Mihai Preda                showLowBatteryWarning();
699a82842f98d64897e92e1012404863f940bd03d26Mihai Preda            } else {
700a82842f98d64897e92e1012404863f940bd03d26Mihai Preda                mBatteryShowLowOnEndCall = true;
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7058ec5b83fc8f8aa68805c4d5987f8f75bb28250caDianne Hackborn    private void onBatteryOkay(Intent intent) {
7068ec5b83fc8f8aa68805c4d5987f8f75bb28250caDianne Hackborn        if (mLowBatteryDialog != null
7078ec5b83fc8f8aa68805c4d5987f8f75bb28250caDianne Hackborn                && SHOW_LOW_BATTERY_WARNING) {
7088ec5b83fc8f8aa68805c4d5987f8f75bb28250caDianne Hackborn            mLowBatteryDialog.dismiss();
7098ec5b83fc8f8aa68805c4d5987f8f75bb28250caDianne Hackborn            mBatteryShowLowOnEndCall = false;
7108ec5b83fc8f8aa68805c4d5987f8f75bb28250caDianne Hackborn        }
7118ec5b83fc8f8aa68805c4d5987f8f75bb28250caDianne Hackborn    }
7128ec5b83fc8f8aa68805c4d5987f8f75bb28250caDianne Hackborn
713347c5a22a915df5aa180573573adf6b2213a35dcjohnwang    private void showBatteryView() {
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        closeLastBatteryView();
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mLowBatteryDialog != null) {
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLowBatteryDialog.dismiss();
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int level = mBatteryLevel;
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View v = View.inflate(mContext, com.android.internal.R.layout.battery_status, null);
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryView = v;
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pixelFormat = PixelFormat.TRANSLUCENT;
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Drawable bg = v.getBackground();
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (bg != null) {
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pixelFormat = bg.getOpacity();
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729568cae571a3d74d1992176a21722e07b44e9a3c4Dianne Hackborn        int flags =  WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
730568cae571a3d74d1992176a21722e07b44e9a3c4Dianne Hackborn                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
731568cae571a3d74d1992176a21722e07b44e9a3c4Dianne Hackborn                | WindowManager.LayoutParams.FLAG_DIM_BEHIND;
732084c665421502b13271e94bd0a342b0ddbbaa7caJaikumar Ganesh
733568cae571a3d74d1992176a21722e07b44e9a3c4Dianne Hackborn        if (!mContext.getResources().getBoolean(
734568cae571a3d74d1992176a21722e07b44e9a3c4Dianne Hackborn                com.android.internal.R.bool.config_sf_slowBlur)) {
735568cae571a3d74d1992176a21722e07b44e9a3c4Dianne Hackborn            flags |= WindowManager.LayoutParams.FLAG_BLUR_BEHIND;
736568cae571a3d74d1992176a21722e07b44e9a3c4Dianne Hackborn        }
737084c665421502b13271e94bd0a342b0ddbbaa7caJaikumar Ganesh
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ViewGroup.LayoutParams.WRAP_CONTENT,
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ViewGroup.LayoutParams.WRAP_CONTENT,
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                WindowManager.LayoutParams.TYPE_TOAST,
742568cae571a3d74d1992176a21722e07b44e9a3c4Dianne Hackborn                flags, pixelFormat);
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Get the dim amount from the theme
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray a = mContext.obtainStyledAttributes(
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.Theme);
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        lp.dimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f);
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
74904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        lp.setTitle("Battery");
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextView levelTextView = (TextView)v.findViewById(com.android.internal.R.id.level_percent);
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        levelTextView.setText(mContext.getString(
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.string.battery_status_text_percent_format, level));
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setBatteryLevel(v, com.android.internal.R.id.spacer, 100-level, 0, 0);
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setBatteryLevel(v, com.android.internal.R.id.level, level,
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.drawable.battery_charge_fill, level);
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowManagerImpl.getDefault().addView(v, lp);
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scheduleCloseBatteryView();
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void setBatteryLevel(View parent, int id, int height, int background, int level) {
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ImageView v = (ImageView)parent.findViewById(id);
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)v.getLayoutParams();
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        lp.weight = height;
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (background != 0) {
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            v.setBackgroundResource(background);
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Drawable bkg = v.getBackground();
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bkg.setLevel(level);
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void showLowBatteryWarning() {
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        closeLastBatteryView();
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779d81b1f41e5e7bf0ccd3e4c08838d65eacdc8dda0Mike Lockwood        // Show exact battery level.
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CharSequence levelText = mContext.getString(
781d81b1f41e5e7bf0ccd3e4c08838d65eacdc8dda0Mike Lockwood                    com.android.internal.R.string.battery_low_percent_format, mBatteryLevel);
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mBatteryLevelTextView != null) {
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBatteryLevelTextView.setText(levelText);
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View v = View.inflate(mContext, com.android.internal.R.layout.battery_low, null);
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBatteryLevelTextView=(TextView)v.findViewById(com.android.internal.R.id.level_percent);
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBatteryLevelTextView.setText(levelText);
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AlertDialog.Builder b = new AlertDialog.Builder(mContext);
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                b.setCancelable(true);
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                b.setTitle(com.android.internal.R.string.battery_low_title);
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                b.setView(v);
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                b.setIcon(android.R.drawable.ic_dialog_alert);
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                b.setPositiveButton(android.R.string.ok, null);
797347c5a22a915df5aa180573573adf6b2213a35dcjohnwang
7983d74bb4ab27ae9601f5c9c3706fad287845fb672Dianne Hackborn                final Intent intent = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY);
7993d74bb4ab27ae9601f5c9c3706fad287845fb672Dianne Hackborn                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
8003d74bb4ab27ae9601f5c9c3706fad287845fb672Dianne Hackborn                        | Intent.FLAG_ACTIVITY_MULTIPLE_TASK
8013d74bb4ab27ae9601f5c9c3706fad287845fb672Dianne Hackborn                        | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
8023d74bb4ab27ae9601f5c9c3706fad287845fb672Dianne Hackborn                        | Intent.FLAG_ACTIVITY_NO_HISTORY);
8033d74bb4ab27ae9601f5c9c3706fad287845fb672Dianne Hackborn                if (intent.resolveActivity(mContext.getPackageManager()) != null) {
8043d74bb4ab27ae9601f5c9c3706fad287845fb672Dianne Hackborn                    b.setNegativeButton(com.android.internal.R.string.battery_low_why,
8053d74bb4ab27ae9601f5c9c3706fad287845fb672Dianne Hackborn                            new DialogInterface.OnClickListener() {
8063d74bb4ab27ae9601f5c9c3706fad287845fb672Dianne Hackborn                        public void onClick(DialogInterface dialog, int which) {
8073d74bb4ab27ae9601f5c9c3706fad287845fb672Dianne Hackborn                            mContext.startActivity(intent);
8083d74bb4ab27ae9601f5c9c3706fad287845fb672Dianne Hackborn                            if (mLowBatteryDialog != null) {
8093d74bb4ab27ae9601f5c9c3706fad287845fb672Dianne Hackborn                                mLowBatteryDialog.dismiss();
8103d74bb4ab27ae9601f5c9c3706fad287845fb672Dianne Hackborn                            }
8113d74bb4ab27ae9601f5c9c3706fad287845fb672Dianne Hackborn                        }
8123d74bb4ab27ae9601f5c9c3706fad287845fb672Dianne Hackborn                    });
8133d74bb4ab27ae9601f5c9c3706fad287845fb672Dianne Hackborn                }
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AlertDialog d = b.create();
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.setOnDismissListener(mLowBatteryListener);
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.show();
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLowBatteryDialog = d;
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8210e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandler
8220e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandler        final ContentResolver cr = mContext.getContentResolver();
8230e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandler        if (Settings.System.getInt(cr,
82456c2d2ff27536a1d8edf0037cd41ff3ea3272fd9John Wang                Settings.System.POWER_SOUNDS_ENABLED, 1) == 1)
8250e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandler        {
8260e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandler            final String soundPath = Settings.System.getString(cr,
8270e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandler                Settings.System.LOW_BATTERY_SOUND);
8280e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandler            if (soundPath != null) {
8290e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandler                final Uri soundUri = Uri.parse("file://" + soundPath);
8300e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandler                if (soundUri != null) {
8310e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandler                    final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri);
832ec2c88d835dac156be0d14bd2b73cf3825e2e164Daniel Sandler                    if (sfx != null) {
833ec2c88d835dac156be0d14bd2b73cf3825e2e164Daniel Sandler                        sfx.setStreamType(AudioManager.STREAM_SYSTEM);
834ec2c88d835dac156be0d14bd2b73cf3825e2e164Daniel Sandler                        sfx.play();
835ec2c88d835dac156be0d14bd2b73cf3825e2e164Daniel Sandler                    }
8360e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandler                }
8370e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandler            }
8380e9d2af2d60b381ba52d0c25e583b3d2a9906051Daniel Sandler        }
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void updateCallState(int state) {
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneState = state;
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (false) {
8448a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.d(TAG, "mPhoneState=" + mPhoneState
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLowBatteryDialog=" + mLowBatteryDialog
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mBatteryShowLowOnEndCall=" + mBatteryShowLowOnEndCall);
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPhoneState == TelephonyManager.CALL_STATE_IDLE) {
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mBatteryShowLowOnEndCall) {
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mBatteryPlugged) {
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    showLowBatteryWarning();
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mBatteryShowLowOnEndCall = false;
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mLowBatteryDialog != null) {
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLowBatteryDialog.dismiss();
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mBatteryShowLowOnEndCall = true;
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private DialogInterface.OnDismissListener mLowBatteryListener
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new DialogInterface.OnDismissListener() {
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onDismiss(DialogInterface dialog) {
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLowBatteryDialog = null;
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBatteryLevelTextView = null;
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void scheduleCloseBatteryView() {
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message m = mHandler.obtainMessage(EVENT_BATTERY_CLOSE);
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m.arg1 = (++mBatteryViewSequence);
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHandler.sendMessageDelayed(m, 3000);
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void closeLastBatteryView() {
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mBatteryView != null) {
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //mBatteryView.debug();
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManagerImpl.getDefault().removeView(mBatteryView);
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBatteryView = null;
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
887e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        public void onSignalStrengthsChanged(SignalStrength signalStrength) {
888e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mSignalStrength = signalStrength;
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            updateSignalStrength();
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onServiceStateChanged(ServiceState state) {
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mServiceState = state;
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            updateSignalStrength();
89698e0b146b80670b52805b4b210ef5582dad6bb68Robert Greenwalt            updateCdmaRoamingIcon(state);
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            updateDataIcon();
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onCallStateChanged(int state, String incomingNumber) {
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            updateCallState(state);
903347c5a22a915df5aa180573573adf6b2213a35dcjohnwang            // In cdma, if a voice call is made, RSSI should switch to 1x.
904347c5a22a915df5aa180573573adf6b2213a35dcjohnwang            if (isCdma()) {
905347c5a22a915df5aa180573573adf6b2213a35dcjohnwang                updateSignalStrength();
906347c5a22a915df5aa180573573adf6b2213a35dcjohnwang            }
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
91098e0b146b80670b52805b4b210ef5582dad6bb68Robert Greenwalt        public void onDataConnectionStateChanged(int state, int networkType) {
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDataState = state;
91298e0b146b80670b52805b4b210ef5582dad6bb68Robert Greenwalt            updateDataNetType(networkType);
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            updateDataIcon();
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onDataActivity(int direction) {
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDataActivity = direction;
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            updateDataIcon();
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void updateSimState(Intent intent) {
92404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        String stateExtra = intent.getStringExtra(IccCard.INTENT_KEY_ICC_STATE);
92504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (IccCard.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)) {
92604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            mSimState = IccCard.State.ABSENT;
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
92804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        else if (IccCard.INTENT_VALUE_ICC_READY.equals(stateExtra)) {
92904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            mSimState = IccCard.State.READY;
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
93104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        else if (IccCard.INTENT_VALUE_ICC_LOCKED.equals(stateExtra)) {
93204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            final String lockedReason = intent.getStringExtra(IccCard.INTENT_KEY_LOCKED_REASON);
93304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            if (IccCard.INTENT_VALUE_LOCKED_ON_PIN.equals(lockedReason)) {
93404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                mSimState = IccCard.State.PIN_REQUIRED;
935347c5a22a915df5aa180573573adf6b2213a35dcjohnwang            }
93604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            else if (IccCard.INTENT_VALUE_LOCKED_ON_PUK.equals(lockedReason)) {
93704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                mSimState = IccCard.State.PUK_REQUIRED;
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else {
94004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                mSimState = IccCard.State.NETWORK_LOCKED;
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
94304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            mSimState = IccCard.State.UNKNOWN;
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        updateDataIcon();
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
948e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    private boolean isCdma() {
94998e0b146b80670b52805b4b210ef5582dad6bb68Robert Greenwalt        return (mSignalStrength != null) && !mSignalStrength.isGsm();
950e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
952347c5a22a915df5aa180573573adf6b2213a35dcjohnwang    private boolean isEvdo() {
953347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        return ( (mServiceState != null)
954347c5a22a915df5aa180573573adf6b2213a35dcjohnwang                 && ((mServiceState.getRadioTechnology()
955347c5a22a915df5aa180573573adf6b2213a35dcjohnwang                        == ServiceState.RADIO_TECHNOLOGY_EVDO_0)
956347c5a22a915df5aa180573573adf6b2213a35dcjohnwang                     || (mServiceState.getRadioTechnology()
957347c5a22a915df5aa180573573adf6b2213a35dcjohnwang                        == ServiceState.RADIO_TECHNOLOGY_EVDO_A)));
958347c5a22a915df5aa180573573adf6b2213a35dcjohnwang    }
959347c5a22a915df5aa180573573adf6b2213a35dcjohnwang
960e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    private boolean hasService() {
961e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        if (mServiceState != null) {
962e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            switch (mServiceState.getState()) {
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case ServiceState.STATE_OUT_OF_SERVICE:
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case ServiceState.STATE_POWER_OFF:
965e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                    return false;
966e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                default:
967e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                    return true;
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
970e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            return false;
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
972e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
974e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    private final void updateSignalStrength() {
975e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        int iconLevel = -1;
976e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        int[] iconList;
977e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
97856c2d2ff27536a1d8edf0037cd41ff3ea3272fd9John Wang        // Display signal strength while in "emergency calls only" mode
97956c2d2ff27536a1d8edf0037cd41ff3ea3272fd9John Wang        if (!hasService() && !mServiceState.isEmergencyOnly()) {
9808a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            //Slog.d(TAG, "updateSignalStrength: no service");
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (Settings.System.getInt(mContext.getContentResolver(),
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Settings.System.AIRPLANE_MODE_ON, 0) == 1) {
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPhoneData.iconId = com.android.internal.R.drawable.stat_sys_signal_flightmode;
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPhoneData.iconId = com.android.internal.R.drawable.stat_sys_signal_null;
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService.updateIcon(mPhoneIcon, mPhoneData, null);
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
991e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        if (!isCdma()) {
992e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            int asu = mSignalStrength.getGsmSignalStrength();
993e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
994e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
995e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            // asu = 0 (-113dB or less) is very weak
996e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            // signal, its better to show 0 bars to the user in such cases.
997e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            // asu = 99 is a special case, where the signal strength is unknown.
998ee63e47940d5a3bf6f1001153750e885ac3a7dcdjsh            if (asu <= 2 || asu == 99) iconLevel = 0;
999ee63e47940d5a3bf6f1001153750e885ac3a7dcdjsh            else if (asu >= 12) iconLevel = 4;
1000e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else if (asu >= 8)  iconLevel = 3;
1001ee63e47940d5a3bf6f1001153750e885ac3a7dcdjsh            else if (asu >= 5)  iconLevel = 2;
1002e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else iconLevel = 1;
1003e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
100498e0b146b80670b52805b4b210ef5582dad6bb68Robert Greenwalt            // Though mPhone is a Manager, this call is not an IPC
1005e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            if (mPhone.isNetworkRoaming()) {
1006e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                iconList = sSignalImages_r;
1007e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            } else {
1008e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                iconList = sSignalImages;
100904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            }
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1011347c5a22a915df5aa180573573adf6b2213a35dcjohnwang            iconList = this.sSignalImages;
1012347c5a22a915df5aa180573573adf6b2213a35dcjohnwang
1013347c5a22a915df5aa180573573adf6b2213a35dcjohnwang            // If 3G(EV) and 1x network are available than 3G should be
1014347c5a22a915df5aa180573573adf6b2213a35dcjohnwang            // displayed, displayed RSSI should be from the EV side.
1015347c5a22a915df5aa180573573adf6b2213a35dcjohnwang            // If a voice call is made then RSSI should switch to 1x.
1016347c5a22a915df5aa180573573adf6b2213a35dcjohnwang            if ((mPhoneState == TelephonyManager.CALL_STATE_IDLE) && isEvdo()){
1017347c5a22a915df5aa180573573adf6b2213a35dcjohnwang                iconLevel = getEvdoLevel();
1018347c5a22a915df5aa180573573adf6b2213a35dcjohnwang                if (false) {
10198a9b22056b13477f59df934928c00c58b5871c95Joe Onorato                    Slog.d(TAG, "use Evdo level=" + iconLevel + " to replace Cdma Level=" + getCdmaLevel());
1020347c5a22a915df5aa180573573adf6b2213a35dcjohnwang                }
1021347c5a22a915df5aa180573573adf6b2213a35dcjohnwang            } else {
1022347c5a22a915df5aa180573573adf6b2213a35dcjohnwang                iconLevel = getCdmaLevel();
1023347c5a22a915df5aa180573573adf6b2213a35dcjohnwang            }
1024e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
1025e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        mPhoneData.iconId = iconList[iconLevel];
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mService.updateIcon(mPhoneIcon, mPhoneData, null);
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029347c5a22a915df5aa180573573adf6b2213a35dcjohnwang    private int getCdmaLevel() {
1030347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        final int cdmaDbm = mSignalStrength.getCdmaDbm();
1031347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        final int cdmaEcio = mSignalStrength.getCdmaEcio();
1032347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        int levelDbm = 0;
1033347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        int levelEcio = 0;
1034347c5a22a915df5aa180573573adf6b2213a35dcjohnwang
1035347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        if (cdmaDbm >= -75) levelDbm = 4;
1036347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        else if (cdmaDbm >= -85) levelDbm = 3;
1037347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        else if (cdmaDbm >= -95) levelDbm = 2;
1038347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        else if (cdmaDbm >= -100) levelDbm = 1;
1039347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        else levelDbm = 0;
1040347c5a22a915df5aa180573573adf6b2213a35dcjohnwang
1041347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        // Ec/Io are in dB*10
1042347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        if (cdmaEcio >= -90) levelEcio = 4;
1043347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        else if (cdmaEcio >= -110) levelEcio = 3;
1044347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        else if (cdmaEcio >= -130) levelEcio = 2;
1045347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        else if (cdmaEcio >= -150) levelEcio = 1;
1046347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        else levelEcio = 0;
1047347c5a22a915df5aa180573573adf6b2213a35dcjohnwang
1048347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        return (levelDbm < levelEcio) ? levelDbm : levelEcio;
1049347c5a22a915df5aa180573573adf6b2213a35dcjohnwang    }
1050347c5a22a915df5aa180573573adf6b2213a35dcjohnwang
1051347c5a22a915df5aa180573573adf6b2213a35dcjohnwang    private int getEvdoLevel() {
1052347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        int evdoDbm = mSignalStrength.getEvdoDbm();
1053347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        int evdoSnr = mSignalStrength.getEvdoSnr();
1054347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        int levelEvdoDbm = 0;
1055347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        int levelEvdoSnr = 0;
1056347c5a22a915df5aa180573573adf6b2213a35dcjohnwang
1057347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        if (evdoDbm >= -65) levelEvdoDbm = 4;
1058347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        else if (evdoDbm >= -75) levelEvdoDbm = 3;
1059347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        else if (evdoDbm >= -90) levelEvdoDbm = 2;
1060347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        else if (evdoDbm >= -105) levelEvdoDbm = 1;
1061347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        else levelEvdoDbm = 0;
1062347c5a22a915df5aa180573573adf6b2213a35dcjohnwang
10631336a563684ff2226d4daf340ab5ef299e19870bJohn Michelau        if (evdoSnr >= 7) levelEvdoSnr = 4;
10641336a563684ff2226d4daf340ab5ef299e19870bJohn Michelau        else if (evdoSnr >= 5) levelEvdoSnr = 3;
10651336a563684ff2226d4daf340ab5ef299e19870bJohn Michelau        else if (evdoSnr >= 3) levelEvdoSnr = 2;
10661336a563684ff2226d4daf340ab5ef299e19870bJohn Michelau        else if (evdoSnr >= 1) levelEvdoSnr = 1;
1067347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        else levelEvdoSnr = 0;
1068347c5a22a915df5aa180573573adf6b2213a35dcjohnwang
1069347c5a22a915df5aa180573573adf6b2213a35dcjohnwang        return (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr;
1070347c5a22a915df5aa180573573adf6b2213a35dcjohnwang    }
1071347c5a22a915df5aa180573573adf6b2213a35dcjohnwang
107298e0b146b80670b52805b4b210ef5582dad6bb68Robert Greenwalt    private final void updateDataNetType(int net) {
107304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
107404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        switch (net) {
107504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        case TelephonyManager.NETWORK_TYPE_EDGE:
107604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            mDataIconList = sDataNetType_e;
107704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            break;
107804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        case TelephonyManager.NETWORK_TYPE_UMTS:
107904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            mDataIconList = sDataNetType_3g;
108004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            break;
1081ebe66345e7099ca6fc95e8aa4d31a5b5cbbd6224Li Zhe        case TelephonyManager.NETWORK_TYPE_HSDPA:
1082ebe66345e7099ca6fc95e8aa4d31a5b5cbbd6224Li Zhe        case TelephonyManager.NETWORK_TYPE_HSUPA:
1083ebe66345e7099ca6fc95e8aa4d31a5b5cbbd6224Li Zhe        case TelephonyManager.NETWORK_TYPE_HSPA:
108433e21fcc99dd91061ea245984c4e9a1544cb943fJohn Wang            if (mHspaDataDistinguishable) {
108533e21fcc99dd91061ea245984c4e9a1544cb943fJohn Wang                mDataIconList = sDataNetType_h;
108633e21fcc99dd91061ea245984c4e9a1544cb943fJohn Wang            } else {
108733e21fcc99dd91061ea245984c4e9a1544cb943fJohn Wang                mDataIconList = sDataNetType_3g;
108833e21fcc99dd91061ea245984c4e9a1544cb943fJohn Wang            }
1089ebe66345e7099ca6fc95e8aa4d31a5b5cbbd6224Li Zhe            break;
109004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        case TelephonyManager.NETWORK_TYPE_CDMA:
109104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            // display 1xRTT for IS95A/B
10929f87cb2f8d796f57054c1c0f0ce4b9bef9414642johnwang            mDataIconList = this.sDataNetType_1x;
109304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            break;
109404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        case TelephonyManager.NETWORK_TYPE_1xRTT:
10959f87cb2f8d796f57054c1c0f0ce4b9bef9414642johnwang            mDataIconList = this.sDataNetType_1x;
109604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            break;
109704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through
109804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        case TelephonyManager.NETWORK_TYPE_EVDO_A:
10999f87cb2f8d796f57054c1c0f0ce4b9bef9414642johnwang            mDataIconList = sDataNetType_3g;
110004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            break;
110104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        default:
110204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            mDataIconList = sDataNetType_g;
110304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        break;
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void updateDataIcon() {
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int iconId;
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean visible = true;
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1111e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        if (!isCdma()) {
1112e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            // GSM case, we have to check also the sim state
1113e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            if (mSimState == IccCard.State.READY || mSimState == IccCard.State.UNKNOWN) {
1114e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                if (hasService() && mDataState == TelephonyManager.DATA_CONNECTED) {
1115e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                    switch (mDataActivity) {
1116e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                        case TelephonyManager.DATA_ACTIVITY_IN:
1117e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                            iconId = mDataIconList[1];
1118e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                            break;
1119e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                        case TelephonyManager.DATA_ACTIVITY_OUT:
1120e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                            iconId = mDataIconList[2];
1121e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                            break;
1122e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                        case TelephonyManager.DATA_ACTIVITY_INOUT:
1123e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                            iconId = mDataIconList[3];
1124e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                            break;
1125e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                        default:
1126e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                            iconId = mDataIconList[0];
1127e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                            break;
1128e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                    }
1129e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                    mDataData.iconId = iconId;
1130e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                    mService.updateIcon(mDataIcon, mDataData, null);
1131e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                } else {
1132e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                    visible = false;
1133e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                }
1134e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            } else {
1135e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                mDataData.iconId = com.android.internal.R.drawable.stat_sys_no_sim;
1136e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                mService.updateIcon(mDataIcon, mDataData, null);
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1138e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        } else {
1139e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            // CDMA case, mDataActivity can be also DATA_ACTIVITY_DORMANT
1140e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            if (hasService() && mDataState == TelephonyManager.DATA_CONNECTED) {
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (mDataActivity) {
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case TelephonyManager.DATA_ACTIVITY_IN:
1143e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                        iconId = mDataIconList[1];
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case TelephonyManager.DATA_ACTIVITY_OUT:
1146e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                        iconId = mDataIconList[2];
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    case TelephonyManager.DATA_ACTIVITY_INOUT:
1149e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                        iconId = mDataIconList[3];
1150e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                        break;
1151e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                    case TelephonyManager.DATA_ACTIVITY_DORMANT:
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    default:
1153e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                        iconId = mDataIconList[0];
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mDataData.iconId = iconId;
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mService.updateIcon(mDataIcon, mDataData, null);
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                visible = false;
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1162e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
11634840e143df9804e3399a4e0341c0601f80d65d6eDianne Hackborn        long ident = Binder.clearCallingIdentity();
11644840e143df9804e3399a4e0341c0601f80d65d6eDianne Hackborn        try {
116504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            mBatteryStats.notePhoneDataConnectionState(mPhone.getNetworkType(), visible);
11664840e143df9804e3399a4e0341c0601f80d65d6eDianne Hackborn        } catch (RemoteException e) {
11674840e143df9804e3399a4e0341c0601f80d65d6eDianne Hackborn        } finally {
11684840e143df9804e3399a4e0341c0601f80d65d6eDianne Hackborn            Binder.restoreCallingIdentity(ident);
11694840e143df9804e3399a4e0341c0601f80d65d6eDianne Hackborn        }
1170e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDataIconVisible != visible) {
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService.setIconVisibility(mDataIcon, visible);
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDataIconVisible = visible;
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void updateVolume() {
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int ringerMode = audioManager.getRingerMode();
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean visible = ringerMode == AudioManager.RINGER_MODE_SILENT ||
1181e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                ringerMode == AudioManager.RINGER_MODE_VIBRATE;
1182c210b65cd2619ef462bd860c7197ddcb1c39c75cDaniel Sandler        final int iconId = (ringerMode == AudioManager.RINGER_MODE_VIBRATE)
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ? com.android.internal.R.drawable.stat_sys_ringer_vibrate
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                : com.android.internal.R.drawable.stat_sys_ringer_silent;
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (visible) {
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mVolumeData.iconId = iconId;
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService.updateIcon(mVolumeIcon, mVolumeData, null);
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (visible != mVolumeVisible) {
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService.setIconVisibility(mVolumeIcon, visible);
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mVolumeVisible = visible;
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void updateBluetooth(Intent intent) {
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int iconId = com.android.internal.R.drawable.stat_sys_data_bluetooth;
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String action = intent.getAction();
1199de893f550301a60274e87aa8168225e7a7a42184Nick Pelly        if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
1200b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly            int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
1201de893f550301a60274e87aa8168225e7a7a42184Nick Pelly            mBluetoothEnabled = state == BluetoothAdapter.STATE_ON;
1202005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly        } else if (action.equals(BluetoothHeadset.ACTION_STATE_CHANGED)) {
1203005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly            mBluetoothHeadsetState = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE,
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    BluetoothHeadset.STATE_ERROR);
1205005b228cdfb369d9b3b325884c0337ba5968bf8cNick Pelly        } else if (action.equals(BluetoothA2dp.ACTION_SINK_STATE_CHANGED)) {
1206084c665421502b13271e94bd0a342b0ddbbaa7caJaikumar Ganesh            BluetoothA2dp a2dp = new BluetoothA2dp(mContext);
1207084c665421502b13271e94bd0a342b0ddbbaa7caJaikumar Ganesh            if (a2dp.getConnectedSinks().size() != 0) {
1208084c665421502b13271e94bd0a342b0ddbbaa7caJaikumar Ganesh                mBluetoothA2dpConnected = true;
1209084c665421502b13271e94bd0a342b0ddbbaa7caJaikumar Ganesh            } else {
1210084c665421502b13271e94bd0a342b0ddbbaa7caJaikumar Ganesh                mBluetoothA2dpConnected = false;
1211084c665421502b13271e94bd0a342b0ddbbaa7caJaikumar Ganesh            }
12123f41673265dcaaef058703311c5481e8a51fd8beJiafa Liu        } else if (action.equals(BluetoothPbap.PBAP_STATE_CHANGED_ACTION)) {
12133f41673265dcaaef058703311c5481e8a51fd8beJiafa Liu            mBluetoothPbapState = intent.getIntExtra(BluetoothPbap.PBAP_STATE,
12143f41673265dcaaef058703311c5481e8a51fd8beJiafa Liu                    BluetoothPbap.STATE_DISCONNECTED);
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1218e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1219084c665421502b13271e94bd0a342b0ddbbaa7caJaikumar Ganesh        if (mBluetoothHeadsetState == BluetoothHeadset.STATE_CONNECTED || mBluetoothA2dpConnected ||
12203f41673265dcaaef058703311c5481e8a51fd8beJiafa Liu                mBluetoothPbapState == BluetoothPbap.STATE_CONNECTED) {
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            iconId = com.android.internal.R.drawable.stat_sys_data_bluetooth_connected;
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBluetoothData.iconId = iconId;
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mService.updateIcon(mBluetoothIcon, mBluetoothData, null);
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mService.setIconVisibility(mBluetoothIcon, mBluetoothEnabled);
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void updateWifi(Intent intent) {
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String action = intent.getAction();
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
1232e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean enabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED;
1235e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!enabled) {
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If disabled, hide the icon. (We show icon when connected.)
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mService.setIconVisibility(mWifiIcon, false);
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1240e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean enabled = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED,
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                           false);
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!enabled) {
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mService.setIconVisibility(mWifiIcon, false);
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            final NetworkInfo networkInfo = (NetworkInfo)
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
1251e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int iconId;
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (networkInfo != null && networkInfo.isConnected()) {
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mIsWifiConnected = true;
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mLastWifiSignalLevel == -1) {
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    iconId = sWifiSignalImages[0];
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    iconId = sWifiSignalImages[mLastWifiSignalLevel];
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
126004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Show the icon since wi-fi is connected
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mService.setIconVisibility(mWifiIcon, true);
126304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastWifiSignalLevel = -1;
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mIsWifiConnected = false;
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                iconId = sWifiSignalImages[0];
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Hide the icon since we're not connected
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mService.setIconVisibility(mWifiIcon, false);
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWifiData.iconId = iconId;
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService.updateIcon(mWifiIcon, mWifiData, null);
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int newRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int newSignalLevel = WifiManager.calculateSignalLevel(newRssi,
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                  sWifiSignalImages.length);
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newSignalLevel != mLastWifiSignalLevel) {
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastWifiSignalLevel = newSignalLevel;
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mIsWifiConnected) {
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mWifiData.iconId = sWifiSignalImages[newSignalLevel];
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mWifiData.iconId = sWifiTemporarilyNotConnectedImage;
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mService.updateIcon(mWifiIcon, mWifiData, null);
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void updateGps(Intent intent) {
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final String action = intent.getAction();
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean enabled = intent.getBooleanExtra(GpsLocationProvider.EXTRA_ENABLED, false);
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (action.equals(GpsLocationProvider.GPS_FIX_CHANGE_ACTION) && enabled) {
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // GPS is getting fixes
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService.updateIcon(mGpsIcon, mGpsFixIconData, null);
1298e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mService.setIconVisibility(mGpsIcon, true);
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (action.equals(GpsLocationProvider.GPS_ENABLED_CHANGE_ACTION) && !enabled) {
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // GPS is off
1301e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mService.setIconVisibility(mGpsIcon, false);
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // GPS is on, but not receiving fixes
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService.updateIcon(mGpsIcon, mGpsEnabledIconData, null);
1305e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mService.setIconVisibility(mGpsIcon, true);
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    private final void updateTTY(Intent intent) {
131004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        final String action = intent.getAction();
131104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        final boolean enabled = intent.getBooleanExtra(TtyIntent.TTY_ENABLED, false);
131204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
13138a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        if (false) Slog.v(TAG, "updateTTY: enabled: " + enabled);
131404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
131504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (enabled) {
131604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            // TTY is on
13178a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (false) Slog.v(TAG, "updateTTY: set TTY on");
131804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            mService.updateIcon(mTTYModeIcon, mTTYModeEnableIconData, null);
1319e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mService.setIconVisibility(mTTYModeIcon, true);
132004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        } else {
132104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            // TTY is off
13228a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (false) Slog.v(TAG, "updateTTY: set TTY off");
1323e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mService.setIconVisibility(mTTYModeIcon, false);
1324e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
1325e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
1326e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
132798e0b146b80670b52805b4b210ef5582dad6bb68Robert Greenwalt    private final void updateCdmaRoamingIcon(ServiceState state) {
1328e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        if (!hasService()) {
1329e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mService.setIconVisibility(mCdmaRoamingIndicatorIcon, false);
1330f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville            return;
1331e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
1332e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1333e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        if (!isCdma()) {
1334e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mService.setIconVisibility(mCdmaRoamingIndicatorIcon, false);
1335f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville            return;
1336e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
1337e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1338e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        int[] iconList = sRoamingIndicatorImages_cdma;
133998e0b146b80670b52805b4b210ef5582dad6bb68Robert Greenwalt        int iconIndex = state.getCdmaEriIconIndex();
134098e0b146b80670b52805b4b210ef5582dad6bb68Robert Greenwalt        int iconMode = state.getCdmaEriIconMode();
1341e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1342e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        if (iconIndex == -1) {
13438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.e(TAG, "getCdmaEriIconIndex returned null, skipping ERI icon update");
1344e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            return;
1345e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
1346e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1347e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        if (iconMode == -1) {
13488a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.e(TAG, "getCdmeEriIconMode returned null, skipping ERI icon update");
1349e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            return;
1350e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
1351e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1352e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        if (iconIndex == EriInfo.ROAMING_INDICATOR_OFF) {
13538a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            if (false) Slog.v(TAG, "Cdma ROAMING_INDICATOR_OFF, removing ERI icon");
1354e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mService.setIconVisibility(mCdmaRoamingIndicatorIcon, false);
1355e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            return;
1356e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
1357e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1358e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        switch (iconMode) {
1359e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            case EriInfo.ROAMING_ICON_MODE_NORMAL:
1360e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                mCdmaRoamingIndicatorIconData.iconId = iconList[iconIndex];
1361e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                mService.updateIcon(mCdmaRoamingIndicatorIcon, mCdmaRoamingIndicatorIconData, null);
1362e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                mService.setIconVisibility(mCdmaRoamingIndicatorIcon, true);
1363e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                break;
1364e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            case EriInfo.ROAMING_ICON_MODE_FLASH:
1365f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville                mCdmaRoamingIndicatorIconData.iconId =
1366f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville                        com.android.internal.R.drawable.stat_sys_roaming_cdma_flash;
1367e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                mService.updateIcon(mCdmaRoamingIndicatorIcon, mCdmaRoamingIndicatorIconData, null);
1368f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville                mService.setIconVisibility(mCdmaRoamingIndicatorIcon, true);
1369e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                break;
1370e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
137104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        }
1372e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        mService.updateIcon(mPhoneIcon, mPhoneData, null);
137304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville    }
137404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
1375e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private class StatusBarHandler extends Handler {
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void handleMessage(Message msg) {
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (msg.what) {
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case EVENT_BATTERY_CLOSE:
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (msg.arg1 == mBatteryViewSequence) {
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    closeLastBatteryView();
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1389