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
17fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratopackage com.android.systemui.statusbar.phone;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19798ac4c7d79534a8230623b737b5b1b6a415d105Joe Onoratoimport android.app.StatusBarManager;
20bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pellyimport android.bluetooth.BluetoothAdapter;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.media.AudioManager;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
27cd686b5b6d4166b510df8e32138479a9559bc117John Spurlockimport android.util.Log;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Savilleimport com.android.internal.telephony.IccCardConstants;
3004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport com.android.internal.telephony.TelephonyIntents;
3104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Savilleimport com.android.internal.telephony.cdma.TtyIntent;
32798ac4c7d79534a8230623b737b5b1b6a415d105Joe Onoratoimport com.android.systemui.R;
33798ac4c7d79534a8230623b737b5b1b6a415d105Joe Onorato
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class contains all of the policy about which icons are installed in the status
36798ac4c7d79534a8230623b737b5b1b6a415d105Joe Onorato * bar at boot time.  It goes through the normal API for icons, even though it probably
37798ac4c7d79534a8230623b737b5b1b6a415d105Joe Onorato * strictly doesn't need to.
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
39fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratopublic class PhoneStatusBarPolicy {
40fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    private static final String TAG = "PhoneStatusBarPolicy";
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // message codes for the handler
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int EVENT_BATTERY_CLOSE = 4;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
452c195f77a16e96fe2add0dd661b7376379e5513dDaniel Sandler    private static final int AM_PM_STYLE_NORMAL  = 0;
462c195f77a16e96fe2add0dd661b7376379e5513dDaniel Sandler    private static final int AM_PM_STYLE_SMALL   = 1;
472c195f77a16e96fe2add0dd661b7376379e5513dDaniel Sandler    private static final int AM_PM_STYLE_GONE    = 2;
482c195f77a16e96fe2add0dd661b7376379e5513dDaniel Sandler
492c195f77a16e96fe2add0dd661b7376379e5513dDaniel Sandler    private static final int AM_PM_STYLE = AM_PM_STYLE_GONE;
502c195f77a16e96fe2add0dd661b7376379e5513dDaniel Sandler
51d7085fcf6567452a9d6fc69b0c6b1bf556f4c1b9Robert Greenwalt    private static final int INET_CONDITION_THRESHOLD = 50;
52d7085fcf6567452a9d6fc69b0c6b1bf556f4c1b9Robert Greenwalt
53b1e8dab967330b34d499b83a8112cbb3015a1e53Daniel Sandler    private static final boolean SHOW_SYNC_ICON = false;
54b1e8dab967330b34d499b83a8112cbb3015a1e53Daniel Sandler
554840e143df9804e3399a4e0341c0601f80d65d6eDianne Hackborn    private final Context mContext;
56798ac4c7d79534a8230623b737b5b1b6a415d105Joe Onorato    private final StatusBarManager mService;
5710523b4d0c99cec86647130426d470a1e02a44f6Joe Onorato    private final Handler mHandler = new Handler();
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Assume it's all good unless we hear otherwise.  We don't always seem
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // to get broadcasts that it *is* there.
61a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville    IccCardConstants.State mSimState = IccCardConstants.State.READY;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ringer volume
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mVolumeVisible;
6504e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // bluetooth device status
67e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler    private boolean mBluetoothEnabled = false;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mLastWifiSignalLevel = -1;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mIsWifiConnected = false;
711e9aac2bd855f12708d3049eff4435fa4a2f4317Robert Greenwalt
721e9aac2bd855f12708d3049eff4435fa4a2f4317Robert Greenwalt    // state of inet connection - 0 not connected, 100 connected
731e9aac2bd855f12708d3049eff4435fa4a2f4317Robert Greenwalt    private int mInetCondition = 0;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // sync state
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // If sync is active the SyncActive icon is displayed. If sync is not active but
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // sync is failing the SyncFailing icon is displayed. Otherwise neither are displayed.
78e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onReceive(Context context, Intent intent) {
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String action = intent.getAction();
832b69735e014872ca2183b4a39a8381daa337e146Daniel Sandler            if (action.equals(Intent.ACTION_ALARM_CHANGED)) {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateAlarm(intent);
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (action.equals(Intent.ACTION_SYNC_STATE_CHANGED)) {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateSyncState(intent);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
89de893f550301a60274e87aa8168225e7a7a42184Nick Pelly            else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED) ||
90d9bb688c91b5be6b7f065f02b9095787c452016eJaikumar Ganesh                    action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateBluetooth(intent);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
93bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent            else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateVolume();
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateSimState(intent);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9904e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            else if (action.equals(TtyIntent.TTY_ENABLED_CHANGE_ACTION)) {
10004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville                updateTTY(intent);
10104e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
105fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    public PhoneStatusBarPolicy(Context context) {
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
107798ac4c7d79534a8230623b737b5b1b6a415d105Joe Onorato        mService = (StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE);
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
109e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler        // listen for broadcasts
110e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler        IntentFilter filter = new IntentFilter();
111e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler        filter.addAction(Intent.ACTION_ALARM_CHANGED);
112e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler        filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED);
113e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler        filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
114e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler        filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
115e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler        filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
116e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler        filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
117e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler        filter.addAction(TtyIntent.TTY_ENABLED_CHANGE_ACTION);
118e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler        mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
119e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler
12004e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        // TTY status
1216179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov        mService.setIcon("tty",  R.drawable.stat_sys_tty_mode, 0, null);
122798ac4c7d79534a8230623b737b5b1b6a415d105Joe Onorato        mService.setIconVisibility("tty", false);
12304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
124e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        // Cdma Roaming Indicator, ERI
1256179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov        mService.setIcon("cdma_eri", R.drawable.stat_sys_roaming_cdma_0, 0, null);
126798ac4c7d79534a8230623b737b5b1b6a415d105Joe Onorato        mService.setIconVisibility("cdma_eri", false);
127e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // bluetooth status
129f242b7b931898856bcbcb7ec36cacf43098ba544Nick Pelly        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
130e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler        int bluetoothIcon = R.drawable.stat_sys_data_bluetooth;
131bd022f423a33f0794bb53e5b0720da2d67e4631cNick Pelly        if (adapter != null) {
132e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler            mBluetoothEnabled = (adapter.getState() == BluetoothAdapter.STATE_ON);
133e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler            if (adapter.getConnectionState() == BluetoothAdapter.STATE_CONNECTED) {
134e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler                bluetoothIcon = R.drawable.stat_sys_data_bluetooth_connected;
135e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler            }
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
137e3b7a2d13e46fe5e2faa4ec13bfff9e1f02b4145Daniel Sandler        mService.setIcon("bluetooth", bluetoothIcon, 0, null);
1380cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        mService.setIconVisibility("bluetooth", mBluetoothEnabled);
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Alarm clock
141fdfbbf62e61020b6b6170862eaabd72b43bca4eaJustin Ho        mService.setIcon("alarm_clock", R.drawable.stat_sys_alarm, 0, null);
142798ac4c7d79534a8230623b737b5b1b6a415d105Joe Onorato        mService.setIconVisibility("alarm_clock", false);
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Sync state
1459f176580c29cebbde53946b5f3b6532a86394f83Justin Ho        mService.setIcon("sync_active", R.drawable.stat_sys_sync, 0, null);
146798ac4c7d79534a8230623b737b5b1b6a415d105Joe Onorato        mService.setIconVisibility("sync_active", false);
1473c87566c115e1fce3fdc09a6fe40488bcdc04cdeJohn Spurlock        // "sync_failing" is obsolete: b/1297963
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // volume
1506179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov        mService.setIcon("volume", R.drawable.stat_sys_ringer_silent, 0, null);
151798ac4c7d79534a8230623b737b5b1b6a415d105Joe Onorato        mService.setIconVisibility("volume", false);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        updateVolume();
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void updateAlarm(Intent intent) {
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean alarmSet = intent.getBooleanExtra("alarmSet", false);
1570cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        mService.setIconVisibility("alarm_clock", alarmSet);
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void updateSyncState(Intent intent) {
161b1e8dab967330b34d499b83a8112cbb3015a1e53Daniel Sandler        if (!SHOW_SYNC_ICON) return;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isActive = intent.getBooleanExtra("active", false);
1630cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        mService.setIconVisibility("sync_active", isActive);
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void updateSimState(Intent intent) {
167a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville        String stateExtra = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
168a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville        if (IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)) {
169a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville            mSimState = IccCardConstants.State.ABSENT;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
171a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville        else if (IccCardConstants.INTENT_VALUE_ICC_READY.equals(stateExtra)) {
172a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville            mSimState = IccCardConstants.State.READY;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
174a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville        else if (IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals(stateExtra)) {
175a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville            final String lockedReason =
176a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville                    intent.getStringExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON);
177a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville            if (IccCardConstants.INTENT_VALUE_LOCKED_ON_PIN.equals(lockedReason)) {
178a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville                mSimState = IccCardConstants.State.PIN_REQUIRED;
179347c5a22a915df5aa180573573adf6b2213a35dcjohnwang            }
180a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville            else if (IccCardConstants.INTENT_VALUE_LOCKED_ON_PUK.equals(lockedReason)) {
181a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville                mSimState = IccCardConstants.State.PUK_REQUIRED;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else {
184a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville                mSimState = IccCardConstants.State.NETWORK_LOCKED;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
187a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville            mSimState = IccCardConstants.State.UNKNOWN;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void updateVolume() {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int ringerMode = audioManager.getRingerMode();
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean visible = ringerMode == AudioManager.RINGER_MODE_SILENT ||
195e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                ringerMode == AudioManager.RINGER_MODE_VIBRATE;
1966179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov
1976179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov        final int iconId;
1986179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov        String contentDescription = null;
199bffc3d1bd33eb2d8e00a9f8b6261d815db503311Eric Laurent        if (ringerMode == AudioManager.RINGER_MODE_VIBRATE) {
2006179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov            iconId = R.drawable.stat_sys_ringer_vibrate;
2016179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov            contentDescription = mContext.getString(R.string.accessibility_ringer_vibrate);
2026179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov        } else {
2036179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov            iconId =  R.drawable.stat_sys_ringer_silent;
2046179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov            contentDescription = mContext.getString(R.string.accessibility_ringer_silent);
2056179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov        }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (visible) {
2086179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov            mService.setIcon("volume", iconId, 0, contentDescription);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (visible != mVolumeVisible) {
2110cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            mService.setIconVisibility("volume", visible);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mVolumeVisible = visible;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final void updateBluetooth(Intent intent) {
217798ac4c7d79534a8230623b737b5b1b6a415d105Joe Onorato        int iconId = R.drawable.stat_sys_data_bluetooth;
2186179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov        String contentDescription = null;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String action = intent.getAction();
220de893f550301a60274e87aa8168225e7a7a42184Nick Pelly        if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
221b24e11baac589fe16426f2d243b460ab84991c7bNick Pelly            int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
222de893f550301a60274e87aa8168225e7a7a42184Nick Pelly            mBluetoothEnabled = state == BluetoothAdapter.STATE_ON;
223d9bb688c91b5be6b7f065f02b9095787c452016eJaikumar Ganesh        } else if (action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {
2240b63a6abb6552b58c5661c3f17c249e2414845f5Jaikumar Ganesh            int state = intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE,
225d9bb688c91b5be6b7f065f02b9095787c452016eJaikumar Ganesh                BluetoothAdapter.STATE_DISCONNECTED);
226d9bb688c91b5be6b7f065f02b9095787c452016eJaikumar Ganesh            if (state == BluetoothAdapter.STATE_CONNECTED) {
227d9bb688c91b5be6b7f065f02b9095787c452016eJaikumar Ganesh                iconId = R.drawable.stat_sys_data_bluetooth_connected;
2286179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                contentDescription = mContext.getString(R.string.accessibility_bluetooth_connected);
2296179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov            } else {
2306179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                contentDescription = mContext.getString(
2316179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                        R.string.accessibility_bluetooth_disconnected);
232084c665421502b13271e94bd0a342b0ddbbaa7caJaikumar Ganesh            }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
236e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
2376179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov        mService.setIcon("bluetooth", iconId, 0, contentDescription);
2380cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        mService.setIconVisibility("bluetooth", mBluetoothEnabled);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
241e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    private final void updateTTY(Intent intent) {
24204e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        final String action = intent.getAction();
24304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        final boolean enabled = intent.getBooleanExtra(TtyIntent.TTY_ENABLED, false);
24404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
245cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock        if (false) Log.v(TAG, "updateTTY: enabled: " + enabled);
24604e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville
24704e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        if (enabled) {
24804e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            // TTY is on
249cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock            if (false) Log.v(TAG, "updateTTY: set TTY on");
2506179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov            mService.setIcon("tty", R.drawable.stat_sys_tty_mode, 0,
2516179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov                    mContext.getString(R.string.accessibility_tty_enabled));
2520cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            mService.setIconVisibility("tty", true);
25304e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville        } else {
25404e71b3db84fd5f7fc4eefb49a33154ea91ec9fcWink Saville            // TTY is off
255cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock            if (false) Log.v(TAG, "updateTTY: set TTY off");
2560cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            mService.setIconVisibility("tty", false);
257e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
258e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
260