FileDocCategorySizeDatePackage
StatusBarPolicy.javaAPI DocAndroid 1.5 API37912Wed May 06 22:42:00 BST 2009com.android.server.status

StatusBarPolicy

public class StatusBarPolicy extends Object
This class contains all of the policy about which icons are installed in the status bar at boot time. In reality, it should go into the android.policy package, but putting it here is the first step from extracting it.

Fields Summary
private static final String
TAG
private static StatusBarPolicy
sInstance
private static final int
EVENT_DATA_CONN_STATE_CHANGED
private static final int
EVENT_DATA_ACTIVITY
private static final int
EVENT_BATTERY_CLOSE
private static final int
BATTERY_THRESHOLD_CLOSE_WARNING
private static final int
BATTERY_THRESHOLD_WARNING
private static final int
BATTERY_THRESHOLD_EMPTY
private final android.content.Context
mContext
private final StatusBarService
mService
private final android.os.Handler
mHandler
private final com.android.internal.app.IBatteryStats
mBatteryStats
private Calendar
mCalendar
private android.os.IBinder
mClockIcon
private IconData
mClockData
private android.os.IBinder
mBatteryIcon
private IconData
mBatteryData
private boolean
mBatteryFirst
private boolean
mBatteryPlugged
private int
mBatteryLevel
private int
mBatteryThreshold
private int[]
mBatteryThresholds
private android.app.AlertDialog
mLowBatteryDialog
private android.widget.TextView
mBatteryLevelTextView
private android.view.View
mBatteryView
private int
mBatteryViewSequence
private boolean
mBatteryShowLowOnEndCall
private static final boolean
SHOW_LOW_BATTERY_WARNING
private android.telephony.TelephonyManager
mPhone
private android.os.IBinder
mPhoneIcon
private IconData
mPhoneData
private static final int[]
sSignalImages
private static final int[]
sSignalImages_r
private int[]
mDataIconList
private static final int[]
sDataNetType_g
private static final int[]
sDataNetType_3g
private static final int[]
sDataNetType_e
SimCard.State
mSimState
int
mPhoneState
int
mDataState
int
mDataNetType
int
mDataActivity
android.telephony.ServiceState
mServiceState
int
mSignalAsu
private android.os.IBinder
mDataIcon
private IconData
mDataData
private boolean
mDataIconVisible
private android.os.IBinder
mVolumeIcon
private IconData
mVolumeData
private boolean
mVolumeVisible
private android.os.IBinder
mBluetoothIcon
private IconData
mBluetoothData
private int
mBluetoothHeadsetState
private int
mBluetoothA2dpState
private boolean
mBluetoothEnabled
private static final int[]
sWifiSignalImages
private static final int
sWifiTemporarilyNotConnectedImage
private int
mLastWifiSignalLevel
private boolean
mIsWifiConnected
private android.os.IBinder
mWifiIcon
private IconData
mWifiData
private android.os.IBinder
mGpsIcon
private IconData
mGpsEnabledIconData
private IconData
mGpsFixIconData
private android.os.IBinder
mAlarmClockIcon
private IconData
mAlarmClockIconData
private android.os.IBinder
mSyncActiveIcon
private android.os.IBinder
mSyncFailingIcon
private android.content.BroadcastReceiver
mIntentReceiver
private DialogInterface.OnDismissListener
mLowBatteryListener
private android.telephony.PhoneStateListener
mPhoneStateListener
Constructors Summary
private StatusBarPolicy(android.content.Context context, StatusBarService service)


         
        mContext = context;
        mService = service;
        mBatteryStats = BatteryStatsService.getService();

        // clock
        mCalendar = Calendar.getInstance(TimeZone.getDefault());
        mClockData = IconData.makeText("clock", "");
        mClockIcon = service.addIcon(mClockData, null);
        updateClock();

        // battery
        mBatteryData = IconData.makeIcon("battery",
                null, com.android.internal.R.drawable.stat_sys_battery_unknown, 0, 0);
        mBatteryIcon = service.addIcon(mBatteryData, null);

        // phone_signal
        mPhone = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
        mPhoneData = IconData.makeIcon("phone_signal", 
                null, com.android.internal.R.drawable.stat_sys_signal_null, 0, 0);
        mPhoneIcon = service.addIcon(mPhoneData, null);
        // register for phone state notifications.
        ((TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE))
                .listen(mPhoneStateListener,
                          PhoneStateListener.LISTEN_SERVICE_STATE
                        | PhoneStateListener.LISTEN_SIGNAL_STRENGTH
                        | PhoneStateListener.LISTEN_CALL_STATE
                        | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
                        | PhoneStateListener.LISTEN_DATA_ACTIVITY);

        // data_connection
        mDataData = IconData.makeIcon("data_connection",
                null, com.android.internal.R.drawable.stat_sys_data_connected_g, 0, 0);
        mDataIcon = service.addIcon(mDataData, null);
        service.setIconVisibility(mDataIcon, false);

        // wifi
        mWifiData = IconData.makeIcon("wifi", null, sWifiSignalImages[0], 0, 0);
        mWifiIcon = service.addIcon(mWifiData, null);
        service.setIconVisibility(mWifiIcon, false);
        // wifi will get updated by the sticky intents
        
        // bluetooth status
        mBluetoothData = IconData.makeIcon("bluetooth",
                null, com.android.internal.R.drawable.stat_sys_data_bluetooth, 0, 0);
        mBluetoothIcon = service.addIcon(mBluetoothData, null);
        BluetoothDevice bluetooth =
                (BluetoothDevice) mContext.getSystemService(Context.BLUETOOTH_SERVICE);
        if (bluetooth != null) {
            mBluetoothEnabled = bluetooth.isEnabled();
        } else {
            mBluetoothEnabled = false;
        }
        mBluetoothA2dpState = BluetoothA2dp.STATE_DISCONNECTED;
        mBluetoothHeadsetState = BluetoothHeadset.STATE_DISCONNECTED;
        mService.setIconVisibility(mBluetoothIcon, mBluetoothEnabled);

        // Gps status
        mGpsEnabledIconData = IconData.makeIcon("gps",
                null, com.android.internal.R.drawable.stat_sys_gps_acquiring_anim, 0, 0);
        mGpsFixIconData = IconData.makeIcon("gps",
                null, com.android.internal.R.drawable.stat_sys_gps_on, 0, 0);
        mGpsIcon = service.addIcon(mGpsEnabledIconData, null);
        service.setIconVisibility(mGpsIcon, false);           

        // Alarm clock
        mAlarmClockIconData = IconData.makeIcon(
                "alarm_clock",
                null, com.android.internal.R.drawable.stat_notify_alarm, 0, 0);
        mAlarmClockIcon = service.addIcon(mAlarmClockIconData, null);
        service.setIconVisibility(mAlarmClockIcon, false);

        // Sync state
        mSyncActiveIcon = service.addIcon(IconData.makeIcon("sync_active",
                null, R.drawable.stat_notify_sync_anim0, 0, 0), null);
        mSyncFailingIcon = service.addIcon(IconData.makeIcon("sync_failing",
                null, R.drawable.stat_notify_sync_error, 0, 0), null);
        service.setIconVisibility(mSyncActiveIcon, false);
        service.setIconVisibility(mSyncFailingIcon, false);

        // volume
        mVolumeData = IconData.makeIcon("volume",
                null, com.android.internal.R.drawable.stat_sys_ringer_silent, 0, 0);
        mVolumeIcon = service.addIcon(mVolumeData, null);
        service.setIconVisibility(mVolumeIcon, false);
        updateVolume();
        
        IntentFilter filter = new IntentFilter();

        // Register for Intent broadcasts for...
        filter.addAction(Intent.ACTION_TIME_TICK);
        filter.addAction(Intent.ACTION_TIME_CHANGED);
        filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
        filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
        filter.addAction(Intent.ACTION_ALARM_CHANGED);
        filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED);
        filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
        filter.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION);
        filter.addAction(BluetoothIntent.BLUETOOTH_STATE_CHANGED_ACTION);
        filter.addAction(BluetoothIntent.HEADSET_STATE_CHANGED_ACTION);
        filter.addAction(BluetoothA2dp.SINK_STATE_CHANGED_ACTION);
        filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
        filter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
        filter.addAction(GpsLocationProvider.GPS_ENABLED_CHANGE_ACTION);
        filter.addAction(GpsLocationProvider.GPS_FIX_CHANGE_ACTION);
        filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
        mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
    
