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