10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2007 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.app.ActivityManagerNative;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.app.IActivityManager;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.res.Configuration;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.SharedPreferences;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.LinkCapabilities;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.LinkProperties;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.wifi.WifiManager;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Looper;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.RegistrantList;
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemProperties;
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.preference.PreferenceManager;
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.provider.Settings;
35ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.telephony.CellInfo;
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.ServiceState;
37ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.telephony.SignalStrength;
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.TextUtils;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log;
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.R;
42e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccCardApplicationStatus.AppState;
43ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenkaimport com.android.internal.telephony.IccCardApplicationStatus.AppType;
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.gsm.UsimServiceTable;
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.ims.IsimRecords;
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.test.SimulatedRadioControl;
47e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenkaimport com.android.internal.telephony.uicc.UiccController;
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.gsm.SIMRecords;
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor;
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter;
52ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport java.util.List;
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Locale;
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.concurrent.atomic.AtomicReference;
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * (<em>Not for SDK use</em>)
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * A base implementation for the com.android.internal.telephony.Phone interface.
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Note that implementations of Phone.java are expected to be used
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * from a single application thread. This should be the same thread that
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * originally called PhoneFactory to obtain the interface.
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *  {@hide}
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic abstract class PhoneBase extends Handler implements Phone {
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String LOG_TAG = "PHONE";
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final boolean LOCAL_DEBUG = true;
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Key used to read and write the saved network selection numeric value
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final String NETWORK_SELECTION_KEY = "network_selection_key";
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Key used to read and write the saved network selection operator name
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final String NETWORK_SELECTION_NAME_KEY = "network_selection_name_key";
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Key used to read/write "disable data connection on boot" pref (used for testing)
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final String DATA_DISABLED_ON_BOOT_KEY = "disabled_on_boot_key";
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* Event Constants */
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_RADIO_AVAILABLE             = 1;
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Supplementary Service Notification received. */
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SSN                         = 2;
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SIM_RECORDS_LOADED          = 3;
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_MMI_DONE                    = 4;
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_RADIO_ON                    = 5;
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_GET_BASEBAND_VERSION_DONE   = 6;
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_USSD                        = 7;
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_RADIO_OFF_OR_NOT_AVAILABLE  = 8;
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_GET_IMEI_DONE               = 9;
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_GET_IMEISV_DONE             = 10;
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_GET_SIM_STATUS_DONE         = 11;
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SET_CALL_FORWARD_DONE       = 12;
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_GET_CALL_FORWARD_DONE       = 13;
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_CALL_RING                   = 14;
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_CALL_RING_CONTINUE          = 15;
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Used to intercept the carrier selection calls so that
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // we can save the values.
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SET_NETWORK_MANUAL_COMPLETE    = 16;
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SET_NETWORK_AUTOMATIC_COMPLETE = 17;
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SET_CLIR_COMPLETE              = 18;
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_REGISTERED_TO_NETWORK          = 19;
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SET_VM_NUMBER_DONE             = 20;
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Events for CDMA support
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_GET_DEVICE_IDENTITY_DONE       = 21;
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_RUIM_RECORDS_LOADED            = 22;
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_NV_READY                       = 23;
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SET_ENHANCED_VP                = 24;
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_EMERGENCY_CALLBACK_MODE_ENTER  = 25;
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE = 26;
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED = 27;
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // other
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SET_NETWORK_AUTOMATIC          = 28;
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_NEW_ICC_SMS                    = 29;
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_ICC_RECORD_EVENTS              = 30;
119e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    protected static final int EVENT_ICC_CHANGED                    = 31;
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Key used to read/write current CLIR setting
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final String CLIR_KEY = "clir_key";
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Key used to read/write "disable DNS server check" pref (used for testing)
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final String DNS_SERVER_CHECK_DISABLED_KEY = "dns_server_check_disabled_key";
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* Instance Variables */
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public CommandsInterface mCM;
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean mDnsCheckDisabled;
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public DataConnectionTracker mDataConnectionTracker;
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean mDoesRilSendMultipleCallRing;
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    int mCallRingContinueToken;
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    int mCallRingDelay;
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean mIsTheCurrentActivePhone = true;
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean mIsVoiceCapable = true;
136e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    protected UiccController mUiccController = null;
137e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    public AtomicReference<IccRecords> mIccRecords = new AtomicReference<IccRecords>();
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SmsStorageMonitor mSmsStorageMonitor;
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SmsUsageMonitor mSmsUsageMonitor;
140e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    protected AtomicReference<UiccCardApplication> mUiccApplication =
141e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            new AtomicReference<UiccCardApplication>();
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SMSDispatcher mSMS;
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Set a system property, unless we're in unit test mode
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    setSystemProperty(String property, String value) {
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if(getUnitTestMode()) {
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SystemProperties.set(property, value);
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mPreciseCallStateRegistrants
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mNewRingingConnectionRegistrants
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mIncomingRingRegistrants
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mDisconnectRegistrants
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mServiceStateRegistrants
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mMmiCompleteRegistrants
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mMmiRegistrants
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mUnknownConnectionRegistrants
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mSuppServiceFailedRegistrants
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected Looper mLooper; /* to insure registrants are in correct thread*/
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final Context mContext;
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * PhoneNotifier is an abstraction for all system-wide
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * state change notification. DefaultPhoneNotifier is
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * used here unless running we're inside a unit test.
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected PhoneNotifier mNotifier;
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected SimulatedRadioControl mSimulatedRadioControl;
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean mUnitTestMode;
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Constructs a PhoneBase in normal (non-unit test) mode.
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param notifier An instance of DefaultPhoneNotifier,
202ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     * @param context Context object from hosting application
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * unless unit testing.
204ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     * @param ci the CommandsInterface
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected PhoneBase(PhoneNotifier notifier, Context context, CommandsInterface ci) {
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this(notifier, context, ci, false);
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Constructs a PhoneBase in normal (non-unit test) mode.
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param notifier An instance of DefaultPhoneNotifier,
214ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     * @param context Context object from hosting application
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * unless unit testing.
216ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     * @param ci is CommandsInterface
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param unitTestMode when true, prevents notifications
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * of state change events
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected PhoneBase(PhoneNotifier notifier, Context context, CommandsInterface ci,
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean unitTestMode) {
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.mNotifier = notifier;
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.mContext = context;
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mLooper = Looper.myLooper();
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM = ci;
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        setPropertiesByCarrier();
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        setUnitTestMode(unitTestMode);
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDnsCheckDisabled = sp.getBoolean(DNS_SERVER_CHECK_DISABLED_KEY, false);
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.setOnCallRing(this, EVENT_CALL_RING, null);
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /* "Voice capable" means that this device supports circuit-switched
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        * (i.e. voice) phone calls over the telephony network, and is allowed
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        * to display the in-call UI while a cellular voice call is active.
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        * This will be false on "data only" devices which can't make voice
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        * calls and don't support any in-call UI.
2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        */
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mIsVoiceCapable = mContext.getResources().getBoolean(
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                com.android.internal.R.bool.config_voice_capable);
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /**
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         *  Some RIL's don't always send RIL_UNSOL_CALL_RING so it needs
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         *  to be generated locally. Ideally all ring tones should be loops
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * and this wouldn't be necessary. But to minimize changes to upper
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * layers it is requested that it be generated by lower layers.
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         *
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * By default old phones won't have the property set but do generate
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * the RIL_UNSOL_CALL_RING so the default if there is no property is
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * true.
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         */
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDoesRilSendMultipleCallRing = SystemProperties.getBoolean(
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                TelephonyProperties.PROPERTY_RIL_SENDS_MULTIPLE_CALL_RING, true);
2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.d(LOG_TAG, "mDoesRilSendMultipleCallRing=" + mDoesRilSendMultipleCallRing);
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCallRingDelay = SystemProperties.getInt(
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                TelephonyProperties.PROPERTY_CALL_RING_DELAY, 3000);
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.d(LOG_TAG, "mCallRingDelay=" + mCallRingDelay);
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Initialize device storage and outgoing SMS usage monitors for SMSDispatchers.
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSmsStorageMonitor = new SmsStorageMonitor(this);
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSmsUsageMonitor = new SmsUsageMonitor(context);
265e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mUiccController = UiccController.getInstance();
266e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        mUiccController.registerForIccChanged(this, EVENT_ICC_CHANGED, null);
2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dispose() {
2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        synchronized(PhoneProxy.lockForRadioTechnologyChange) {
2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCM.unSetOnCallRing(this);
2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Must cleanup all connectionS and needs to use sendMessage!
2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mDataConnectionTracker.cleanUpAllConnections(null);
2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mIsTheCurrentActivePhone = false;
2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Dispose the SMS usage and storage monitors
2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mSmsStorageMonitor.dispose();
2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mSmsUsageMonitor.dispose();
278e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            mUiccController.unregisterForIccChanged(this);
2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void removeReferences() {
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSmsStorageMonitor = null;
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSmsUsageMonitor = null;
2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSMS = null;
286e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        mIccRecords.set(null);
287e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mUiccApplication.set(null);
2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDataConnectionTracker = null;
289e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        mUiccController = null;
2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * When overridden the derived class needs to call
2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * super.handleMessage(msg) so this method has a
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * a chance to process the message.
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param msg
2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void handleMessage(Message msg) {
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar;
3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch(msg.what) {
3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_CALL_RING:
3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Log.d(LOG_TAG, "Event EVENT_CALL_RING Received state=" + getState());
3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ar.exception == null) {
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    PhoneConstants.State state = getState();
3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if ((!mDoesRilSendMultipleCallRing)
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            && ((state == PhoneConstants.State.RINGING) ||
3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                    (state == PhoneConstants.State.IDLE))) {
3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        mCallRingContinueToken += 1;
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        sendIncomingCallRingNotification(mCallRingContinueToken);
3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        notifyIncomingRing();
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_CALL_RING_CONTINUE:
3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Log.d(LOG_TAG, "Event EVENT_CALL_RING_CONTINUE Received stat=" + getState());
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (getState() == PhoneConstants.State.RINGING) {
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    sendIncomingCallRingNotification(msg.arg1);
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
327e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            case EVENT_ICC_CHANGED:
328e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                onUpdateIccAvailability();
329e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                break;
330e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                throw new RuntimeException("unexpected event not handled");
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Context getContext() {
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mContext;
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
341e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    // Will be called when icc changed
342e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    protected abstract void onUpdateIccAvailability();
343e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka
3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Disables the DNS check (i.e., allows "0.0.0.0").
3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Useful for lab testing environment.
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param b true disables the check, false enables.
3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void disableDnsCheck(boolean b) {
3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDnsCheckDisabled = b;
3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences.Editor editor = sp.edit();
3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        editor.putBoolean(DNS_SERVER_CHECK_DISABLED_KEY, b);
3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        editor.apply();
3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns true if the DNS check is currently disabled.
3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isDnsCheckDisabled() {
3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDnsCheckDisabled;
3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForPreciseCallStateChanged(Handler h, int what, Object obj) {
3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPreciseCallStateRegistrants.addUnique(h, what, obj);
3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForPreciseCallStateChanged(Handler h) {
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPreciseCallStateRegistrants.remove(h);
3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Subclasses of Phone probably want to replace this with a
3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * version scoped to their packages
3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void notifyPreciseCallStateChangedP() {
3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar = new AsyncResult(null, this, null);
3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPreciseCallStateRegistrants.notifyRegistrants(ar);
3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForUnknownConnection(Handler h, int what, Object obj) {
3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mUnknownConnectionRegistrants.addUnique(h, what, obj);
3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForUnknownConnection(Handler h) {
3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mUnknownConnectionRegistrants.remove(h);
3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForNewRingingConnection(
3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Handler h, int what, Object obj) {
4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNewRingingConnectionRegistrants.addUnique(h, what, obj);
4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForNewRingingConnection(Handler h) {
4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNewRingingConnectionRegistrants.remove(h);
4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForInCallVoicePrivacyOn(Handler h, int what, Object obj){
4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.registerForInCallVoicePrivacyOn(h,what,obj);
4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForInCallVoicePrivacyOn(Handler h){
4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.unregisterForInCallVoicePrivacyOn(h);
4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForInCallVoicePrivacyOff(Handler h, int what, Object obj){
4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.registerForInCallVoicePrivacyOff(h,what,obj);
4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForInCallVoicePrivacyOff(Handler h){
4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.unregisterForInCallVoicePrivacyOff(h);
4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForIncomingRing(
4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Handler h, int what, Object obj) {
4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mIncomingRingRegistrants.addUnique(h, what, obj);
4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForIncomingRing(Handler h) {
4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mIncomingRingRegistrants.remove(h);
4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForDisconnect(Handler h, int what, Object obj) {
4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDisconnectRegistrants.addUnique(h, what, obj);
4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForDisconnect(Handler h) {
4520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDisconnectRegistrants.remove(h);
4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
4560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForSuppServiceFailed(Handler h, int what, Object obj) {
4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSuppServiceFailedRegistrants.addUnique(h, what, obj);
4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForSuppServiceFailed(Handler h) {
4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSuppServiceFailedRegistrants.remove(h);
4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForMmiInitiate(Handler h, int what, Object obj) {
4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mMmiRegistrants.addUnique(h, what, obj);
4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForMmiInitiate(Handler h) {
4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mMmiRegistrants.remove(h);
4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForMmiComplete(Handler h, int what, Object obj) {
4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mMmiCompleteRegistrants.addUnique(h, what, obj);
4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForMmiComplete(Handler h) {
4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mMmiCompleteRegistrants.remove(h);
4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Method to retrieve the saved operator id from the Shared Preferences
4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String getSavedNetworkSelection() {
4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // open the shared preferences and search with our key.
4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return sp.getString(NETWORK_SELECTION_KEY, "");
5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Method to restore the previously saved operator id, or reset to
5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * automatic selection, all depending upon the value in the shared
5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * preferences.
5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void restoreSavedNetworkSelection(Message response) {
5080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // retrieve the operator id
5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String networkSelection = getSavedNetworkSelection();
5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // set to auto if the id is empty, otherwise select the network.
5120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (TextUtils.isEmpty(networkSelection)) {
5130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCM.setNetworkSelectionModeAutomatic(response);
5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCM.setNetworkSelectionModeManual(networkSelection, response);
5160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
5200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setUnitTestMode(boolean f) {
5210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mUnitTestMode = f;
5220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
5250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getUnitTestMode() {
5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mUnitTestMode;
5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * To be invoked when a voice call Connection disconnects.
5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Subclasses of Phone probably want to replace this with a
5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * version scoped to their packages
5340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void notifyDisconnectP(Connection cn) {
5360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar = new AsyncResult(null, cn, null);
5370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDisconnectRegistrants.notifyRegistrants(ar);
5380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForServiceStateChanged(
5420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Handler h, int what, Object obj) {
5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
5440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mServiceStateRegistrants.add(h, what, obj);
5460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
5490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForServiceStateChanged(Handler h) {
5500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mServiceStateRegistrants.remove(h);
5510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForRingbackTone(Handler h, int what, Object obj) {
5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.registerForRingbackTone(h,what,obj);
5560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
5590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForRingbackTone(Handler h) {
5600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.unregisterForRingbackTone(h);
5610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForResendIncallMute(Handler h, int what, Object obj) {
5650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.registerForResendIncallMute(h,what,obj);
5660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
5690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForResendIncallMute(Handler h) {
5700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.unregisterForResendIncallMute(h);
5710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setEchoSuppressionEnabled(boolean enabled) {
5740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // no need for regular phone
5750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Subclasses of Phone probably want to replace this with a
5790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * version scoped to their packages
5800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void notifyServiceStateChangedP(ServiceState ss) {
5820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar = new AsyncResult(null, ss, null);
5830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mServiceStateRegistrants.notifyRegistrants(ar);
5840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyServiceState(this);
5860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
5890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SimulatedRadioControl getSimulatedRadioControl() {
5900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSimulatedRadioControl;
5910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Verifies the current thread is the same as the thread originally
5950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * used in the initialization of this instance. Throws RuntimeException
5960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * if not.
5970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
5980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @exception RuntimeException if the current thread is not
5990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the thread that originally obtained this PhoneBase instance.
6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void checkCorrectThread(Handler h) {
6020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (h.getLooper() != mLooper) {
6030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new RuntimeException(
6040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    "com.android.internal.telephony.Phone must be used from within one thread");
6050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Set the properties by matching the carrier string in
6100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * a string-array resource
6110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void setPropertiesByCarrier() {
6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String carrier = SystemProperties.get("ro.carrier");
6140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (null == carrier || 0 == carrier.length() || "unknown".equals(carrier)) {
6160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
6170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        CharSequence[] carrierLocales = mContext.
6200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                getResources().getTextArray(R.array.carrier_properties);
6210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0; i < carrierLocales.length; i+=3) {
6230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String c = carrierLocales[i].toString();
6240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (carrier.equals(c)) {
6250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String l = carrierLocales[i+1].toString();
6260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String language = l.substring(0, 2);
6280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String country = "";
6290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (l.length() >=5) {
6300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    country = l.substring(3, 5);
6310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
6320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                MccTable.setSystemLocale(mContext, language, country);
6330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (!country.isEmpty()) {
6350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    try {
636b8d0e5993929ca9ecd29f406ae5f39a3e450e89bJeff Brown                        Settings.Global.getInt(mContext.getContentResolver(),
637b8d0e5993929ca9ecd29f406ae5f39a3e450e89bJeff Brown                                Settings.Global.WIFI_COUNTRY_CODE);
6380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } catch (Settings.SettingNotFoundException e) {
6390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // note this is not persisting
6400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        WifiManager wM = (WifiManager)
6410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                mContext.getSystemService(Context.WIFI_SERVICE);
6420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        wM.setCountryCode(country, false);
6430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
6440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
6450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return;
6460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
6470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Get state
6520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract PhoneConstants.State getState();
6540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Retrieves the IccFileHandler of the Phone instance
6570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public IccFileHandler getIccFileHandler(){
659e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        UiccCardApplication uiccApplication = mUiccApplication.get();
660e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (uiccApplication == null) return null;
661e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        return uiccApplication.getIccFileHandler();
6620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*
6650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Retrieves the Handler of the Phone instance
6660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Handler getHandler() {
6680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return this;
6690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    * Retrieves the ServiceStateTracker of the phone instance.
6730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    */
6740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public ServiceStateTracker getServiceStateTracker() {
6750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
6760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    * Get call tracker
6800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    */
6810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public CallTracker getCallTracker() {
6820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
6830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
685ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenka    public AppType getCurrentUiccAppType() {
686ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenka        UiccCardApplication currentApp = mUiccApplication.get();
687ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenka        if (currentApp != null) {
688ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenka            return currentApp.getType();
689ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenka        }
690ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenka        return AppType.APPTYPE_UNKNOWN;
691ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenka    }
692ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenka
6930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
6940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public IccCard getIccCard() {
695e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        return null;
696e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        //throw new Exception("getIccCard Shouldn't be called from PhoneBase");
6970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
7000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getIccSerialNumber() {
701e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
702e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        return (r != null) ? r.iccid : "";
7030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
7060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getIccRecordsLoaded() {
707e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
708e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        return (r != null) ? r.getRecordsLoaded() : false;
7090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
711ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    /**
712ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     * @return all available cell information or null if none.
713ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     */
714ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    @Override
715ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    public List<CellInfo> getAllCellInfo() {
716ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        return getServiceStateTracker().getAllCellInfo();
717ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    }
718ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville
7190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
7200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getMessageWaitingIndicator() {
721e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
722e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        return (r != null) ? r.getVoiceMessageWaiting() : false;
7230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
7260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getCallForwardingIndicator() {
727e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
728e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        return (r != null) ? r.getVoiceCallForwardingFlag() : false;
7290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
7320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  Query the status of the CDMA roaming preference
7330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
7340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void queryCdmaRoamingPreference(Message response) {
7350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.queryCdmaRoamingPreference(response);
7360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
739ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     * Get the signal strength
740ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     */
741ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    @Override
742ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    public SignalStrength getSignalStrength() {
743ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        ServiceStateTracker sst = getServiceStateTracker();
744ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        if (sst == null) {
745ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville            return new SignalStrength();
746ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        } else {
747ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville            return sst.getSignalStrength();
748ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        }
749ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    }
750ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville
751ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    /**
7520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  Set the status of the CDMA roaming preference
7530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
7540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setCdmaRoamingPreference(int cdmaRoamingType, Message response) {
7550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.setCdmaRoamingPreference(cdmaRoamingType, response);
7560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
7590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  Set the status of the CDMA subscription mode
7600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
7610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setCdmaSubscription(int cdmaSubscriptionType, Message response) {
7620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.setCdmaSubscriptionSource(cdmaSubscriptionType, response);
7630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
7660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  Set the preferred Network Type: Global, CDMA only or GSM/UMTS only
7670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
7680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setPreferredNetworkType(int networkType, Message response) {
7690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.setPreferredNetworkType(networkType, response);
7700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getPreferredNetworkType(Message response) {
7730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.getPreferredNetworkType(response);
7740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getSmscAddress(Message result) {
7770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.getSmscAddress(result);
7780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setSmscAddress(String address, Message result) {
7810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.setSmscAddress(address, result);
7820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setTTYMode(int ttyMode, Message onComplete) {
7850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.setTTYMode(ttyMode, onComplete);
7860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void queryTTYMode(Message onComplete) {
7890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.queryTTYMode(onComplete);
7900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void enableEnhancedVoicePrivacy(boolean enable, Message onComplete) {
7930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
7940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("enableEnhancedVoicePrivacy");
7950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getEnhancedVoicePrivacy(Message onComplete) {
7980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
7990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("getEnhancedVoicePrivacy");
8000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setBandMode(int bandMode, Message response) {
8030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.setBandMode(bandMode, response);
8040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void queryAvailableBandMode(Message response) {
8070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.queryAvailableBandMode(response);
8080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void invokeOemRilRequestRaw(byte[] data, Message response) {
8110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.invokeOemRilRequestRaw(data, response);
8120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void invokeOemRilRequestStrings(String[] strings, Message response) {
8150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.invokeOemRilRequestStrings(strings, response);
8160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyDataActivity() {
8190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyDataActivity(this);
8200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyMessageWaitingIndicator() {
8230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Do not notify voice mail waiting if device doesn't support voice
8240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!mIsVoiceCapable)
8250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
8260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function is added to send the notification to DefaultPhoneNotifier.
8280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyMessageWaitingChanged(this);
8290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyDataConnection(String reason, String apnType,
8320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            PhoneConstants.DataState state) {
8330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyDataConnection(this, reason, apnType, state);
8340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyDataConnection(String reason, String apnType) {
8370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyDataConnection(this, reason, apnType, getDataConnectionState(apnType));
8380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyDataConnection(String reason) {
8410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String types[] = getActiveApnTypes();
8420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (String apnType : types) {
8430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mNotifier.notifyDataConnection(this, reason, apnType, getDataConnectionState(apnType));
8440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyOtaspChanged(int otaspMode) {
8480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyOtaspChanged(this, otaspMode);
8490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
851ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    public void notifySignalStrength() {
852ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        mNotifier.notifySignalStrength(this);
853ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    }
854ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville
855ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    public void notifyCellInfo(List<CellInfo> cellInfo) {
856ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        mNotifier.notifyCellInfo(this, cellInfo);
857ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    }
858ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville
8590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
8600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if a mobile originating emergency call is active
8610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
8620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isInEmergencyCall() {
8630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
8640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
8670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if we are in the emergency call back mode. This is a period where
8680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the phone should be using as little power as possible and be ready to receive an
8690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * incoming call from the emergency operator.
8700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
8710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isInEcm() {
8720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
8730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract String getPhoneName();
8760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract int getPhoneType();
8780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** @hide */
8800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getVoiceMessageCount(){
8810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return 0;
8820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
8850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the CDMA ERI icon index to display
8860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
8870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getCdmaEriIconIndex() {
8880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("getCdmaEriIconIndex");
8890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return -1;
8900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
8930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the CDMA ERI icon mode,
8940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * 0 - ON
8950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * 1 - FLASHING
8960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
8970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getCdmaEriIconMode() {
8980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("getCdmaEriIconMode");
8990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return -1;
9000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
9030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the CDMA ERI text,
9040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
9050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getCdmaEriText() {
9060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("getCdmaEriText");
9070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return "GSM nw, no ERI";
9080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getCdmaMin() {
9110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
9120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("getCdmaMin");
9130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
9140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isMinInfoReady() {
9170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
9180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("isMinInfoReady");
9190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
9200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getCdmaPrlVersion(){
9230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //  This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
9240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("getCdmaPrlVersion");
9250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
9260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete) {
9290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
9300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("sendBurstDtmf");
9310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void exitEmergencyCallbackMode() {
9340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
9350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("exitEmergencyCallbackMode");
9360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForCdmaOtaStatusChange(Handler h, int what, Object obj) {
9390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
9400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("registerForCdmaOtaStatusChange");
9410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForCdmaOtaStatusChange(Handler h) {
9440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
9450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("unregisterForCdmaOtaStatusChange");
9460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForSubscriptionInfoReady(Handler h, int what, Object obj) {
9490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
9500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("registerForSubscriptionInfoReady");
9510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForSubscriptionInfoReady(Handler h) {
9540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
9550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("unregisterForSubscriptionInfoReady");
9560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
9590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns true if OTA Service Provisioning needs to be performed.
9600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * If not overridden return false.
9610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
9620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean needsOtaServiceProvisioning() {
9630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
9640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
9670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Return true if number is an OTASP number.
9680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * If not overridden return false.
9690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
9700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public  boolean isOtaSpNumber(String dialStr) {
9710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
9720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForCallWaiting(Handler h, int what, Object obj){
9750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
9760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("registerForCallWaiting");
9770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForCallWaiting(Handler h){
9800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
9810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("unregisterForCallWaiting");
9820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForEcmTimerReset(Handler h, int what, Object obj) {
9850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
9860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("registerForEcmTimerReset");
9870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForEcmTimerReset(Handler h) {
9900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
9910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("unregisterForEcmTimerReset");
9920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForSignalInfo(Handler h, int what, Object obj) {
9950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.registerForSignalInfo(h, what, obj);
9960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForSignalInfo(Handler h) {
9990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.unregisterForSignalInfo(h);
10000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForDisplayInfo(Handler h, int what, Object obj) {
10030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.registerForDisplayInfo(h, what, obj);
10040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     public void unregisterForDisplayInfo(Handler h) {
10070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         mCM.unregisterForDisplayInfo(h);
10080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     }
10090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForNumberInfo(Handler h, int what, Object obj) {
10110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.registerForNumberInfo(h, what, obj);
10120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForNumberInfo(Handler h) {
10150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.unregisterForNumberInfo(h);
10160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForRedirectedNumberInfo(Handler h, int what, Object obj) {
10190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.registerForRedirectedNumberInfo(h, what, obj);
10200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForRedirectedNumberInfo(Handler h) {
10230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.unregisterForRedirectedNumberInfo(h);
10240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForLineControlInfo(Handler h, int what, Object obj) {
10270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.registerForLineControlInfo( h, what, obj);
10280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForLineControlInfo(Handler h) {
10310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.unregisterForLineControlInfo(h);
10320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerFoT53ClirlInfo(Handler h, int what, Object obj) {
10350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.registerFoT53ClirlInfo(h, what, obj);
10360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForT53ClirInfo(Handler h) {
10390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.unregisterForT53ClirInfo(h);
10400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForT53AudioControlInfo(Handler h, int what, Object obj) {
10430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.registerForT53AudioControlInfo( h, what, obj);
10440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForT53AudioControlInfo(Handler h) {
10470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.unregisterForT53AudioControlInfo(h);
10480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     public void setOnEcbModeExitResponse(Handler h, int what, Object obj){
10510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
10520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         logUnexpectedCdmaMethodCall("setOnEcbModeExitResponse");
10530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     }
10540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     public void unsetOnEcbModeExitResponse(Handler h){
10560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
10570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         logUnexpectedCdmaMethodCall("unsetOnEcbModeExitResponse");
10580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     }
10590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String[] getActiveApnTypes() {
10610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDataConnectionTracker.getActiveApnTypes();
10620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getActiveApnHost(String apnType) {
10650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDataConnectionTracker.getActiveApnString(apnType);
10660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public LinkProperties getLinkProperties(String apnType) {
10690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDataConnectionTracker.getLinkProperties(apnType);
10700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public LinkCapabilities getLinkCapabilities(String apnType) {
10730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDataConnectionTracker.getLinkCapabilities(apnType);
10740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int enableApnType(String type) {
10770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDataConnectionTracker.enableApnType(type);
10780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int disableApnType(String type) {
10810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDataConnectionTracker.disableApnType(type);
10820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isDataConnectivityPossible() {
10850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return isDataConnectivityPossible(PhoneConstants.APN_TYPE_DEFAULT);
10860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isDataConnectivityPossible(String apnType) {
10890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ((mDataConnectionTracker != null) &&
10900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                (mDataConnectionTracker.isDataPossible(apnType)));
10910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
10940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Notify registrants of a new ringing Connection.
10950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Subclasses of Phone probably want to replace this with a
10960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * version scoped to their packages
10970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
10980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void notifyNewRingingConnectionP(Connection cn) {
10990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!mIsVoiceCapable)
11000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
11010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar = new AsyncResult(null, cn, null);
11020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNewRingingConnectionRegistrants.notifyRegistrants(ar);
11030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Notify registrants of a RING event.
11070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
11080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void notifyIncomingRing() {
11090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!mIsVoiceCapable)
11100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
11110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar = new AsyncResult(null, this, null);
11120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mIncomingRingRegistrants.notifyRegistrants(ar);
11130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Send the incoming call Ring notification if conditions are right.
11170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
11180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void sendIncomingCallRingNotification(int token) {
11190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mIsVoiceCapable && !mDoesRilSendMultipleCallRing &&
11200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                (token == mCallRingContinueToken)) {
11210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Log.d(LOG_TAG, "Sending notifyIncomingRing");
11220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            notifyIncomingRing();
11230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sendMessageDelayed(
11240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    obtainMessage(EVENT_CALL_RING_CONTINUE, token, 0), mCallRingDelay);
11250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
11260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Log.d(LOG_TAG, "Ignoring ring notification request,"
11270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + " mDoesRilSendMultipleCallRing=" + mDoesRilSendMultipleCallRing
11280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + " token=" + token
11290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + " mCallRingContinueToken=" + mCallRingContinueToken
11300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + " mIsVoiceCapable=" + mIsVoiceCapable);
11310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isCspPlmnEnabled() {
11350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class GSMPhone.
11360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Not implemented in CDMAPhone.
11370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedGsmMethodCall("isCspPlmnEnabled");
11380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
11390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public IsimRecords getIsimRecords() {
11420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "getIsimRecords() is only supported on LTE devices");
11430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
11440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void requestIsimAuthentication(String nonce, Message result) {
11470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "requestIsimAuthentication() is only supported on LTE devices");
11480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getMsisdn() {
11510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedGsmMethodCall("getMsisdn");
11520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
11530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Common error logger method for unexpected calls to CDMA-only methods.
11570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
11580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static void logUnexpectedCdmaMethodCall(String name)
11590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    {
11600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "Error! " + name + "() in PhoneBase should not be " +
11610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                "called, CDMAPhone inactive.");
11620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PhoneConstants.DataState getDataConnectionState() {
11650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return getDataConnectionState(PhoneConstants.APN_TYPE_DEFAULT);
11660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Common error logger method for unexpected calls to GSM/WCDMA-only methods.
11700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
11710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static void logUnexpectedGsmMethodCall(String name) {
11720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "Error! " + name + "() in PhoneBase should not be " +
11730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                "called, GSMPhone inactive.");
11740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Called by SimRecords which is constructed with a PhoneBase instead of a GSMPhone.
11770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyCallForwardingIndicator() {
11780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class GSMPhone. Not implemented in CDMAPhone.
11790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "Error! This function should never be executed, inactive CDMAPhone.");
11800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyDataConnectionFailed(String reason, String apnType) {
11830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyDataConnectionFailed(this, reason, apnType);
11840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * {@inheritDoc}
11880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
11890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
11900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getLteOnCdmaMode() {
11910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCM.getLteOnCdmaMode();
11920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Sets the SIM voice message waiting indicator records.
11960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param line GSM Subscriber Profile Number, one-based. Only '1' is supported
11970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param countWaiting The number of messages waiting, if known. Use
11980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *                     -1 to indicate that an unknown number of
11990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *                      messages are waiting
12000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
12010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
12020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setVoiceMessageWaiting(int line, int countWaiting) {
1203e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
1204e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        if (r != null) {
1205e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            r.setVoiceMessageWaiting(line, countWaiting);
1206e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        }
12070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Gets the USIM service table from the UICC, if present and available.
12110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return an interface to the UsimServiceTable record, or null if not available
12120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
12130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
12140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public UsimServiceTable getUsimServiceTable() {
1215e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
1216e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        return (r != null) ? r.getUsimServiceTable() : null;
12170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
12200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println("PhoneBase:");
12210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mCM=" + mCM);
12220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mDnsCheckDisabled=" + mDnsCheckDisabled);
12230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mDataConnectionTracker=" + mDataConnectionTracker);
12240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mDoesRilSendMultipleCallRing=" + mDoesRilSendMultipleCallRing);
12250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mCallRingContinueToken=" + mCallRingContinueToken);
12260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mCallRingDelay=" + mCallRingDelay);
12270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mIsTheCurrentActivePhone=" + mIsTheCurrentActivePhone);
12280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mIsVoiceCapable=" + mIsVoiceCapable);
1229e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        pw.println(" mIccRecords=" + mIccRecords.get());
1230e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        pw.println(" mUiccApplication=" + mUiccApplication.get());
12310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mSmsStorageMonitor=" + mSmsStorageMonitor);
12320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mSmsUsageMonitor=" + mSmsUsageMonitor);
12330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mSMS=" + mSMS);
12340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.flush();
12350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mLooper=" + mLooper);
12360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mContext=" + mContext);
12370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mNotifier=" + mNotifier);
12380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mSimulatedRadioControl=" + mSimulatedRadioControl);
12390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mUnitTestMode=" + mUnitTestMode);
12400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" isDnsCheckDisabled()=" + isDnsCheckDisabled());
12410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" getUnitTestMode()=" + getUnitTestMode());
12420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" getState()=" + getState());
12430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" getIccSerialNumber()=" + getIccSerialNumber());
12440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" getIccRecordsLoaded()=" + getIccRecordsLoaded());
12450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" getMessageWaitingIndicator()=" + getMessageWaitingIndicator());
12460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" getCallForwardingIndicator()=" + getCallForwardingIndicator());
12470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" isInEmergencyCall()=" + isInEmergencyCall());
12480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.flush();
12490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" isInEcm()=" + isInEcm());
12500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" getPhoneName()=" + getPhoneName());
12510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" getPhoneType()=" + getPhoneType());
12520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" getVoiceMessageCount()=" + getVoiceMessageCount());
12530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" getActiveApnTypes()=" + getActiveApnTypes());
12540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" isDataConnectivityPossible()=" + isDataConnectivityPossible());
12550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" needsOtaServiceProvisioning=" + needsOtaServiceProvisioning());
12560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
1258