Methods Summary
private voidcloseLastBatteryView()

        if (mBatteryView != null) {
            //mBatteryView.debug();
            WindowManagerImpl.getDefault().removeView(mBatteryView);
            mBatteryView = null;
        }
    
public static voidinstallIcons(android.content.Context context, StatusBarService service)

        sInstance = new StatusBarPolicy(context, service);
    
private voidpickNextBatteryLevel(int level)

        final int N = mBatteryThresholds.length;
        for (int i=0; i<N; i++) {
            if (level >= mBatteryThresholds[i]) {
                mBatteryThreshold = i;
                break;
            }
        }
        if (mBatteryThreshold >= N) {
            mBatteryThreshold = N-1;
        }
    
private voidscheduleCloseBatteryView()


       
        Message m = mHandler.obtainMessage(EVENT_BATTERY_CLOSE);
        m.arg1 = (++mBatteryViewSequence);
        mHandler.sendMessageDelayed(m, 3000);
    
private voidsetBatteryLevel(android.view.View parent, int id, int height, int background, int level)

        ImageView v = (ImageView)parent.findViewById(id);
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)v.getLayoutParams();
        lp.weight = height;
        if (background != 0) {
            v.setBackgroundResource(background);
            Drawable bkg = v.getBackground();
            bkg.setLevel(level);
        }
    
