17d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/* 27d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Copyright (C) 2006 The Android Open Source Project 37d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 47d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Licensed under the Apache License, Version 2.0 (the "License"); 57d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * you may not use this file except in compliance with the License. 67d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * You may obtain a copy of the License at 77d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 87d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * http://www.apache.org/licenses/LICENSE-2.0 97d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Unless required by applicable law or agreed to in writing, software 117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * distributed under the License is distributed on an "AS IS" BASIS, 127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * See the License for the specific language governing permissions and 147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * limitations under the License. 157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpackage com.android.phone; 187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.Activity; 207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.KeyguardManager; 217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.ProgressDialog; 227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.BroadcastReceiver; 237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.ContentResolver; 247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Context; 257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.ContextWrapper; 267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Intent; 277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.IntentFilter; 287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.media.AudioManager; 29e18902f177c5af2e2b392430782aa84d144864fdSantos Cordonimport android.net.ConnectivityManager; 307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.Uri; 317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.AsyncResult; 32605148ff5de588ac7bc1757f0617d12114be77d4Junda Liuimport android.os.Bundle; 337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Handler; 347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Message; 35c31f1f32963534763aaf82ae2544f3a94f13edcaJonathan Basseriimport android.os.PersistableBundle; 367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.PowerManager; 373fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebingerimport android.os.ServiceManager; 387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.SystemClock; 397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.SystemProperties; 403fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebingerimport android.os.SystemService; 417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.UpdateLock; 423fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebingerimport android.os.UserManager; 437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.PreferenceManager; 444c6992302ccea9850c82f48ac785d659e8479e8fSanket Padaweimport android.provider.Settings; 4512f7d80f47bdad9ed1c02b8b916f75e4f11fe873Junda Liuimport android.telephony.CarrierConfigManager; 467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.telephony.ServiceState; 47385019f0c0b8a9e1450e54dcb0a0028a1c059ec5Andrew Leeimport android.telephony.SubscriptionManager; 487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log; 49e18902f177c5af2e2b392430782aa84d144864fdSantos Cordonimport android.widget.Toast; 507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.Call; 527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.CallManager; 537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.IccCardConstants; 547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.MmiCode; 557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.Phone; 567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.PhoneConstants; 577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.PhoneFactory; 587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.TelephonyCapabilities; 597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.TelephonyIntents; 60352ff6587456f60948648726cf1573a2e595e238Santos Cordonimport com.android.phone.common.CallLogAsync; 61fb7f92eaad86b839bcd94d2814933a151f39a480Andrew Leeimport com.android.phone.settings.SettingsConstants; 623fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebingerimport com.android.server.sip.SipService; 6376aaf48c6710c938854ed82591c7be9e432d66ddSantos Cordonimport com.android.services.telephony.activation.SimActivationManager; 643fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebingerimport com.android.services.telephony.sip.SipUtil; 657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/** 677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Global state for the telephony subsystem when running in the primary 687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * phone process. 697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 70bf900546674f25be845130119aa332ef8b17a399Sailesh Nepalpublic class PhoneGlobals extends ContextWrapper { 7183383e4c2f748514124eaa0482091490c4c8a311Andrew Lee public static final String LOG_TAG = "PhoneApp"; 727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Phone app-wide debug level: 757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 0 - no debug logging 767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 1 - normal debug logging if ro.debuggable is set (which is true in 777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * "eng" and "userdebug" builds but not "user" builds) 787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 2 - ultra-verbose debug logging 797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Most individual classes in the phone app have a local DBG constant, 817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * typically set to 827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * (PhoneApp.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1) 837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * or else 847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * (PhoneApp.DBG_LEVEL >= 2) 857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * depending on the desired verbosity. 867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * ***** DO NOT SUBMIT WITH DBG_LEVEL > 0 ************* 887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 8988b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee public static final int DBG_LEVEL = 0; 907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final boolean DBG = 927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon (PhoneGlobals.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1); 937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final boolean VDBG = (PhoneGlobals.DBG_LEVEL >= 2); 947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Message codes; see mHandler below. 967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int EVENT_SIM_NETWORK_LOCKED = 3; 977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int EVENT_SIM_STATE_CHANGED = 8; 987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int EVENT_DATA_ROAMING_DISCONNECTED = 10; 997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int EVENT_DATA_ROAMING_OK = 11; 1007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int EVENT_UNSOL_CDMA_INFO_RECORD = 12; 1013fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger private static final int EVENT_RESTART_SIP = 13; 1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // The MMI codes are also used by the InCallScreen. 1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int MMI_INITIATE = 51; 1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int MMI_COMPLETE = 52; 1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final int MMI_CANCEL = 53; 1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Don't use message codes larger than 99 here; those are reserved for 1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the individual Activities of the Phone UI. 1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 110e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon public static final int AIRPLANE_ON = 1; 111e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon public static final int AIRPLANE_OFF = 0; 112e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon 1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Allowable values for the wake lock code. 1157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * SLEEP means the device can be put to sleep. 1167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * PARTIAL means wake the processor, but we display can be kept off. 1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * FULL means wake both the processor and the display. 1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public enum WakeState { 1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SLEEP, 1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PARTIAL, 1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon FULL 1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static PhoneGlobals sMe; 1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // A few important fields we expose to the rest of the package 1287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // directly (rather than thru set/get methods) for efficiency. 1297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CallController callController; 13063a8424848966c0e94a78c4200bb091366dca3b8Santos Cordon CallManager mCM; 1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CallNotifier notifier; 13263a8424848966c0e94a78c4200bb091366dca3b8Santos Cordon CallerInfoCache callerInfoCache; 1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon NotificationMgr notificationMgr; 1349431b838f89399db2278c0436bd2817322a45f74Andrew Lee public PhoneInterfaceManager phoneMgr; 13576aaf48c6710c938854ed82591c7be9e432d66ddSantos Cordon public SimActivationManager simActivationManager; 1366465afd1636d57fce4291b02beaa88facd4e02aeJonathan Basseri CarrierConfigLoader configLoader; 13763a8424848966c0e94a78c4200bb091366dca3b8Santos Cordon 13869a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon private CallGatewayManager callGatewayManager; 139de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta private Phone phoneInEcm; 14063a8424848966c0e94a78c4200bb091366dca3b8Santos Cordon 1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon static boolean sVoiceCapable = true; 1427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 143c593d00da07c4321f380c3df3aace752557cf130Santos Cordon // TODO: Remove, no longer used. 1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CdmaPhoneCallState cdmaPhoneCallState; 1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // The currently-active PUK entry activity and progress dialog. 1477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Normally, these are the Emergency Dialer and the subsequent 1487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // progress dialog. null if there is are no such objects in 1497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the foreground. 1507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private Activity mPUKEntryActivity; 1517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private ProgressDialog mPUKEntryProgressDialog; 1527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1534d2db1ce81eae41084bef328941a4a12069c48f0Yorke Lee private boolean mDataDisconnectedDueToRoaming = false; 1547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private WakeState mWakeState = WakeState.SLEEP; 1567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private PowerManager mPowerManager; 1587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private PowerManager.WakeLock mWakeLock; 1597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private PowerManager.WakeLock mPartialWakeLock; 1607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private KeyguardManager mKeyguardManager; 1617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private UpdateLock mUpdateLock; 1637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Broadcast receiver for various intent broadcasts (see onCreate()) 1657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private final BroadcastReceiver mReceiver = new PhoneAppBroadcastReceiver(); 1667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 1687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * The singleton OtaUtils instance used for OTASP calls. 1697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 1707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * The OtaUtils instance is created lazily the first time we need to 1717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * make an OTASP call, regardless of whether it's an interactive or 1727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * non-interactive OTASP call. 1737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 1747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public OtaUtils otaUtils; 1757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Following are the CDMA OTA information Objects used during OTA Call. 1777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // cdmaOtaProvisionData object store static OTA information that needs 1787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // to be maintained even during Slider open/close scenarios. 1797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // cdmaOtaConfigData object stores configuration info to control visiblity 1807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // of each OTA Screens. 1817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // cdmaOtaScreenState object store OTA Screen State information. 1827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public OtaUtils.CdmaOtaProvisionData cdmaOtaProvisionData; 1837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public OtaUtils.CdmaOtaConfigData cdmaOtaConfigData; 1847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public OtaUtils.CdmaOtaScreenState cdmaOtaScreenState; 1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public OtaUtils.CdmaOtaInCallScreenUiState cdmaOtaInCallScreenUiState; 1867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Handler mHandler = new Handler() { 1887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 1897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void handleMessage(Message msg) { 1907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PhoneConstants.State phoneState; 1917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (msg.what) { 1927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // TODO: This event should be handled by the lock screen, just 1937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // like the "SIM missing" and "Sim locked" cases (bug 1804111). 1947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case EVENT_SIM_NETWORK_LOCKED: 1959504c6b5c5c7072f72d8a9e6df59dbda8a6ccbe4Jonathan Basseri if (getCarrierConfig().getBoolean( 1969504c6b5c5c7072f72d8a9e6df59dbda8a6ccbe4Jonathan Basseri CarrierConfigManager.KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL)) { 1977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Some products don't have the concept of a "SIM network lock" 1987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.i(LOG_TAG, "Ignoring EVENT_SIM_NETWORK_LOCKED event; " 1997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + "not showing 'SIM network unlock' PIN entry screen"); 2007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 2017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Normal case: show the "SIM network unlock" PIN entry screen. 2027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // The user won't be able to do anything else until 2037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // they enter a valid SIM network PIN. 2047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.i(LOG_TAG, "show sim depersonal panel"); 20552a3707ccf6edfce678a9ed91a1b9d838649b027Tyler Gunn IccNetworkDepersonalizationPanel.showDialog(); 2067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 2087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case EVENT_DATA_ROAMING_DISCONNECTED: 2107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon notificationMgr.showDataDisconnectedRoaming(); 2117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 2127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case EVENT_DATA_ROAMING_OK: 2147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon notificationMgr.hideDataDisconnectedRoaming(); 2157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 2167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case MMI_COMPLETE: 2187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon onMMIComplete((AsyncResult) msg.obj); 2197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 2207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case MMI_CANCEL: 222dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott PhoneUtils.cancelMmiCode(mCM.getFgPhone()); 2237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 2247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case EVENT_SIM_STATE_CHANGED: 2267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Marks the event where the SIM goes into ready state. 2277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Right now, this is only used for the PUK-unlocking 2287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // process. 2297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (msg.obj.equals(IccCardConstants.INTENT_VALUE_ICC_READY)) { 2307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // when the right event is triggered and there 2317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // are UI objects in the foreground, we close 2327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // them to display the lock panel. 2337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mPUKEntryActivity != null) { 2347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPUKEntryActivity.finish(); 2357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPUKEntryActivity = null; 2367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mPUKEntryProgressDialog != null) { 2387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPUKEntryProgressDialog.dismiss(); 2397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPUKEntryProgressDialog = null; 2407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 2437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case EVENT_UNSOL_CDMA_INFO_RECORD: 2457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //TODO: handle message here; 2467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 2473fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger case EVENT_RESTART_SIP: 2483fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger // This should only run if the Phone process crashed and was restarted. We do 2493fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger // not want this running if the device is still in the FBE encrypted state. 2503fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger // This is the same procedure that is triggered in the SipBroadcastReceiver 2513fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger // upon BOOT_COMPLETED. 2523fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger UserManager userManager = UserManager.get(sMe); 2533fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger if (userManager != null && userManager.isUserUnlocked()) { 2543fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger SipUtil.startSipService(); 2553fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger } 2563fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger break; 2577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }; 2607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public PhoneGlobals(Context context) { 2627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super(context); 2637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon sMe = this; 2647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onCreate() { 2677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (VDBG) Log.v(LOG_TAG, "onCreate()..."); 2687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ContentResolver resolver = getContentResolver(); 2707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Cache the "voice capable" flag. 2727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // This flag currently comes from a resource (which is 2737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // overrideable on a per-product basis): 2747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon sVoiceCapable = 2757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon getResources().getBoolean(com.android.internal.R.bool.config_voice_capable); 2767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // ...but this might eventually become a PackageManager "system 2777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // feature" instead, in which case we'd do something like: 2787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // sVoiceCapable = 2797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY_VOICE_CALLS); 2807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 281dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott if (mCM == null) { 2827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Initialize the telephony framework 2837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PhoneFactory.makeDefaultPhones(this); 2847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Start TelephonyDebugService After the default phone is created. 2867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent intent = new Intent(this, TelephonyDebugService.class); 2877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon startService(intent); 2887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mCM = CallManager.getInstance(); 290dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott for (Phone phone : PhoneFactory.getPhones()) { 291dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott mCM.registerPhone(phone); 292dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott } 2937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Create the NotificationMgr singleton, which is used to display 2957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // status bar icons and control other status bar behavior. 2967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon notificationMgr = NotificationMgr.init(this); 2977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2983fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger // If PhoneGlobals has crashed and is being restarted, then restart. 2993fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger mHandler.sendEmptyMessage(EVENT_RESTART_SIP); 3003fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger 30103ebdfc89fa5a4ee355ecc5527a1790d8a0bff21Anthony Lee // Create an instance of CdmaPhoneCallState and initialize it to IDLE 30203ebdfc89fa5a4ee355ecc5527a1790d8a0bff21Anthony Lee cdmaPhoneCallState = new CdmaPhoneCallState(); 30303ebdfc89fa5a4ee355ecc5527a1790d8a0bff21Anthony Lee cdmaPhoneCallState.CdmaPhoneCallStateInit(); 3047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // before registering for phone state changes 3067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 3077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mWakeLock = mPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, LOG_TAG); 3087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // lock used to keep the processor awake, when we don't care for the display. 3097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPartialWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK 3107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon | PowerManager.ON_AFTER_RELEASE, LOG_TAG); 3117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 3137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Get UpdateLock to suppress system-update related events (e.g. dialog show-up) 3157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // during phone calls. 3167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mUpdateLock = new UpdateLock("phone"); 3177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) Log.d(LOG_TAG, "onCreate: mUpdateLock: " + mUpdateLock); 3197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CallLogger callLogger = new CallLogger(this, new CallLogAsync()); 3217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 32221a7534fa69c1cc10809ae33fa0bfa84c5ac1309Jay Shrauner callGatewayManager = CallGatewayManager.getInstance(); 32369a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon 3247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Create the CallController singleton, which is the interface 3257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // to the telephony layer for user-initiated telephony functionality 3267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // (like making outgoing calls.) 32769a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon callController = CallController.init(this, callLogger, callGatewayManager); 32869a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon 3297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Create the CallerInfoCache singleton, which remembers custom ring tone and 3307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // send-to-voicemail settings. 3317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 3327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // The asynchronous caching will start just after this call. 3337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon callerInfoCache = CallerInfoCache.init(this); 3347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 335dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott phoneMgr = PhoneInterfaceManager.init(this, PhoneFactory.getDefaultPhone()); 336406c0341600bd414fe7561b4edd8cdf7ed11f315Santos Cordon 3376465afd1636d57fce4291b02beaa88facd4e02aeJonathan Basseri configLoader = CarrierConfigLoader.init(this); 3386465afd1636d57fce4291b02beaa88facd4e02aeJonathan Basseri 3397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Create the CallNotifer singleton, which handles 3407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // asynchronous events from the telephony layer (like 3417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // launching the incoming-call UI when an incoming call comes 3427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // in.) 343a9c6b6d73ebf2e176452a523c8d539f572a72a01Brad Ebinger notifier = CallNotifier.init(this); 3447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 345dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott PhoneUtils.registerIccStatus(mHandler, EVENT_SIM_NETWORK_LOCKED); 3467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // register for MMI/USSD 3487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mCM.registerForMmiComplete(mHandler, MMI_COMPLETE, null); 3497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // register connection tracking to PhoneUtils 3517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PhoneUtils.initializeConnectionHandler(mCM); 3527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Register for misc other intent broadcasts. 3547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon IntentFilter intentFilter = 3557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED); 3567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intentFilter.addAction(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED); 3577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intentFilter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); 3587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intentFilter.addAction(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED); 3597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intentFilter.addAction(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED); 3607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intentFilter.addAction(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED); 3617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon registerReceiver(mReceiver, intentFilter); 3627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //set the default values for the preferences in the phone. 3647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PreferenceManager.setDefaultValues(this, R.xml.network_setting, false); 3657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PreferenceManager.setDefaultValues(this, R.xml.call_feature_setting, false); 3677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Make sure the audio mode (along with some 3697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // audio-mode-related state of our own) is initialized 3707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // correctly, given the current state of the phone. 3717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PhoneUtils.setAudioMode(mCM); 3727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 37452bc81b8599f38cffb42ddf24adf9957b8ad46a9Santos Cordon cdmaOtaProvisionData = new OtaUtils.CdmaOtaProvisionData(); 37552bc81b8599f38cffb42ddf24adf9957b8ad46a9Santos Cordon cdmaOtaConfigData = new OtaUtils.CdmaOtaConfigData(); 37652bc81b8599f38cffb42ddf24adf9957b8ad46a9Santos Cordon cdmaOtaScreenState = new OtaUtils.CdmaOtaScreenState(); 37752bc81b8599f38cffb42ddf24adf9957b8ad46a9Santos Cordon cdmaOtaInCallScreenUiState = new OtaUtils.CdmaOtaInCallScreenUiState(); 3787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 37976aaf48c6710c938854ed82591c7be9e432d66ddSantos Cordon simActivationManager = new SimActivationManager(); 38076aaf48c6710c938854ed82591c7be9e432d66ddSantos Cordon 3817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // XXX pre-load the SimProvider so that it's ready 3827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon resolver.getType(Uri.parse("content://icc/adn")); 3837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // TODO: Register for Cdma Information Records 3857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // phone.registerCdmaInformationRecord(mHandler, EVENT_UNSOL_CDMA_INFO_RECORD, null); 3867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Read HAC settings and configure audio hardware 3887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (getResources().getBoolean(R.bool.hac_enabled)) { 389dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott int hac = android.provider.Settings.System.getInt( 390dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott getContentResolver(), 391dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott android.provider.Settings.System.HEARING_AID, 392dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott 0); 3937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 394fb7f92eaad86b839bcd94d2814933a151f39a480Andrew Lee audioManager.setParameter(SettingsConstants.HAC_KEY, 395fb7f92eaad86b839bcd94d2814933a151f39a480Andrew Lee hac == SettingsConstants.HAC_ENABLED 396fb7f92eaad86b839bcd94d2814933a151f39a480Andrew Lee ? SettingsConstants.HAC_VAL_ON : SettingsConstants.HAC_VAL_OFF); 3977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 398ff506f5b8a0c89f252aee4b8afd010f2a6f2c572Santos Cordon } 3997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 4017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Returns the singleton instance of the PhoneApp. 4027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 4031eaf22b056d2cef48be27d6d18fc047434874e2eSailesh Nepal public static PhoneGlobals getInstance() { 4047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (sMe == null) { 4057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon throw new IllegalStateException("No PhoneGlobals here!"); 4067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return sMe; 4087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 4117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Returns the singleton instance of the PhoneApp if running as the 4127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * primary user, otherwise null. 4137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 4147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon static PhoneGlobals getInstanceIfPrimary() { 4157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return sMe; 4167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 419dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott * Returns the default phone. 420dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott * 421385019f0c0b8a9e1450e54dcb0a0028a1c059ec5Andrew Lee * WARNING: This method should be used carefully, now that there may be multiple phones. 4227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 42383383e4c2f748514124eaa0482091490c4c8a311Andrew Lee public static Phone getPhone() { 424dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott return PhoneFactory.getDefaultPhone(); 4257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4272fcb6c372c76a48b7af8f9b0dc7fd518698bbf77Andrew Lee public static Phone getPhone(int subId) { 4282fcb6c372c76a48b7af8f9b0dc7fd518698bbf77Andrew Lee return PhoneFactory.getPhone(SubscriptionManager.getPhoneId(subId)); 429385019f0c0b8a9e1450e54dcb0a0028a1c059ec5Andrew Lee } 430385019f0c0b8a9e1450e54dcb0a0028a1c059ec5Andrew Lee 431de10b75b2802b0a74de17a972d007efc0fc19f55Santos Cordon /* package */ CallManager getCallManager() { 432de10b75b2802b0a74de17a972d007efc0fc19f55Santos Cordon return mCM; 433de10b75b2802b0a74de17a972d007efc0fc19f55Santos Cordon } 434de10b75b2802b0a74de17a972d007efc0fc19f55Santos Cordon 4354e9fa91acd2a1f562b7663b9ad110090075eaf3eChris Manton public PersistableBundle getCarrierConfig() { 436d3480e0faf95b9e01459f91a0669b0772e2cdcc3Shishir Agrawal return getCarrierConfigForSubId(SubscriptionManager.getDefaultSubscriptionId()); 43789b0ab40aa1e9f4656c38d3b9d41a3447df3b908Jonathan Basseri } 43889b0ab40aa1e9f4656c38d3b9d41a3447df3b908Jonathan Basseri 4394e9fa91acd2a1f562b7663b9ad110090075eaf3eChris Manton public PersistableBundle getCarrierConfigForSubId(int subId) { 44089b0ab40aa1e9f4656c38d3b9d41a3447df3b908Jonathan Basseri return configLoader.getConfigForSubId(subId); 441605148ff5de588ac7bc1757f0617d12114be77d4Junda Liu } 442605148ff5de588ac7bc1757f0617d12114be77d4Junda Liu 4437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 4447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Handles OTASP-related events from the telephony layer. 4457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 4467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * While an OTASP call is active, the CallNotifier forwards 4477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * OTASP-related telephony events to this method. 4487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 4497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon void handleOtaspEvent(Message msg) { 4507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) Log.d(LOG_TAG, "handleOtaspEvent(message " + msg + ")..."); 4517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (otaUtils == null) { 4537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // We shouldn't be getting OTASP events without ever 4547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // having started the OTASP call in the first place! 4557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "handleOtaEvents: got an event but otaUtils is null! " 4567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + "message = " + msg); 4577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 4587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaUtils.onOtaProvisionStatusChanged((AsyncResult) msg.obj); 4617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 4647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Similarly, handle the disconnect event of an OTASP call 4657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * by forwarding it to the OtaUtils instance. 4667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 4677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /* package */ void handleOtaspDisconnect() { 4687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) Log.d(LOG_TAG, "handleOtaspDisconnect()..."); 4697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (otaUtils == null) { 4717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // We shouldn't be getting OTASP events without ever 4727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // having started the OTASP call in the first place! 4737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.w(LOG_TAG, "handleOtaspDisconnect: otaUtils is null!"); 4747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 4757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaUtils.onOtaspDisconnect(); 4787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 4817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Sets the activity responsible for un-PUK-blocking the device 4827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * so that we may close it when we receive a positive result. 4837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * mPUKEntryActivity is also used to indicate to the device that 4847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * we are trying to un-PUK-lock the phone. In other words, iff 4857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * it is NOT null, then we are trying to unlock and waiting for 4867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * the SIM to move to READY state. 4877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 4887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @param activity is the activity to close when PUK has 4897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * finished unlocking. Can be set to null to indicate the unlock 4907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * or SIM READYing process is over. 4917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 4927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon void setPukEntryActivity(Activity activity) { 4937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPUKEntryActivity = activity; 4947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Activity getPUKEntryActivity() { 4977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return mPUKEntryActivity; 4987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 5017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Sets the dialog responsible for notifying the user of un-PUK- 5027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * blocking - SIM READYing progress, so that we may dismiss it 5037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * when we receive a positive result. 5047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 5057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @param dialog indicates the progress dialog informing the user 5067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * of the state of the device. Dismissed upon completion of 5077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * READYing process 5087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 5097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon void setPukEntryProgressDialog(ProgressDialog dialog) { 5107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPUKEntryProgressDialog = dialog; 5117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 5147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Controls whether or not the screen is allowed to sleep. 5157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 5167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Once sleep is allowed (WakeState is SLEEP), it will rely on the 5177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * settings for the poke lock to determine when to timeout and let 5187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * the device sleep {@link PhoneGlobals#setScreenTimeout}. 5197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 5207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @param ws tells the device to how to wake. 5217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 5227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /* package */ void requestWakeState(WakeState ws) { 5237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (VDBG) Log.d(LOG_TAG, "requestWakeState(" + ws + ")..."); 5247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon synchronized (this) { 5257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mWakeState != ws) { 5267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (ws) { 5277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case PARTIAL: 5287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // acquire the processor wake lock, and release the FULL 5297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // lock if it is being held. 5307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPartialWakeLock.acquire(); 5317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mWakeLock.isHeld()) { 5327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mWakeLock.release(); 5337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 5357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case FULL: 5367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // acquire the full wake lock, and release the PARTIAL 5377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // lock if it is being held. 5387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mWakeLock.acquire(); 5397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mPartialWakeLock.isHeld()) { 5407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPartialWakeLock.release(); 5417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 5437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case SLEEP: 5447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon default: 5457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // release both the PARTIAL and FULL locks. 5467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mWakeLock.isHeld()) { 5477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mWakeLock.release(); 5487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mPartialWakeLock.isHeld()) { 5507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPartialWakeLock.release(); 5517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 5537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mWakeState = ws; 5557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 5607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * If we are not currently keeping the screen on, then poke the power 5617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * manager to wake up the screen for the user activity timeout duration. 5627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 5637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /* package */ void wakeUpScreen() { 5647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon synchronized (this) { 5657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mWakeState == WakeState.SLEEP) { 5667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) Log.d(LOG_TAG, "pulse screen lock"); 567148769bf520413334cc9cb2c4253f353607f8dcaDianne Hackborn mPowerManager.wakeUp(SystemClock.uptimeMillis(), "android.phone:WAKE"); 5687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 5737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Sets the wake state and screen timeout based on the current state 5747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * of the phone, and the current state of the in-call UI. 5757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 5767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * This method is a "UI Policy" wrapper around 5777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * {@link PhoneGlobals#requestWakeState} and {@link PhoneGlobals#setScreenTimeout}. 5787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 5797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * It's safe to call this method regardless of the state of the Phone 5807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * (e.g. whether or not it's idle), and regardless of the state of the 5817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Phone UI (e.g. whether or not the InCallScreen is active.) 5827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 5837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /* package */ void updateWakeState() { 5847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PhoneConstants.State state = mCM.getState(); 5857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // True if the speakerphone is in use. (If so, we *always* use 5877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the default timeout. Since the user is obviously not holding 5887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the phone up to his/her face, we don't need to worry about 5897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // false touches, and thus don't need to turn the screen off so 5907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // aggressively.) 5917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Note that we need to make a fresh call to this method any 5927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // time the speaker state changes. (That happens in 5937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // PhoneUtils.turnOnSpeaker().) 5947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon boolean isSpeakerInUse = (state == PhoneConstants.State.OFFHOOK) && PhoneUtils.isSpeakerOn(this); 5957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // TODO (bug 1440854): The screen timeout *might* also need to 5977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // depend on the bluetooth state, but this isn't as clear-cut as 5987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the speaker state (since while using BT it's common for the 5997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // user to put the phone straight into a pocket, in which case the 6007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // timeout should probably still be short.) 6017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Decide whether to force the screen on or not. 6037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 6047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Force the screen to be on if the phone is ringing or dialing, 6057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // or if we're displaying the "Call ended" UI for a connection in 6067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the "disconnected" state. 6077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // However, if the phone is disconnected while the user is in the 6087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // middle of selecting a quick response message, we should not force 6097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the screen to be on. 6107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 6117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon boolean isRinging = (state == PhoneConstants.State.RINGING); 612dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott boolean isDialing = (mCM.getFgPhone().getForegroundCall().getState() == Call.State.DIALING); 6136fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner boolean keepScreenOn = isRinging || isDialing; 6147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // keepScreenOn == true means we'll hold a full wake lock: 6157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon requestWakeState(keepScreenOn ? WakeState.FULL : WakeState.SLEEP); 6167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 6177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon KeyguardManager getKeyguardManager() { 6197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return mKeyguardManager; 6207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 6217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void onMMIComplete(AsyncResult r) { 6237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (VDBG) Log.d(LOG_TAG, "onMMIComplete()..."); 6247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon MmiCode mmiCode = (MmiCode) r.result; 625dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott PhoneUtils.displayMMIComplete(mmiCode.getPhone(), getInstance(), mmiCode, null, null); 6267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 6277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 628dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott private void initForNewRadioTechnology(int phoneId) { 6297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) Log.d(LOG_TAG, "initForNewRadioTechnology..."); 6307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 631dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott final Phone phone = PhoneFactory.getPhone(phoneId); 632c593d00da07c4321f380c3df3aace752557cf130Santos Cordon if (phone == null || !TelephonyCapabilities.supportsOtasp(phone)) { 633c593d00da07c4321f380c3df3aace752557cf130Santos Cordon // Clean up OTA for non-CDMA since it is only valid for CDMA. 6347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon clearOtaState(); 6357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 6367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon notifier.updateCallNotifierRegistrationsAfterRadioTechnologyChange(); 6387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 6397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 640e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon private void handleAirplaneModeChange(int newMode) { 641e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon if (newMode == AIRPLANE_ON) { 642e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon // If we are trying to turn off the radio, make sure there are no active 643e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon // emergency calls. If there are, switch airplane mode back to off. 644e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon if (PhoneUtils.isInEmergencyCall(mCM)) { 645e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon // Switch airplane mode back to off. 646e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon ConnectivityManager.from(this).setAirplaneMode(false); 647e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon Toast.makeText(this, R.string.radio_off_during_emergency_call, Toast.LENGTH_LONG) 648e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon .show(); 649e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon Log.i(LOG_TAG, "Ignoring airplane mode: emergency call. Turning airplane off"); 650e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon } else { 651e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon Log.i(LOG_TAG, "Turning radio off - airplane"); 652e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon PhoneUtils.setRadioPower(false); 653e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon } 654e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon } else { 655e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon Log.i(LOG_TAG, "Turning radio on - airplane"); 656e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon PhoneUtils.setRadioPower(true); 657e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon } 658e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon } 659e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon 660593ab38970a84a60ac39edba4306647c8b66436dSantos Cordon /** 6617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Receiver for misc intent broadcasts the Phone app cares about. 6627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 6637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private class PhoneAppBroadcastReceiver extends BroadcastReceiver { 6647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 6657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onReceive(Context context, Intent intent) { 6667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String action = intent.getAction(); 6677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) { 668e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon int airplaneMode = Settings.Global.getInt(getContentResolver(), 669e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon Settings.Global.AIRPLANE_MODE_ON, AIRPLANE_OFF); 670e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon // Treat any non-OFF values as ON. 671e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon if (airplaneMode != AIRPLANE_OFF) { 672e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon airplaneMode = AIRPLANE_ON; 673e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon } 674e18902f177c5af2e2b392430782aa84d144864fdSantos Cordon handleAirplaneModeChange(airplaneMode); 6757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else if (action.equals(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED)) { 676dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY, 677dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott SubscriptionManager.INVALID_SUBSCRIPTION_ID); 678dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott int phoneId = SubscriptionManager.getPhoneId(subId); 679dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott String state = intent.getStringExtra(PhoneConstants.STATE_KEY); 680dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott if (VDBG) { 681dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott Log.d(LOG_TAG, "mReceiver: ACTION_ANY_DATA_CONNECTION_STATE_CHANGED"); 682dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott Log.d(LOG_TAG, "- state: " + state); 683dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott Log.d(LOG_TAG, "- reason: " 684dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott + intent.getStringExtra(PhoneConstants.STATE_CHANGE_REASON_KEY)); 685dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott Log.d(LOG_TAG, "- subId: " + subId); 686dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott Log.d(LOG_TAG, "- phoneId: " + phoneId); 687dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott } 688dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott Phone phone = SubscriptionManager.isValidPhoneId(phoneId) ? 689dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott PhoneFactory.getPhone(phoneId) : PhoneFactory.getDefaultPhone(); 690c593d00da07c4321f380c3df3aace752557cf130Santos Cordon 6917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // The "data disconnected due to roaming" notification is shown 6927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // if (a) you have the "data roaming" feature turned off, and 6937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // (b) you just lost data connectivity because you're roaming. 6947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon boolean disconnectedDueToRoaming = 6957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon !phone.getDataRoamingEnabled() 696dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott && PhoneConstants.DataState.DISCONNECTED.equals(state) 6977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon && Phone.REASON_ROAMING_ON.equals( 6987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intent.getStringExtra(PhoneConstants.STATE_CHANGE_REASON_KEY)); 6994d2db1ce81eae41084bef328941a4a12069c48f0Yorke Lee if (mDataDisconnectedDueToRoaming != disconnectedDueToRoaming) { 7004d2db1ce81eae41084bef328941a4a12069c48f0Yorke Lee mDataDisconnectedDueToRoaming = disconnectedDueToRoaming; 7014d2db1ce81eae41084bef328941a4a12069c48f0Yorke Lee mHandler.sendEmptyMessage(disconnectedDueToRoaming 7024d2db1ce81eae41084bef328941a4a12069c48f0Yorke Lee ? EVENT_DATA_ROAMING_DISCONNECTED : EVENT_DATA_ROAMING_OK); 7034d2db1ce81eae41084bef328941a4a12069c48f0Yorke Lee } 7047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else if ((action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) && 7057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon (mPUKEntryActivity != null)) { 7067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // if an attempt to un-PUK-lock the device was made, while we're 7077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // receiving this state change notification, notify the handler. 7087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // NOTE: This is ONLY triggered if an attempt to un-PUK-lock has 7097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // been attempted. 7107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mHandler.sendMessage(mHandler.obtainMessage(EVENT_SIM_STATE_CHANGED, 7117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE))); 7127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else if (action.equals(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED)) { 7137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String newPhone = intent.getStringExtra(PhoneConstants.PHONE_NAME_KEY); 714dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott int phoneId = intent.getIntExtra(PhoneConstants.PHONE_KEY, 715dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott SubscriptionManager.INVALID_PHONE_INDEX); 716dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott Log.d(LOG_TAG, "Radio technology switched. Now " + newPhone + " (" + phoneId 717dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott + ") is active."); 718dcf40a9cc562d95f826123d8d670262c8d15e7bdStuart Scott initForNewRadioTechnology(phoneId); 7197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else if (action.equals(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED)) { 7207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon handleServiceStateChanged(intent); 7217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else if (action.equals(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED)) { 722de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta int phoneId = intent.getIntExtra(PhoneConstants.PHONE_KEY, 0); 723de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta phoneInEcm = getPhone(phoneId); 724de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta Log.d(LOG_TAG, "Emergency Callback Mode. phoneId:" + phoneId); 725de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta if (phoneInEcm != null) { 726de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta if (TelephonyCapabilities.supportsEcm(phoneInEcm)) { 727de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta Log.d(LOG_TAG, "Emergency Callback Mode arrived in PhoneApp."); 728de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta // Start Emergency Callback Mode service 729de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta if (intent.getBooleanExtra("phoneinECMState", false)) { 730de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta context.startService(new Intent(context, 731de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta EmergencyCallbackModeService.class)); 732de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta } else { 733de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta phoneInEcm = null; 734de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta } 735de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta } else { 736de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta // It doesn't make sense to get ACTION_EMERGENCY_CALLBACK_MODE_CHANGED 737de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta // on a device that doesn't support ECM in the first place. 738de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta Log.e(LOG_TAG, "Got ACTION_EMERGENCY_CALLBACK_MODE_CHANGED, but " 739de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta + "ECM isn't supported for phone: " + phoneInEcm.getPhoneName()); 740de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta phoneInEcm = null; 7417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 743de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta Log.w(LOG_TAG, "phoneInEcm is null."); 7447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 7497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void handleServiceStateChanged(Intent intent) { 7507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 7517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * This used to handle updating EriTextWidgetProvider this routine 7527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * and and listening for ACTION_SERVICE_STATE_CHANGED intents could 7537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * be removed. But leaving just in case it might be needed in the near 7547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * future. 7557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 7567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 7577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // If service just returned, start sending out the queued messages 758c593d00da07c4321f380c3df3aace752557cf130Santos Cordon Bundle extras = intent.getExtras(); 759c593d00da07c4321f380c3df3aace752557cf130Santos Cordon if (extras != null) { 760c593d00da07c4321f380c3df3aace752557cf130Santos Cordon ServiceState ss = ServiceState.newFromBundle(extras); 761c593d00da07c4321f380c3df3aace752557cf130Santos Cordon if (ss != null) { 762c593d00da07c4321f380c3df3aace752557cf130Santos Cordon int state = ss.getState(); 763c593d00da07c4321f380c3df3aace752557cf130Santos Cordon notificationMgr.updateNetworkSelection(state); 764c593d00da07c4321f380c3df3aace752557cf130Santos Cordon } 7657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 7687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // it is safe to call clearOtaState() even if the InCallScreen isn't active 7697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void clearOtaState() { 7707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) Log.d(LOG_TAG, "- clearOtaState ..."); 7716fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner if (otaUtils != null) { 7727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaUtils.cleanOtaScreen(true); 7737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) Log.d(LOG_TAG, " - clearOtaState clears OTA screen"); 7747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 7777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // it is safe to call dismissOtaDialogs() even if the InCallScreen isn't active 7787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void dismissOtaDialogs() { 7797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) Log.d(LOG_TAG, "- dismissOtaDialogs ..."); 7806fe8fd6b90be53f5f0a10f589ac320db07b71ba2Jay Shrauner if (otaUtils != null) { 7817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon otaUtils.dismissAllOtaDialogs(); 7827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) Log.d(LOG_TAG, " - dismissOtaDialogs clears OTA dialogs"); 7837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 7857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 786de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta public Phone getPhoneInEcm() { 787de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta return phoneInEcm; 788de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta } 789de73a6afa33e35d384b2c77a332fd250c266d709Sandeep Kunta 7907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 7919c1071fdb42947afd215b0f4f3e81f871b1ff581Tyler Gunn * Triggers a refresh of the message waiting (voicemail) indicator. 7929c1071fdb42947afd215b0f4f3e81f871b1ff581Tyler Gunn * 7939c1071fdb42947afd215b0f4f3e81f871b1ff581Tyler Gunn * @param subId the subscription id we should refresh the notification for. 7949c1071fdb42947afd215b0f4f3e81f871b1ff581Tyler Gunn */ 7959c1071fdb42947afd215b0f4f3e81f871b1ff581Tyler Gunn public void refreshMwiIndicator(int subId) { 7969c1071fdb42947afd215b0f4f3e81f871b1ff581Tyler Gunn notificationMgr.refreshMwi(subId); 7979c1071fdb42947afd215b0f4f3e81f871b1ff581Tyler Gunn } 7989c1071fdb42947afd215b0f4f3e81f871b1ff581Tyler Gunn 7999c1071fdb42947afd215b0f4f3e81f871b1ff581Tyler Gunn /** 800bb49d410b5266d288f65bbb0f2584ac7c2abf6ddNancy Chen * Dismisses the message waiting (voicemail) indicator. 801bb49d410b5266d288f65bbb0f2584ac7c2abf6ddNancy Chen * 802bb49d410b5266d288f65bbb0f2584ac7c2abf6ddNancy Chen * @param subId the subscription id we should dismiss the notification for. 803bb49d410b5266d288f65bbb0f2584ac7c2abf6ddNancy Chen */ 804bb49d410b5266d288f65bbb0f2584ac7c2abf6ddNancy Chen public void clearMwiIndicator(int subId) { 805bb49d410b5266d288f65bbb0f2584ac7c2abf6ddNancy Chen notificationMgr.updateMwi(subId, false); 806bb49d410b5266d288f65bbb0f2584ac7c2abf6ddNancy Chen } 8077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon} 808