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