private voidshowBatteryView()

    
        closeLastBatteryView();
        if (mLowBatteryDialog != null) {
            mLowBatteryDialog.dismiss();
        }

        int level = mBatteryLevel;

        View v = View.inflate(mContext, com.android.internal.R.layout.battery_status, null);
        mBatteryView = v;
        int pixelFormat = PixelFormat.TRANSLUCENT;
        Drawable bg = v.getBackground();
        if (bg != null) {
            pixelFormat = bg.getOpacity();
        }

        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_TOAST,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                    | WindowManager.LayoutParams.FLAG_BLUR_BEHIND
                    | WindowManager.LayoutParams.FLAG_DIM_BEHIND,
                pixelFormat);

        // Get the dim amount from the theme
        TypedArray a = mContext.obtainStyledAttributes(
                com.android.internal.R.styleable.Theme);
        lp.dimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f);
        a.recycle();
        
        lp.setTitle("Battery");

        TextView levelTextView = (TextView)v.findViewById(com.android.internal.R.id.level_percent);
        levelTextView.setText(mContext.getString(
                    com.android.internal.R.string.battery_status_text_percent_format, level));

        setBatteryLevel(v, com.android.internal.R.id.spacer, 100-level, 0, 0);
        setBatteryLevel(v, com.android.internal.R.id.level, level,
                com.android.internal.R.drawable.battery_charge_fill, level);

        WindowManagerImpl.getDefault().addView(v, lp);

        scheduleCloseBatteryView();
    
private voidshowLowBatteryWarning()

        closeLastBatteryView();

        int level = mBatteryThresholds[mBatteryThreshold > 1 ? mBatteryThreshold - 1 : 0];
        CharSequence levelText = mContext.getString(
                    com.android.internal.R.string.battery_low_percent_format, level);

        if (mBatteryLevelTextView != null) {
            mBatteryLevelTextView.setText(levelText);
        } else {
            View v = View.inflate(mContext, com.android.internal.R.layout.battery_low, null);
            mBatteryLevelTextView=(TextView)v.findViewById(com.android.internal.R.id.level_percent);

            mBatteryLevelTextView.setText(levelText);

            AlertDialog.Builder b = new AlertDialog.Builder(mContext);
                b.setCancelable(true);
                b.setTitle(com.android.internal.R.string.battery_low_title);
                b.setView(v);
                b.setIcon(android.R.drawable.ic_dialog_alert);
                b.setPositiveButton(android.R.string.ok, null);

            AlertDialog d = b.create();
            d.setOnDismissListener(mLowBatteryListener);
            d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            d.show();
            mLowBatteryDialog = d;
        }
    
private final voidupdateAlarm(android.content.Intent intent)

        boolean alarmSet = intent.getBooleanExtra("alarmSet", false);
        mService.setIconVisibility(mAlarmClockIcon, alarmSet);
    
private final voidupdateBattery(android.content.Intent intent)

        mBatteryData.iconId = intent.getIntExtra("icon-small", 0);
        mBatteryData.iconLevel = intent.getIntExtra("level", 0);
        mService.updateIcon(mBatteryIcon, mBatteryData, null);

        boolean plugged = intent.getIntExtra("plugged", 0) != 0;
        int level = intent.getIntExtra("level", -1);
        if (false) {
            Log.d(TAG, "updateBattery level=" + level
                    + " plugged=" + plugged
                    + " mBatteryPlugged=" + mBatteryPlugged
                    + " mBatteryLevel=" + mBatteryLevel
                    + " mBatteryThreshold=" + mBatteryThreshold
                    + " mBatteryFirst=" + mBatteryFirst);
        }

        boolean oldPlugged = mBatteryPlugged;
        int oldThreshold = mBatteryThreshold;
        pickNextBatteryLevel(level);

        mBatteryPlugged = plugged;
        mBatteryLevel = level;

        if (mBatteryFirst) {
            mBatteryFirst = false;
        }
        /*
         * No longer showing the battery view because it draws attention away
         * from the USB storage notification. We could still show it when
         * connected to a brick, but that could lead to the user into thinking
         * the device does not charge when plugged into USB (since he/she would
         * not see the same battery screen on USB as he sees on brick).
         */
        /* else {
            if (plugged && !oldPlugged) {
                showBatteryView();
            }
        }
        */
        if (false) {
            Log.d(TAG, "plugged=" + plugged + " oldPlugged=" + oldPlugged + " level=" + level
                    + " mBatteryThreshold=" + mBatteryThreshold + " oldThreshold=" + oldThreshold);
        }
        if (!plugged
                && ((oldPlugged && level < mBatteryThresholds[BATTERY_THRESHOLD_WARNING])
                    || (mBatteryThreshold > oldThreshold
                        && mBatteryThreshold > BATTERY_THRESHOLD_WARNING))) {
            // Broadcast the low battery warning
            mContext.sendBroadcast(new Intent(Intent.ACTION_BATTERY_LOW));

            if (SHOW_LOW_BATTERY_WARNING) {
                if (false) {
                    Log.d(TAG, "mPhoneState=" + mPhoneState
                            + " mLowBatteryDialog=" + mLowBatteryDialog
                            + " mBatteryShowLowOnEndCall=" + mBatteryShowLowOnEndCall);
                }

                if (mPhoneState == TelephonyManager.CALL_STATE_IDLE) {
                    showLowBatteryWarning();
                } else {
                    mBatteryShowLowOnEndCall = true;
                }
            }
        } else if (mBatteryThreshold == BATTERY_THRESHOLD_CLOSE_WARNING) {
            if (SHOW_LOW_BATTERY_WARNING) {
                if (mLowBatteryDialog != null) {
                    mLowBatteryDialog.dismiss();
                    mBatteryShowLowOnEndCall = false;
                }
            }
        }
    
private final voidupdateBluetooth(android.content.Intent intent)

        int iconId = com.android.internal.R.drawable.stat_sys_data_bluetooth;

        String action = intent.getAction();
        if (action.equals(BluetoothIntent.BLUETOOTH_STATE_CHANGED_ACTION)) {
            int state = intent.getIntExtra(BluetoothIntent.BLUETOOTH_STATE,
                                           BluetoothError.ERROR);
            mBluetoothEnabled = state == BluetoothDevice.BLUETOOTH_STATE_ON;
        } else if (action.equals(BluetoothIntent.HEADSET_STATE_CHANGED_ACTION)) {
            mBluetoothHeadsetState = intent.getIntExtra(BluetoothIntent.HEADSET_STATE,
                    BluetoothHeadset.STATE_ERROR);
        } else if (action.equals(BluetoothA2dp.SINK_STATE_CHANGED_ACTION)) {
            mBluetoothA2dpState = intent.getIntExtra(BluetoothA2dp.SINK_STATE,
                    BluetoothA2dp.STATE_DISCONNECTED);
        } else {
            return;
        }
        
        if (mBluetoothHeadsetState == BluetoothHeadset.STATE_CONNECTED ||
                mBluetoothA2dpState == BluetoothA2dp.STATE_CONNECTED ||
                mBluetoothA2dpState == BluetoothA2dp.STATE_PLAYING) {
            iconId = com.android.internal.R.drawable.stat_sys_data_bluetooth_connected;
        }

        mBluetoothData.iconId = iconId;
        mService.updateIcon(mBluetoothIcon, mBluetoothData, null);
        mService.setIconVisibility(mBluetoothIcon, mBluetoothEnabled);
    
private final voidupdateCallState(int state)

        mPhoneState = state;
        if (false) {
            Log.d(TAG, "mPhoneState=" + mPhoneState
                    + " mLowBatteryDialog=" + mLowBatteryDialog
                    + " mBatteryShowLowOnEndCall=" + mBatteryShowLowOnEndCall);
        }
        if (mPhoneState == TelephonyManager.CALL_STATE_IDLE) {
            if (mBatteryShowLowOnEndCall) {
                if (!mBatteryPlugged) {
                    showLowBatteryWarning();
                }
                mBatteryShowLowOnEndCall = false;
            }
        } else {
            if (mLowBatteryDialog != null) {
                mLowBatteryDialog.dismiss();
                mBatteryShowLowOnEndCall = true;
            }
        }
    
private final voidupdateClock()

        mCalendar.setTimeInMillis(System.currentTimeMillis());
        mClockData.text = DateFormat.getTimeFormat(mContext)
                .format(mCalendar.getTime());
        mService.updateIcon(mClockIcon, mClockData, null);
    
private final voidupdateDataIcon()

        int iconId;
        boolean visible = true;

        if (mSimState == SimCard.State.READY || mSimState == SimCard.State.UNKNOWN) {
            int data = mDataState;
            
            int[] list = mDataIconList;

            ServiceState ss = mServiceState;

            boolean hasService = false;

            if (ss != null) {
                hasService = (ss.getState() == ServiceState.STATE_IN_SERVICE);
            }

            if (hasService && data == TelephonyManager.DATA_CONNECTED) {
                switch (mDataActivity) {
                    case TelephonyManager.DATA_ACTIVITY_IN:
                        iconId = list[1];
                        break;
                    case TelephonyManager.DATA_ACTIVITY_OUT:
                        iconId = list[2];
                        break;
                    case TelephonyManager.DATA_ACTIVITY_INOUT:
                        iconId = list[3];
                        break;
                    default:
                        iconId = list[0];
                        break;
                }
                mDataData.iconId = iconId;
                mService.updateIcon(mDataIcon, mDataData, null);
            } else {
                visible = false;
            }
        } else {
            mDataData.iconId = com.android.internal.R.drawable.stat_sys_no_sim;
            mService.updateIcon(mDataIcon, mDataData, null);
        }
        long ident = Binder.clearCallingIdentity();
        try {
            mBatteryStats.notePhoneDataConnectionState(mDataNetType, visible);
        } catch (RemoteException e) {
        } finally {
            Binder.restoreCallingIdentity(ident);
        }
        if (mDataIconVisible != visible) {
            mService.setIconVisibility(mDataIcon, visible);
            mDataIconVisible = visible;
        }
    
private final voidupdateDataNetType()

        mDataNetType = mPhone.getNetworkType();
        switch (mDataNetType) {
            case TelephonyManager.NETWORK_TYPE_EDGE:
                mDataIconList = sDataNetType_e;
                break;
            case TelephonyManager.NETWORK_TYPE_UMTS:
                mDataIconList = sDataNetType_3g;
                break;
            default:
                mDataIconList = sDataNetType_g;
                break;
        }
    
private final voidupdateGps(android.content.Intent intent)

        final String action = intent.getAction();
        final boolean enabled = intent.getBooleanExtra(GpsLocationProvider.EXTRA_ENABLED, false);

        if (action.equals(GpsLocationProvider.GPS_FIX_CHANGE_ACTION) && enabled) {
            // GPS is getting fixes
            mService.updateIcon(mGpsIcon, mGpsFixIconData, null);
            mService.setIconVisibility(mGpsIcon, true);           
        } else if (action.equals(GpsLocationProvider.GPS_ENABLED_CHANGE_ACTION) && !enabled) {
            // GPS is off
            mService.setIconVisibility(mGpsIcon, false);           
        } else {
            // GPS is on, but not receiving fixes
            mService.updateIcon(mGpsIcon, mGpsEnabledIconData, null);
            mService.setIconVisibility(mGpsIcon, true);           
        }
    
private final voidupdateSignalStrength()

        int asu = mSignalAsu;
        ServiceState ss = mServiceState;

        boolean hasService = true;
        
        if (ss != null) {
            int state = ss.getState();
            switch (state) {
                case ServiceState.STATE_OUT_OF_SERVICE:
                case ServiceState.STATE_POWER_OFF:
                    hasService = false;
                    break;
            }
        } else {
            hasService = false;
        }

        if (!hasService) {
            //Log.d(TAG, "updateSignalStrength: no service");
            if (Settings.System.getInt(mContext.getContentResolver(),
                    Settings.System.AIRPLANE_MODE_ON, 0) == 1) {
                mPhoneData.iconId = com.android.internal.R.drawable.stat_sys_signal_flightmode;
            } else {
                mPhoneData.iconId = com.android.internal.R.drawable.stat_sys_signal_null;
            }
            mService.updateIcon(mPhoneIcon, mPhoneData, null);
            return;
        }

        // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
        // asu = 0 (-113dB or less) is very weak
        // signal, its better to show 0 bars to the user in such cases.
        // asu = 99 is a special case, where the signal strength is unknown.
        if (asu <= 0 || asu == 99) asu = 0;
        else if (asu >= 16) asu = 4;
        else if (asu >= 8)  asu = 3;
        else if (asu >= 4)  asu = 2;
        else asu = 1;

        int[] iconList;
        if (mPhone.isNetworkRoaming()) {
            iconList = sSignalImages_r;
        } else {
            iconList = sSignalImages;
        }
        
        mPhoneData.iconId = iconList[asu];
        mService.updateIcon(mPhoneIcon, mPhoneData, null);
    
private final voidupdateSimState(android.content.Intent intent)

    

         
        String stateExtra = intent.getStringExtra(SimCard.INTENT_KEY_SIM_STATE);
        if (SimCard.INTENT_VALUE_SIM_ABSENT.equals(stateExtra)) {
            mSimState = SimCard.State.ABSENT;
        }
        else if (SimCard.INTENT_VALUE_SIM_READY.equals(stateExtra)) {
            mSimState = SimCard.State.READY;
        }
        else if (SimCard.INTENT_VALUE_SIM_LOCKED.equals(stateExtra)) {
            final String lockedReason = intent.getStringExtra(SimCard.INTENT_KEY_LOCKED_REASON);
            if (SimCard.INTENT_VALUE_LOCKED_ON_PIN.equals(lockedReason)) {
                mSimState = SimCard.State.PIN_REQUIRED;
            } 
            else if (SimCard.INTENT_VALUE_LOCKED_ON_PUK.equals(lockedReason)) {
                mSimState = SimCard.State.PUK_REQUIRED;
            }
            else {
                mSimState = SimCard.State.NETWORK_LOCKED;
            }
        } else {
            mSimState = SimCard.State.UNKNOWN;
        }
        updateDataIcon();
    
private final voidupdateSyncState(android.content.Intent intent)

        boolean isActive = intent.getBooleanExtra("active", false);
        boolean isFailing = intent.getBooleanExtra("failing", false);
        mService.setIconVisibility(mSyncActiveIcon, isActive);
        // Don't display sync failing icon: BUG 1297963 Set sync error timeout to "never"
        //mService.setIconVisibility(mSyncFailingIcon, isFailing && !isActive);
    
private final voidupdateVolume()

        AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
        final int ringerMode = audioManager.getRingerMode();
        final boolean visible = ringerMode == AudioManager.RINGER_MODE_SILENT ||
                ringerMode == AudioManager.RINGER_MODE_VIBRATE; 
        final int iconId = audioManager.shouldVibrate(AudioManager.VIBRATE_TYPE_RINGER)
                ? com.android.internal.R.drawable.stat_sys_ringer_vibrate
                : com.android.internal.R.drawable.stat_sys_ringer_silent;

        if (visible) {
            mVolumeData.iconId = iconId;
            mService.updateIcon(mVolumeIcon, mVolumeData, null);
        }
        if (visible != mVolumeVisible) {
            mService.setIconVisibility(mVolumeIcon, visible);
            mVolumeVisible = visible;
        }
    
private final voidupdateWifi(android.content.Intent intent)

        final String action = intent.getAction();
        if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
            
            final boolean enabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
                    WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED;
            
            if (!enabled) {
                // If disabled, hide the icon. (We show icon when connected.)
                mService.setIconVisibility(mWifiIcon, false);
            }
            
        } else if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
            final boolean enabled = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED,
                                                           false);
            if (!enabled) {
                mService.setIconVisibility(mWifiIcon, false);
            }
        } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {

            final NetworkInfo networkInfo = (NetworkInfo) 
                    intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            
            int iconId;
            if (networkInfo != null && networkInfo.isConnected()) {
                mIsWifiConnected = true;
                if (mLastWifiSignalLevel == -1) {
                    iconId = sWifiSignalImages[0];
                } else {
                    iconId = sWifiSignalImages[mLastWifiSignalLevel];
                }
                
                // Show the icon since wi-fi is connected
                mService.setIconVisibility(mWifiIcon, true);
                
            } else {
                mLastWifiSignalLevel = -1;
                mIsWifiConnected = false;
                iconId = sWifiSignalImages[0];

                // Hide the icon since we're not connected
                mService.setIconVisibility(mWifiIcon, false);
            }

            mWifiData.iconId = iconId;
            mService.updateIcon(mWifiIcon, mWifiData, null);
        } else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
            final int newRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
            int newSignalLevel = WifiManager.calculateSignalLevel(newRssi,
                                                                  sWifiSignalImages.length);
            if (newSignalLevel != mLastWifiSignalLevel) {
                mLastWifiSignalLevel = newSignalLevel;
                if (mIsWifiConnected) {
                    mWifiData.iconId = sWifiSignalImages[newSignalLevel];
                } else {
                    mWifiData.iconId = sWifiTemporarilyNotConnectedImage;
                }
                mService.updateIcon(mWifiIcon, mWifiData, null);
            }
        }