10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
2ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville * Copyright (C) 2012 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.cdma;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.app.AlarmManager;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.ContentResolver;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Intent;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.database.ContentObserver;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult;
2560ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkeyimport android.os.Build;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.PowerManager;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Registrant;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.RegistrantList;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemClock;
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemProperties;
337eff443d1f090abdbbd93eef9f265c74890920bcDianne Hackbornimport android.os.UserHandle;
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.provider.Settings;
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.provider.Settings.SettingNotFoundException;
36ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.telephony.CellInfo;
37ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.telephony.CellInfoCdma;
3860ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkeyimport android.telephony.Rlog;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.ServiceState;
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.SignalStrength;
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.cdma.CdmaCellLocation;
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.TextUtils;
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.EventLog;
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.TimeUtils;
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4660ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkeyimport com.android.internal.telephony.CommandException;
4760ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkeyimport com.android.internal.telephony.CommandsInterface;
4860ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkeyimport com.android.internal.telephony.CommandsInterface.RadioState;
4960ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkeyimport com.android.internal.telephony.EventLogTags;
5060ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkeyimport com.android.internal.telephony.MccTable;
5160ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkeyimport com.android.internal.telephony.Phone;
5260ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkeyimport com.android.internal.telephony.PhoneConstants;
5360ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkeyimport com.android.internal.telephony.ServiceStateTracker;
5460ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkeyimport com.android.internal.telephony.TelephonyIntents;
5560ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkeyimport com.android.internal.telephony.TelephonyProperties;
5660ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkeyimport com.android.internal.telephony.dataconnection.DcTrackerBase;
5760ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkeyimport com.android.internal.telephony.uicc.UiccCardApplication;
5860ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkeyimport com.android.internal.telephony.uicc.UiccController;
5960ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkey
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor;
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter;
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Arrays;
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Calendar;
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Date;
65ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport java.util.List;
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.TimeZone;
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class CdmaServiceStateTracker extends ServiceStateTracker {
72cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    static final String LOG_TAG = "CdmaSST";
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    CDMAPhone mPhone;
7522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    CdmaCellLocation mCellLoc;
7622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    CdmaCellLocation mNewCellLoc;
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Min values used to by getOtasp()
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String UNACTIVATED_MIN2_VALUE = "000000";
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String UNACTIVATED_MIN_VALUE = "1111110111";
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Current Otasp value
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    int mCurrentOtaspMode = OTASP_UNINITIALIZED;
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     /** if time between NITZ updates is less than mNitzUpdateSpacing the update may be ignored. */
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int NITZ_UPDATE_SPACING_DEFAULT = 1000 * 60 * 10;
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private int mNitzUpdateSpacing = SystemProperties.getInt("ro.nitz_update_spacing",
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            NITZ_UPDATE_SPACING_DEFAULT);
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** If mNitzUpdateSpacing hasn't been exceeded but update is > mNitzUpdate do the update */
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int NITZ_UPDATE_DIFF_DEFAULT = 2000;
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private int mNitzUpdateDiff = SystemProperties.getInt("ro.nitz_update_diff",
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            NITZ_UPDATE_DIFF_DEFAULT);
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean mCdmaRoaming = false;
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private int mRoamingIndicator;
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean mIsInPrl;
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private int mDefaultRoamingIndicator;
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Initially assume no data connection.
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected int mRegistrationState = -1;
10422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected RegistrantList mCdmaForSubscriptionInfoReadyRegistrants = new RegistrantList();
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Sometimes we get the NITZ time before we know what country we
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * are in. Keep the time zone information from the NITZ string so
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * we can fix the time zone once know the country.
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected boolean mNeedFixZone = false;
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private int mZoneOffset;
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean mZoneDst;
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private long mZoneTime;
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected boolean mGotCountryCode = false;
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    String mSavedTimeZone;
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    long mSavedTime;
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    long mSavedAtTime;
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Wake lock used while setting time of day. */
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private PowerManager.WakeLock mWakeLock;
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String WAKELOCK_TAG = "ServiceStateTracker";
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Contains the name of the registered network in CDMA (either ONS or ERI text). */
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected String mCurPlmn = null;
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected String mMdn;
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected int mHomeSystemId[] = null;
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected int mHomeNetworkId[] = null;
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected String mMin;
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected String mPrlVersion;
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected boolean mIsMinInfoReady = false;
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private boolean mIsEriTextLoaded = false;
13522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected boolean mIsSubscriptionFromRuim = false;
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private CdmaSubscriptionSourceManager mCdmaSSM;
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* Used only for debugging purposes. */
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String mRegistrationDeniedReason;
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private ContentResolver mCr;
14222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private String mCurrentCarrier = null;
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private ContentObserver mAutoTimeObserver = new ContentObserver(new Handler()) {
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public void onChange(boolean selfChange) {
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("Auto time state changed");
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            revertToNitzTime();
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    };
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private ContentObserver mAutoTimeZoneObserver = new ContentObserver(new Handler()) {
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public void onChange(boolean selfChange) {
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("Auto time zone state changed");
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            revertToNitzTimeZone();
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    };
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public CdmaServiceStateTracker(CDMAPhone phone) {
161ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        this(phone, new CellInfoCdma());
162ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    }
163ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville
164ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    protected CdmaServiceStateTracker(CDMAPhone phone, CellInfo cellInfo) {
16522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        super(phone, phone.mCi, cellInfo);
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone = phone;
16822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCr = phone.getContext().getContentResolver();
16922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCellLoc = new CdmaCellLocation();
17022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mNewCellLoc = new CdmaCellLocation();
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
17222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCdmaSSM = CdmaSubscriptionSourceManager.getInstance(phone.getContext(), mCi, this,
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED, null);
17422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mIsSubscriptionFromRuim = (mCdmaSSM.getCdmaSubscriptionSource() ==
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                          CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_RUIM);
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        PowerManager powerManager =
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                (PowerManager)phone.getContext().getSystemService(Context.POWER_SERVICE);
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_TAG);
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForRadioStateChanged(this, EVENT_RADIO_STATE_CHANGED, null);
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForVoiceNetworkStateChanged(this, EVENT_NETWORK_STATE_CHANGED_CDMA, null);
18422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setOnNITZTime(this, EVENT_NITZ_TIME, null);
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForCdmaPrlChanged(this, EVENT_CDMA_PRL_VERSION_CHANGED, null);
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        phone.registerForEriFileLoaded(this, EVENT_ERI_FILE_LOADED, null);
18822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForCdmaOtaProvision(this,EVENT_OTA_PROVISION_STATUS_CHANGE, null);
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // System setting property AIRPLANE_MODE_ON is set in Settings.
19122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        int airplaneMode = Settings.Global.getInt(mCr, Settings.Global.AIRPLANE_MODE_ON, 0);
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDesiredPowerState = ! (airplaneMode > 0);
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
19422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCr.registerContentObserver(
195069488059d9619a2b8bd070e85d6d657bddcf65aChristopher Tate                Settings.Global.getUriFor(Settings.Global.AUTO_TIME), true,
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mAutoTimeObserver);
19722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCr.registerContentObserver(
198069488059d9619a2b8bd070e85d6d657bddcf65aChristopher Tate            Settings.Global.getUriFor(Settings.Global.AUTO_TIME_ZONE), true,
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mAutoTimeZoneObserver);
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        setSignalStrengthDefaultValues();
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
203ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    @Override
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dispose() {
205e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        checkCorrectThread();
2065e2000b856a7959609e8f15148a3584ec372f865Wink Saville        log("ServiceStateTracker dispose");
2075e2000b856a7959609e8f15148a3584ec372f865Wink Saville
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Unregister for all events.
20922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForRadioStateChanged(this);
21022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForVoiceNetworkStateChanged(this);
21122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForCdmaOtaProvision(this);
21222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.unregisterForEriFileLoaded(this);
213e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mUiccApplcation != null) {mUiccApplcation.unregisterForReady(this);}
214e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        if (mIccRecords != null) {mIccRecords.unregisterForRecordsLoaded(this);}
21522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unSetOnNITZTime(this);
21622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCr.unregisterContentObserver(mAutoTimeObserver);
21722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCr.unregisterContentObserver(mAutoTimeZoneObserver);
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCdmaSSM.dispose(this);
21922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForCdmaPrlChanged(this);
220ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        super.dispose();
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void finalize() {
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("CdmaServiceStateTracker finalized");
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Registration point for subscription info ready
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param h handler to notify
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param what what code of message when delivered
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param obj placed in Message.obj
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForSubscriptionInfoReady(Handler h, int what, Object obj) {
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Registrant r = new Registrant(h, what, obj);
23622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCdmaForSubscriptionInfoReadyRegistrants.add(r);
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (isMinInfoReady()) {
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            r.notifyRegistrant();
2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForSubscriptionInfoReady(Handler h) {
24422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCdmaForSubscriptionInfoReadyRegistrants.remove(h);
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Save current source of cdma subscription
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param source - 1 for NV, 0 for RUIM
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void saveCdmaSubscriptionSource(int source) {
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        log("Storing cdma subscription source: " + source);
25322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        Settings.Global.putInt(mPhone.getContext().getContentResolver(),
254b8d0e5993929ca9ecd29f406ae5f39a3e450e89bJeff Brown                Settings.Global.CDMA_SUBSCRIPTION_MODE,
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                source );
2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void getSubscriptionInfoAndStartPollingThreads() {
25922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.getCDMASubscription(obtainMessage(EVENT_POLL_STATE_CDMA_SUBSCRIPTION));
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Get Registration Information
2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pollState();
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void handleMessage (Message msg) {
2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar;
2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int[] ints;
2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String[] strings;
2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
27122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (!mPhone.mIsTheCurrentActivePhone) {
2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            loge("Received message " + msg + "[" + msg.what + "]" +
2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    " while being destroyed. Ignoring.");
2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (msg.what) {
2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED:
2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            handleCdmaSubscriptionSource(mCdmaSSM.getCdmaSubscriptionSource());
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_RUIM_READY:
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // TODO: Consider calling setCurrentPreferredNetworkType as we do in GsmSST.
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // cm.setCurrentPreferredNetworkType();
2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
28622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (mPhone.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE) {
2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Subscription will be read from SIM I/O
2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (DBG) log("Receive EVENT_RUIM_READY");
2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                pollState();
2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (DBG) log("Receive EVENT_RUIM_READY and Send Request getCDMASubscription.");
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                getSubscriptionInfoAndStartPollingThreads();
2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
29422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.prepareEri();
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_NV_READY:
298b54cd09892e0676d719e6df00e60c77b663f993cWink Saville            updatePhoneObject();
299b54cd09892e0676d719e6df00e60c77b663f993cWink Saville
3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // For Non-RUIM phones, the subscription information is stored in
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Non Volatile. Here when Non-Volatile is ready, we can poll the CDMA
3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // subscription info.
3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            getSubscriptionInfoAndStartPollingThreads();
3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_RADIO_STATE_CHANGED:
30722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if(mCi.getRadioState() == RadioState.RADIO_ON) {
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                handleCdmaSubscriptionSource(mCdmaSSM.getCdmaSubscriptionSource());
3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Signal strength polling stops when radio is off.
3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                queueNextSignalStrengthPoll();
3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // This will do nothing in the 'radio not available' case.
3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            setPowerStateToDesired();
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pollState();
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_NETWORK_STATE_CHANGED_CDMA:
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pollState();
3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_GET_SIGNAL_STRENGTH:
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // This callback is called when signal strength is polled
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // all by itself.
3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
32622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (!(mCi.getRadioState().isOn())) {
3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Polling will continue when radio turns back on.
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return;
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ar = (AsyncResult) msg.obj;
331e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville            onSignalStrengthResult(ar, false);
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            queueNextSignalStrengthPoll();
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_GET_LOC_DONE_CDMA:
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ar = (AsyncResult) msg.obj;
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (ar.exception == null) {
3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String states[] = (String[])ar.result;
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                int baseStationId = -1;
3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                int baseStationLatitude = CdmaCellLocation.INVALID_LAT_LONG;
3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                int baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG;
3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                int systemId = -1;
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                int networkId = -1;
3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (states.length > 9) {
3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    try {
3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (states[4] != null) {
3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            baseStationId = Integer.parseInt(states[4]);
3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (states[5] != null) {
3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            baseStationLatitude = Integer.parseInt(states[5]);
3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (states[6] != null) {
3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            baseStationLongitude = Integer.parseInt(states[6]);
3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Some carriers only return lat-lngs of 0,0
3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (baseStationLatitude == 0 && baseStationLongitude == 0) {
3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            baseStationLatitude  = CdmaCellLocation.INVALID_LAT_LONG;
3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG;
3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (states[8] != null) {
3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            systemId = Integer.parseInt(states[8]);
3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (states[9] != null) {
3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            networkId = Integer.parseInt(states[9]);
3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } catch (NumberFormatException ex) {
3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        loge("error parsing cell location data: " + ex);
3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
37422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mCellLoc.setCellLocationData(baseStationId, baseStationLatitude,
3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        baseStationLongitude, systemId, networkId);
37622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPhone.notifyLocationChanged();
3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Release any temporary cell lock, which could have been
3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // acquired to allow a single-shot location update.
3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            disableSingleLocationUpdate();
3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_POLL_STATE_REGISTRATION_CDMA:
3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_POLL_STATE_OPERATOR_CDMA:
386f92cb4bd5519427a0db673709d94683a8baf203aWink Saville        case EVENT_POLL_STATE_GPRS:
3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ar = (AsyncResult) msg.obj;
3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            handlePollStateResult(msg.what, ar);
3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_POLL_STATE_CDMA_SUBSCRIPTION: // Handle RIL_CDMA_SUBSCRIPTION
3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ar = (AsyncResult) msg.obj;
3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (ar.exception == null) {
3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String cdmaSubscription[] = (String[])ar.result;
3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (cdmaSubscription != null && cdmaSubscription.length >= 5) {
3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mMdn = cdmaSubscription[0];
3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    parseSidNid(cdmaSubscription[1], cdmaSubscription[2]);
3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mMin = cdmaSubscription[3];
4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mPrlVersion = cdmaSubscription[4];
4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) log("GET_CDMA_SUBSCRIPTION: MDN=" + mMdn);
4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mIsMinInfoReady = true;
4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    updateOtaspState();
40722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (!mIsSubscriptionFromRuim && mIccRecords != null) {
408e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                        if (DBG) {
409e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                            log("GET_CDMA_SUBSCRIPTION set imsi in mIccRecords");
410e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                        }
411e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                        mIccRecords.setImsi(getImsi());
412e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                    } else {
413e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                        if (DBG) {
414e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                            log("GET_CDMA_SUBSCRIPTION either mIccRecords is null  or NV type device" +
415e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                                    " - not setting Imsi in mIccRecords");
416e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                        }
417e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                    }
4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) {
4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        log("GET_CDMA_SUBSCRIPTION: error parsing cdmaSubscription params num="
4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            + cdmaSubscription.length);
4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_POLL_SIGNAL_STRENGTH:
4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Just poll signal strength...not part of pollState()
4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
43022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.getSignalStrength(obtainMessage(EVENT_GET_SIGNAL_STRENGTH));
4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_NITZ_TIME:
4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ar = (AsyncResult) msg.obj;
4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String nitzString = (String)((Object[])ar.result)[0];
4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            long nitzReceiveTime = ((Long)((Object[])ar.result)[1]).longValue();
4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            setTimeFromNITZString(nitzString, nitzReceiveTime);
4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_SIGNAL_STRENGTH_UPDATE:
4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // This is a notification from CommandsInterface.setOnSignalStrengthUpdate.
4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ar = (AsyncResult) msg.obj;
4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // The radio is telling us about signal strength changes,
4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // so we don't have to ask it.
44922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mDontPollSignalStrength = true;
4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
451e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville            onSignalStrengthResult(ar, false);
4520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_RUIM_RECORDS_LOADED:
455b54cd09892e0676d719e6df00e60c77b663f993cWink Saville            log("EVENT_RUIM_RECORDS_LOADED: what=" + msg.what);
456b54cd09892e0676d719e6df00e60c77b663f993cWink Saville            updatePhoneObject();
4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            updateSpnDisplay();
4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_LOCATION_UPDATES_ENABLED:
4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ar = (AsyncResult) msg.obj;
4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (ar.exception == null) {
46422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mCi.getVoiceRegistrationState(obtainMessage(EVENT_GET_LOC_DONE_CDMA, null));
4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_ERI_FILE_LOADED:
4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Repoll the state once the ERI file has been loaded.
4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("[CdmaServiceStateTracker] ERI file has been loaded, repolling.");
4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pollState();
4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_OTA_PROVISION_STATUS_CHANGE:
4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ar = (AsyncResult)msg.obj;
4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (ar.exception == null) {
4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ints = (int[]) ar.result;
4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                int otaStatus = ints[0];
4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (otaStatus == Phone.CDMA_OTA_PROVISION_STATUS_COMMITTED
4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    || otaStatus == Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED) {
4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) log("EVENT_OTA_PROVISION_STATUS_CHANGE: Complete, Reload MDN");
48222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mCi.getCDMASubscription( obtainMessage(EVENT_POLL_STATE_CDMA_SUBSCRIPTION));
4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case EVENT_CDMA_PRL_VERSION_CHANGED:
4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ar = (AsyncResult)msg.obj;
4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (ar.exception == null) {
4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ints = (int[]) ar.result;
4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mPrlVersion = Integer.toString(ints[0]);
4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        default:
4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            super.handleMessage(msg);
4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        break;
4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Private Instance Methods
5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void handleCdmaSubscriptionSource(int newSubscriptionSource) {
5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        log("Subscription Source : " + newSubscriptionSource);
50522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mIsSubscriptionFromRuim =
5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            (newSubscriptionSource == CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_RUIM);
5070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        saveCdmaSubscriptionSource(newSubscriptionSource);
50822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (!mIsSubscriptionFromRuim) {
5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // NV is ready when subscription source is NV
5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sendMessage(obtainMessage(EVENT_NV_READY));
5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void setPowerStateToDesired() {
5160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // If we want it on and it's off, turn it on
5170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mDesiredPowerState
51822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            && mCi.getRadioState() == CommandsInterface.RadioState.RADIO_OFF) {
51922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.setRadioPower(true, null);
52022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (!mDesiredPowerState && mCi.getRadioState().isOn()) {
521454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville            DcTrackerBase dcTracker = mPhone.mDcTracker;
5220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // If it's on and available and we want it off gracefully
5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            powerOffRadioSafely(dcTracker);
5250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } // Otherwise, we're in the desired state
5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void updateSpnDisplay() {
5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // mOperatorAlphaLong contains the ERI text
53122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        String plmn = mSS.getOperatorAlphaLong();
5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!TextUtils.equals(plmn, mCurPlmn)) {
5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Allow A blank plmn, "" to set showPlmn to true. Previously, we
5340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // would set showPlmn to true only if plmn was not empty, i.e. was not
5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // null and not blank. But this would cause us to incorrectly display
5360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // "No Service". Now showPlmn is set to true for any non null string.
5370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean showPlmn = plmn != null;
5380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) {
5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                log(String.format("updateSpnDisplay: changed sending intent" +
5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            " showPlmn='%b' plmn='%s'", showPlmn, plmn));
5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
5420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Intent intent = new Intent(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION);
5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
5440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            intent.putExtra(TelephonyIntents.EXTRA_SHOW_SPN, false);
5450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            intent.putExtra(TelephonyIntents.EXTRA_SPN, "");
5460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            intent.putExtra(TelephonyIntents.EXTRA_SHOW_PLMN, showPlmn);
5470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            intent.putExtra(TelephonyIntents.EXTRA_PLMN, plmn);
54822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.getContext().sendStickyBroadcastAsUser(intent, UserHandle.ALL);
5490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCurPlmn = plmn;
5520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected Phone getPhone() {
55622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mPhone;
5570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    * Hanlde the PollStateResult message
5610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    */
5620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void handlePollStateResultMessage(int what, AsyncResult ar){
5630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int ints[];
5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String states[];
5650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (what) {
566f92cb4bd5519427a0db673709d94683a8baf203aWink Saville            case EVENT_POLL_STATE_GPRS: {
567f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                states = (String[])ar.result;
568f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                if (DBG) {
569f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    log("handlePollStateResultMessage: EVENT_POLL_STATE_GPRS states.length=" +
570f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            states.length + " states=" + states);
571f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                }
572f92cb4bd5519427a0db673709d94683a8baf203aWink Saville
573f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                int regState = ServiceState.RIL_REG_STATE_UNKNOWN;
574f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                int dataRadioTechnology = 0;
575f92cb4bd5519427a0db673709d94683a8baf203aWink Saville
576f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                if (states.length > 0) {
577f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    try {
578f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        regState = Integer.parseInt(states[0]);
579f92cb4bd5519427a0db673709d94683a8baf203aWink Saville
580f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        // states[3] (if present) is the current radio technology
581f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        if (states.length >= 4 && states[3] != null) {
582f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            dataRadioTechnology = Integer.parseInt(states[3]);
583f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        }
584f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    } catch (NumberFormatException ex) {
585f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        loge("handlePollStateResultMessage: error parsing GprsRegistrationState: "
586f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                                        + ex);
5872e648e5c481ac90f64d71e1643c83bc67f8c0e7fWink Saville                    }
5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
589f92cb4bd5519427a0db673709d94683a8baf203aWink Saville
590f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                int dataRegState = regCodeToServiceState(regState);
59122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mNewSS.setDataRegState(dataRegState);
59222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mNewSS.setRilDataRadioTechnology(dataRadioTechnology);
593f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                if (DBG) {
594f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    log("handlPollStateResultMessage: cdma setDataRegState=" + dataRegState
595f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            + " regState=" + regState
596f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            + " dataRadioTechnology=" + dataRadioTechnology);
597f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                }
598f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                break;
5990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
601f92cb4bd5519427a0db673709d94683a8baf203aWink Saville            case EVENT_POLL_STATE_REGISTRATION_CDMA: // Handle RIL_REQUEST_REGISTRATION_STATE.
602f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                states = (String[])ar.result;
6030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
604f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                int registrationState = 4;     //[0] registrationState
605f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                int radioTechnology = -1;      //[3] radioTechnology
606f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                int baseStationId = -1;        //[4] baseStationId
607f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                //[5] baseStationLatitude
608f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                int baseStationLatitude = CdmaCellLocation.INVALID_LAT_LONG;
609f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                //[6] baseStationLongitude
610f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                int baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG;
611f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                int cssIndicator = 0;          //[7] init with 0, because it is treated as a boolean
612f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                int systemId = 0;              //[8] systemId
613f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                int networkId = 0;             //[9] networkId
614f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                int roamingIndicator = -1;     //[10] Roaming indicator
615f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                int systemIsInPrl = 0;         //[11] Indicates if current system is in PRL
616f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                int defaultRoamingIndicator = 0;  //[12] Is default roaming indicator from PRL
617f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                int reasonForDenial = 0;       //[13] Denial reason if registrationState = 3
618f92cb4bd5519427a0db673709d94683a8baf203aWink Saville
619f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                if (states.length >= 14) {
620f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    try {
621f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        if (states[0] != null) {
622f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            registrationState = Integer.parseInt(states[0]);
623f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        }
624f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        if (states[3] != null) {
625f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            radioTechnology = Integer.parseInt(states[3]);
626f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        }
627f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        if (states[4] != null) {
628f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            baseStationId = Integer.parseInt(states[4]);
629f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        }
630f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        if (states[5] != null) {
631f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            baseStationLatitude = Integer.parseInt(states[5]);
632f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        }
633f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        if (states[6] != null) {
634f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            baseStationLongitude = Integer.parseInt(states[6]);
635f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        }
636f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        // Some carriers only return lat-lngs of 0,0
637f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        if (baseStationLatitude == 0 && baseStationLongitude == 0) {
638f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            baseStationLatitude  = CdmaCellLocation.INVALID_LAT_LONG;
639f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG;
640f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        }
641f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        if (states[7] != null) {
642f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            cssIndicator = Integer.parseInt(states[7]);
643f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        }
644f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        if (states[8] != null) {
645f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            systemId = Integer.parseInt(states[8]);
646f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        }
647f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        if (states[9] != null) {
648f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            networkId = Integer.parseInt(states[9]);
649f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        }
650f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        if (states[10] != null) {
651f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            roamingIndicator = Integer.parseInt(states[10]);
652f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        }
653f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        if (states[11] != null) {
654f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            systemIsInPrl = Integer.parseInt(states[11]);
655f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        }
656f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        if (states[12] != null) {
657f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            defaultRoamingIndicator = Integer.parseInt(states[12]);
658f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        }
659f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        if (states[13] != null) {
660f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            reasonForDenial = Integer.parseInt(states[13]);
661f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        }
662f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    } catch (NumberFormatException ex) {
663f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        loge("EVENT_POLL_STATE_REGISTRATION_CDMA: error parsing: " + ex);
664f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    }
665f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                } else {
666f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    throw new RuntimeException("Warning! Wrong number of parameters returned from "
667f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                                         + "RIL_REQUEST_REGISTRATION_STATE: expected 14 or more "
668f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                                         + "strings and got " + states.length + " strings");
669f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                }
6700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
671f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                mRegistrationState = registrationState;
672f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                // When registration state is roaming and TSB58
673f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                // roaming indicator is not in the carrier-specified
674f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                // list of ERIs for home system, mCdmaRoaming is true.
675f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                mCdmaRoaming =
676f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        regCodeIsRoaming(registrationState) && !isRoamIndForHomeSystem(states[10]);
67722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mNewSS.setState (regCodeToServiceState(registrationState));
6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
67922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mNewSS.setRilVoiceRadioTechnology(radioTechnology);
6800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
68122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mNewSS.setCssIndicator(cssIndicator);
68222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mNewSS.setSystemAndNetworkId(systemId, networkId);
683f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                mRoamingIndicator = roamingIndicator;
684f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                mIsInPrl = (systemIsInPrl == 0) ? false : true;
685f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                mDefaultRoamingIndicator = defaultRoamingIndicator;
6860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
688f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                // Values are -1 if not available.
68922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mNewCellLoc.setCellLocationData(baseStationId, baseStationLatitude,
690f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        baseStationLongitude, systemId, networkId);
6910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
692f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                if (reasonForDenial == 0) {
693f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    mRegistrationDeniedReason = ServiceStateTracker.REGISTRATION_DENIED_GEN;
694f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                } else if (reasonForDenial == 1) {
695f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    mRegistrationDeniedReason = ServiceStateTracker.REGISTRATION_DENIED_AUTH;
696f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                } else {
697f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    mRegistrationDeniedReason = "";
698f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                }
699f92cb4bd5519427a0db673709d94683a8baf203aWink Saville
700f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                if (mRegistrationState == 3) {
701f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    if (DBG) log("Registration denied, " + mRegistrationDeniedReason);
702f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                }
703f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                break;
7040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
705f92cb4bd5519427a0db673709d94683a8baf203aWink Saville            case EVENT_POLL_STATE_OPERATOR_CDMA: // Handle RIL_REQUEST_OPERATOR
706f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                String opNames[] = (String[])ar.result;
707f92cb4bd5519427a0db673709d94683a8baf203aWink Saville
708f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                if (opNames != null && opNames.length >= 3) {
709f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    // If the NUMERIC field isn't valid use PROPERTY_CDMA_HOME_OPERATOR_NUMERIC
710f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    if ((opNames[2] == null) || (opNames[2].length() < 5)
711f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            || ("00000".equals(opNames[2]))) {
712f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        opNames[2] = SystemProperties.get(
713f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                                CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC, "00000");
714f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        if (DBG) {
715f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                            log("RIL_REQUEST_OPERATOR.response[2], the numeric, " +
716f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                                    " is bad. Using SystemProperties '" +
717f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                                            CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC +
718f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                                    "'= " + opNames[2]);
719f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        }
7200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
7210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
72222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (!mIsSubscriptionFromRuim) {
723f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        // In CDMA in case on NV, the ss.mOperatorAlphaLong is set later with the
724f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        // ERI text, so here it is ignored what is coming from the modem.
72522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mNewSS.setOperatorName(null, opNames[1], opNames[2]);
726f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    } else {
72722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mNewSS.setOperatorName(opNames[0], opNames[1], opNames[2]);
728f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    }
7290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
730f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                    if (DBG) log("EVENT_POLL_STATE_OPERATOR_CDMA: error parsing opNames");
7310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
732f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                break;
733f92cb4bd5519427a0db673709d94683a8baf203aWink Saville
734f92cb4bd5519427a0db673709d94683a8baf203aWink Saville
735f92cb4bd5519427a0db673709d94683a8baf203aWink Saville            default:
736f92cb4bd5519427a0db673709d94683a8baf203aWink Saville
737f92cb4bd5519427a0db673709d94683a8baf203aWink Saville
738f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                loge("handlePollStateResultMessage: RIL response handle in wrong phone!"
739f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                        + " Expected CDMA RIL request and get GSM RIL request.");
740f92cb4bd5519427a0db673709d94683a8baf203aWink Saville                break;
7410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
7450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Handle the result of one of the pollState() - related requests
7460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
7470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
7480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void handlePollStateResult(int what, AsyncResult ar) {
7490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Ignore stale requests from last poll.
75022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (ar.userObj != mPollingContext) return;
7510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (ar.exception != null) {
7530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            CommandException.Error err=null;
7540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (ar.exception instanceof CommandException) {
7560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                err = ((CommandException)(ar.exception)).getCommandError();
7570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
7580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (err == CommandException.Error.RADIO_NOT_AVAILABLE) {
7600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Radio has crashed or turned off.
7610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                cancelPollState();
7620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return;
7630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
7640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
76522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (!mCi.getRadioState().isOn()) {
7660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Radio has crashed or turned off.
7670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                cancelPollState();
7680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return;
7690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
7700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (err != CommandException.Error.OP_NOT_ALLOWED_BEFORE_REG_NW) {
7720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                loge("handlePollStateResult: RIL returned an error where it must succeed"
7730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        + ar.exception);
7740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
7750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else try {
7760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            handlePollStateResultMessage(what, ar);
7770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RuntimeException ex) {
7780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            loge("handlePollStateResult: Exception while polling service state. "
7790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + "Probably malformed RIL response." + ex);
7800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
78222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPollingContext[0]--;
7830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
78422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mPollingContext[0] == 0) {
7850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean namMatch = false;
78622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (!isSidsAllZeros() && isHomeSid(mNewSS.getSystemId())) {
7870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                namMatch = true;
7880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
7890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Setting SS Roaming (general)
79122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (mIsSubscriptionFromRuim) {
79222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mNewSS.setRoaming(isRoamingBetweenOperators(mCdmaRoaming, mNewSS));
7930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
79422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mNewSS.setRoaming(mCdmaRoaming);
7950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
7960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Setting SS CdmaRoamingIndicator and CdmaDefaultRoamingIndicator
79822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mNewSS.setCdmaDefaultRoamingIndicator(mDefaultRoamingIndicator);
79922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mNewSS.setCdmaRoamingIndicator(mRoamingIndicator);
8000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean isPrlLoaded = true;
8010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (TextUtils.isEmpty(mPrlVersion)) {
8020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                isPrlLoaded = false;
8030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
8045eee0d4d68b2a768aa5d27875cd0f2e44c2bd272Wink Saville            if (!isPrlLoaded || (mNewSS.getRilVoiceRadioTechnology()
8055eee0d4d68b2a768aa5d27875cd0f2e44c2bd272Wink Saville                                        == ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN)) {
8065eee0d4d68b2a768aa5d27875cd0f2e44c2bd272Wink Saville                log("Turn off roaming indicator if !isPrlLoaded or voice RAT is unknown");
80722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mNewSS.setCdmaRoamingIndicator(EriInfo.ROAMING_INDICATOR_OFF);
8080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (!isSidsAllZeros()) {
8090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (!namMatch && !mIsInPrl) {
8100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // Use default
81122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mNewSS.setCdmaRoamingIndicator(mDefaultRoamingIndicator);
8120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else if (namMatch && !mIsInPrl) {
8135eee0d4d68b2a768aa5d27875cd0f2e44c2bd272Wink Saville                    // TODO this will be removed when we handle roaming on LTE on CDMA+LTE phones
8145eee0d4d68b2a768aa5d27875cd0f2e44c2bd272Wink Saville                    if (mNewSS.getRilVoiceRadioTechnology()
8155eee0d4d68b2a768aa5d27875cd0f2e44c2bd272Wink Saville                            == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) {
8165eee0d4d68b2a768aa5d27875cd0f2e44c2bd272Wink Saville                        log("Turn off roaming indicator as voice is LTE");
8175eee0d4d68b2a768aa5d27875cd0f2e44c2bd272Wink Saville                        mNewSS.setCdmaRoamingIndicator(EriInfo.ROAMING_INDICATOR_OFF);
8185eee0d4d68b2a768aa5d27875cd0f2e44c2bd272Wink Saville                    } else {
8195eee0d4d68b2a768aa5d27875cd0f2e44c2bd272Wink Saville                        mNewSS.setCdmaRoamingIndicator(EriInfo.ROAMING_INDICATOR_FLASH);
8205eee0d4d68b2a768aa5d27875cd0f2e44c2bd272Wink Saville                    }
8210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else if (!namMatch && mIsInPrl) {
8220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // Use the one from PRL/ERI
82322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mNewSS.setCdmaRoamingIndicator(mRoamingIndicator);
8240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
8250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // It means namMatch && mIsInPrl
8260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if ((mRoamingIndicator <= 2)) {
82722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mNewSS.setCdmaRoamingIndicator(EriInfo.ROAMING_INDICATOR_OFF);
8280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
8290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Use the one from PRL/ERI
83022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mNewSS.setCdmaRoamingIndicator(mRoamingIndicator);
8310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
8320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
8330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
8340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
83522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            int roamingIndicator = mNewSS.getCdmaRoamingIndicator();
83622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mNewSS.setCdmaEriIconIndex(mPhone.mEriManager.getCdmaEriIconIndex(roamingIndicator,
8370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mDefaultRoamingIndicator));
83822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mNewSS.setCdmaEriIconMode(mPhone.mEriManager.getCdmaEriIconMode(roamingIndicator,
8390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mDefaultRoamingIndicator));
8400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // NOTE: Some operator may require overriding mCdmaRoaming
8420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // (set by the modem), depending on the mRoamingIndicator.
8430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) {
84522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                log("Set CDMA Roaming Indicator to: " + mNewSS.getCdmaRoamingIndicator()
8460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + ". mCdmaRoaming = " + mCdmaRoaming + ", isPrlLoaded = " + isPrlLoaded
8470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + ". namMatch = " + namMatch + " , mIsInPrl = " + mIsInPrl
8480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + ", mRoamingIndicator = " + mRoamingIndicator
8490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + ", mDefaultRoamingIndicator= " + mDefaultRoamingIndicator);
8500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
8510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pollStateDone();
8520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
856c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville    protected void setSignalStrengthDefaultValues() {
8575b81adc82a53b3064f4baa3acfeabef31586588aUma Maheswari Ramalingam        mSignalStrength = new SignalStrength( false);
8580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
8610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * A complete "service state" from our perspective is
8620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * composed of a handful of separate requests to the radio.
8630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
8640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * We make all of these requests at once, but then abandon them
8650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * and start over again if the radio notifies us that some
8660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * event has changed
8670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
8680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void
8690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    pollState() {
87022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPollingContext = new int[1];
87122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPollingContext[0] = 0;
8720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
87322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        switch (mCi.getRadioState()) {
8740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case RADIO_UNAVAILABLE:
87522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mNewSS.setStateOutOfService();
87622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mNewCellLoc.setStateInvalid();
8770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            setSignalStrengthDefaultValues();
8780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mGotCountryCode = false;
8790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pollStateDone();
8810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
8820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case RADIO_OFF:
88422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mNewSS.setStateOff();
88522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mNewCellLoc.setStateInvalid();
8860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            setSignalStrengthDefaultValues();
8870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mGotCountryCode = false;
8880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pollStateDone();
8900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
8910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        default:
8930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Issue all poll-related commands at once, then count
8940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // down the responses which are allowed to arrive
8950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // out-of-order.
8960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
89722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPollingContext[0]++;
8980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // RIL_REQUEST_OPERATOR is necessary for CDMA
89922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.getOperator(
90022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    obtainMessage(EVENT_POLL_STATE_OPERATOR_CDMA, mPollingContext));
9010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
90222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPollingContext[0]++;
9030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // RIL_REQUEST_VOICE_REGISTRATION_STATE is necessary for CDMA
90422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.getVoiceRegistrationState(
90522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    obtainMessage(EVENT_POLL_STATE_REGISTRATION_CDMA, mPollingContext));
9060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
90722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPollingContext[0]++;
908f92cb4bd5519427a0db673709d94683a8baf203aWink Saville            // RIL_REQUEST_DATA_REGISTRATION_STATE
90922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.getDataRegistrationState(obtainMessage(EVENT_POLL_STATE_GPRS,
91022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                                        mPollingContext));
9110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
9120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
9130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void fixTimeZone(String isoCountryCode) {
9160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        TimeZone zone = null;
9170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // If the offset is (0, false) and the time zone property
9180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // is set, use the time zone property rather than GMT.
9190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String zoneName = SystemProperties.get(TIMEZONE_PROPERTY);
9200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
9210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("fixTimeZone zoneName='" + zoneName +
9220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                "' mZoneOffset=" + mZoneOffset + " mZoneDst=" + mZoneDst +
9230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                " iso-cc='" + isoCountryCode +
9240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                "' iso-cc-idx=" + Arrays.binarySearch(GMT_COUNTRY_CODES, isoCountryCode));
9250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
9260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if ((mZoneOffset == 0) && (mZoneDst == false) && (zoneName != null)
9270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                && (zoneName.length() > 0)
9280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                && (Arrays.binarySearch(GMT_COUNTRY_CODES, isoCountryCode) < 0)) {
9290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // For NITZ string without time zone,
9300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // need adjust time to reflect default time zone setting
9310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            zone = TimeZone.getDefault();
9320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (mNeedFixZone) {
9330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                long ctm = System.currentTimeMillis();
9340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                long tzOffset = zone.getOffset(ctm);
9350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (DBG) {
9360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    log("fixTimeZone: tzOffset=" + tzOffset +
9370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            " ltod=" + TimeUtils.logTimeOfDay(ctm));
9380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
9390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (getAutoTime()) {
9400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    long adj = ctm - tzOffset;
9410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) log("fixTimeZone: adj ltod=" + TimeUtils.logTimeOfDay(adj));
9420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    setAndBroadcastNetworkSetTime(adj);
9430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
9440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // Adjust the saved NITZ time to account for tzOffset.
9450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mSavedTime = mSavedTime - tzOffset;
9460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) log("fixTimeZone: adj mSavedTime=" + mSavedTime);
9470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
9480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
9490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("fixTimeZone: using default TimeZone");
9500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (isoCountryCode.equals("")) {
9510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Country code not found. This is likely a test network.
9520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Get a TimeZone based only on the NITZ parameters (best guess).
9530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            zone = getNitzTimeZone(mZoneOffset, mZoneDst, mZoneTime);
9540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("fixTimeZone: using NITZ TimeZone");
9550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
9560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            zone = TimeUtils.getTimeZone(mZoneOffset, mZoneDst, mZoneTime, isoCountryCode);
9570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("fixTimeZone: using getTimeZone(off, dst, time, iso)");
9580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
9590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNeedFixZone = false;
9610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (zone != null) {
9630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("fixTimeZone: zone != null zone.getID=" + zone.getID());
9640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (getAutoTimeZone()) {
9650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                setAndBroadcastNetworkSetTimeZone(zone.getID());
9660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
9670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                log("fixTimeZone: skip changing zone as getAutoTimeZone was false");
9680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
9690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            saveNitzTimeZone(zone.getID());
9700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
9710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("fixTimeZone: zone == null, do nothing for zone");
9720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
9730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void pollStateDone() {
97622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (DBG) log("pollStateDone: cdma oldSS=[" + mSS + "] newSS=[" + mNewSS + "]");
9770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
97860ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkey        if (Build.IS_DEBUGGABLE && SystemProperties.getBoolean(PROP_FORCE_ROAMING, false)) {
97960ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkey            mNewSS.setRoaming(true);
98060ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkey        }
98160ced166cb63c35a0ebbee1fc356cddcb76b956fJeff Sharkey
982f1317a4b3492218ac2e449ee990948bac0295b65Wink Saville        useDataRegStateForDataOnlyDevices();
983f1317a4b3492218ac2e449ee990948bac0295b65Wink Saville
9840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean hasRegistered =
98522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mSS.getVoiceRegState() != ServiceState.STATE_IN_SERVICE
98622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            && mNewSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE;
9870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean hasDeregistered =
98922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE
99022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            && mNewSS.getVoiceRegState() != ServiceState.STATE_IN_SERVICE;
9910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean hasCdmaDataConnectionAttached =
99322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mSS.getDataRegState() != ServiceState.STATE_IN_SERVICE
99422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            && mNewSS.getDataRegState() == ServiceState.STATE_IN_SERVICE;
9950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean hasCdmaDataConnectionDetached =
99722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mSS.getDataRegState() == ServiceState.STATE_IN_SERVICE
99822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            && mNewSS.getDataRegState() != ServiceState.STATE_IN_SERVICE;
9990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean hasCdmaDataConnectionChanged =
100122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                       mSS.getDataRegState() != mNewSS.getDataRegState();
10020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1003b54cd09892e0676d719e6df00e60c77b663f993cWink Saville        boolean hasRilVoiceRadioTechnologyChanged =
1004b54cd09892e0676d719e6df00e60c77b663f993cWink Saville                mSS.getRilVoiceRadioTechnology() != mNewSS.getRilVoiceRadioTechnology();
1005b54cd09892e0676d719e6df00e60c77b663f993cWink Saville
1006a0f04ae3f07c686ddbc4d83edf0f1b7d8d1b4a0aWink Saville        boolean hasRilDataRadioTechnologyChanged =
1007a0f04ae3f07c686ddbc4d83edf0f1b7d8d1b4a0aWink Saville                mSS.getRilDataRadioTechnology() != mNewSS.getRilDataRadioTechnology();
10080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
100922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        boolean hasChanged = !mNewSS.equals(mSS);
10100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
101122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        boolean hasRoamingOn = !mSS.getRoaming() && mNewSS.getRoaming();
10120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
101322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        boolean hasRoamingOff = mSS.getRoaming() && !mNewSS.getRoaming();
10140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
101522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        boolean hasLocationChanged = !mNewCellLoc.equals(mCellLoc);
10160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Add an event log when connection state changes
101822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mSS.getVoiceRegState() != mNewSS.getVoiceRegState() ||
101922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSS.getDataRegState() != mNewSS.getDataRegState()) {
10200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            EventLog.writeEvent(EventLogTags.CDMA_SERVICE_STATE_CHANGE,
102122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSS.getVoiceRegState(), mSS.getDataRegState(),
102222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mNewSS.getVoiceRegState(), mNewSS.getDataRegState());
10230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ServiceState tss;
102622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        tss = mSS;
102722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mSS = mNewSS;
102822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mNewSS = tss;
10290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // clean slate for next time
103022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mNewSS.setStateOutOfService();
10310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
103222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        CdmaCellLocation tcl = mCellLoc;
103322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCellLoc = mNewCellLoc;
103422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mNewCellLoc = tcl;
10350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1036b54cd09892e0676d719e6df00e60c77b663f993cWink Saville        if (hasRilVoiceRadioTechnologyChanged) {
1037b54cd09892e0676d719e6df00e60c77b663f993cWink Saville            updatePhoneObject();
1038b54cd09892e0676d719e6df00e60c77b663f993cWink Saville        }
10390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1040a0f04ae3f07c686ddbc4d83edf0f1b7d8d1b4a0aWink Saville        if (hasRilDataRadioTechnologyChanged) {
104122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.setSystemProperty(TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE,
1042a0f04ae3f07c686ddbc4d83edf0f1b7d8d1b4a0aWink Saville                    ServiceState.rilRadioTechnologyToString(mSS.getRilDataRadioTechnology()));
10430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (hasRegistered) {
10460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mNetworkAttachedRegistrants.notifyRegistrants();
10470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (hasChanged) {
105022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if ((mCi.getRadioState().isOn()) && (!mIsSubscriptionFromRuim)) {
10510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String eriText;
10520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Now the CDMAPhone sees the new ServiceState so it can get the new ERI text
105322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE) {
105422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    eriText = mPhone.getCdmaEriText();
10550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
10560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // Note that ServiceState.STATE_OUT_OF_SERVICE is valid used for
10570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // mRegistrationState 0,2,3 and 4
105822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    eriText = mPhone.getContext().getText(
10590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            com.android.internal.R.string.roamingTextSearching).toString();
10600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
106122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mSS.setOperatorAlphaLong(eriText);
10620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
10630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String operatorNumeric;
10650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
106622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ALPHA,
106722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSS.getOperatorAlphaLong());
10680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String prevOperatorNumeric =
10700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, "");
107122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            operatorNumeric = mSS.getOperatorNumeric();
107222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, operatorNumeric);
10730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (operatorNumeric == null) {
10750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (DBG) log("operatorNumeric is null");
107622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, "");
10770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mGotCountryCode = false;
10780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
10790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String isoCountryCode = "";
10800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String mcc = operatorNumeric.substring(0, 3);
10810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                try{
10820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    isoCountryCode = MccTable.countryCodeForMcc(Integer.parseInt(
10830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            operatorNumeric.substring(0,3)));
10840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } catch ( NumberFormatException ex){
10850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    loge("pollStateDone: countryCodeForMcc error" + ex);
10860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } catch ( StringIndexOutOfBoundsException ex) {
10870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    loge("pollStateDone: countryCodeForMcc error" + ex);
10880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
10890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
109022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY,
10910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        isoCountryCode);
10920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mGotCountryCode = true;
10930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
109422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (shouldFixTimeZoneNow(mPhone, operatorNumeric, prevOperatorNumeric,
10950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        mNeedFixZone)) {
10960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    fixTimeZone(isoCountryCode);
10970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
10980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
10990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
110022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING,
110122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mSS.getRoaming() ? "true" : "false");
11020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            updateSpnDisplay();
110422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyServiceStateChanged(mSS);
11050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (hasCdmaDataConnectionAttached) {
11080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mAttachedRegistrants.notifyRegistrants();
11090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (hasCdmaDataConnectionDetached) {
11120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mDetachedRegistrants.notifyRegistrants();
11130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1115a0f04ae3f07c686ddbc4d83edf0f1b7d8d1b4a0aWink Saville        if (hasCdmaDataConnectionChanged || hasRilDataRadioTechnologyChanged) {
1116203e588e3c42a81aa8a56f595119c181a63b12caWink Saville            notifyDataRegStateRilRadioTechnologyChanged();
111722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyDataConnection(null);
11180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (hasRoamingOn) {
11210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mRoamingOnRegistrants.notifyRegistrants();
11220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (hasRoamingOff) {
11250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mRoamingOffRegistrants.notifyRegistrants();
11260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (hasLocationChanged) {
112922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyLocationChanged();
11300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1131ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        // TODO: Add CdmaCellIdenity updating, see CdmaLteServiceStateTracker.
11320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns a TimeZone object based only on parameters from the NITZ string.
11360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
11370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private TimeZone getNitzTimeZone(int offset, boolean dst, long when) {
11380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        TimeZone guess = findTimeZone(offset, dst, when);
11390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (guess == null) {
11400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Couldn't find a proper timezone.  Perhaps the DST data is wrong.
11410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            guess = findTimeZone(offset, !dst, when);
11420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("getNitzTimeZone returning " + (guess == null ? guess : guess.getID()));
11440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return guess;
11450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private TimeZone findTimeZone(int offset, boolean dst, long when) {
11480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int rawOffset = offset;
11490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (dst) {
11500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            rawOffset -= 3600000;
11510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String[] zones = TimeZone.getAvailableIDs(rawOffset);
11530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        TimeZone guess = null;
11540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Date d = new Date(when);
11550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (String zone : zones) {
11560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            TimeZone tz = TimeZone.getTimeZone(zone);
11570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (tz.getOffset(when) == offset &&
11580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    tz.inDaylightTime(d) == dst) {
11590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                guess = tz;
11600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
11610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return guess;
11650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * TODO: This code is exactly the same as in GsmServiceStateTracker
11690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * and has a TODO to not poll signal strength if screen is off.
11700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * This code should probably be hoisted to the base class so
11710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the fix, when added, works for both.
11720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
11730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void
11740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    queueNextSignalStrengthPoll() {
117522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mDontPollSignalStrength) {
11760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // The radio is telling us about signal strength changes
11770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // we don't have to ask it
11780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
11790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Message msg;
11820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        msg = obtainMessage();
11840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        msg.what = EVENT_POLL_SIGNAL_STRENGTH;
11850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO Don't poll signal strength if screen is off
11870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sendMessageDelayed(msg, POLL_PERIOD_MILLIS);
11880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected int radioTechnologyToDataServiceState(int code) {
11910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int retVal = ServiceState.STATE_OUT_OF_SERVICE;
11920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch(code) {
11930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 0:
11940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 1:
11950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 2:
11960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 3:
11970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 4:
11980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 5:
11990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
12000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 6: // RADIO_TECHNOLOGY_1xRTT
12010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 7: // RADIO_TECHNOLOGY_EVDO_0
12020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 8: // RADIO_TECHNOLOGY_EVDO_A
12030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 12: // RADIO_TECHNOLOGY_EVDO_B
12040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 13: // RADIO_TECHNOLOGY_EHRPD
12050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            retVal = ServiceState.STATE_IN_SERVICE;
12060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
12070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        default:
12080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            loge("radioTechnologyToDataServiceState: Wrong radioTechnology code.");
12090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        break;
12100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
12110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return(retVal);
12120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** code is registration state 0-5 from TS 27.007 7.2 */
12150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected int
12160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    regCodeToServiceState(int code) {
12170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (code) {
12180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 0: // Not searching and not registered
12190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return ServiceState.STATE_OUT_OF_SERVICE;
12200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 1:
12210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return ServiceState.STATE_IN_SERVICE;
12220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 2: // 2 is "searching", fall through
12230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 3: // 3 is "registration denied", fall through
12240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 4: // 4 is "unknown", not valid in current baseband
12250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return ServiceState.STATE_OUT_OF_SERVICE;
12260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case 5:// 5 is "Registered, roaming"
12270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return ServiceState.STATE_IN_SERVICE;
12280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        default:
12300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            loge("regCodeToServiceState: unexpected service state " + code);
12310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ServiceState.STATE_OUT_OF_SERVICE;
12320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
12330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1235cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
12360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getCurrentDataConnectionState() {
123722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mSS.getDataRegState();
12380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * code is registration state 0-5 from TS 27.007 7.2
12420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * returns true if registered roam, false otherwise
12430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
12440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean
12450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    regCodeIsRoaming (int code) {
12460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // 5 is  "in service -- roam"
12470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return 5 == code;
12480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Determine whether a roaming indicator is in the carrier-specified list of ERIs for
12520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * home system
12530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
12540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param roamInd roaming indicator in String
12550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if the roamInd is in the carrier-specified list of ERIs for home network
12560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
12570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean isRoamIndForHomeSystem(String roamInd) {
12580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // retrieve the carrier-specified list of ERIs for home system
12590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String homeRoamIndicators = SystemProperties.get("ro.cdma.homesystem");
12600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!TextUtils.isEmpty(homeRoamIndicators)) {
12620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // searches through the comma-separated list for a match,
12630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // return true if one is found.
12640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            for (String homeRoamInd : homeRoamIndicators.split(",")) {
12650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (homeRoamInd.equals(roamInd)) {
12660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    return true;
12670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
12680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
12690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // no matches found against the list!
12700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return false;
12710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
12720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // no system property found for the roaming indicators for home system
12740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
12750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Set roaming state when cdmaRoaming is true and ons is different from spn
12790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param cdmaRoaming TS 27.007 7.2 CREG registered roaming
12800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param s ServiceState hold current ons
12810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true for roaming state set
12820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
12830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private
12840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean isRoamingBetweenOperators(boolean cdmaRoaming, ServiceState s) {
12850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String spn = SystemProperties.get(TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA, "empty");
12860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // NOTE: in case of RUIM we should completely ignore the ERI data file and
12880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // mOperatorAlphaLong is set from RIL_REQUEST_OPERATOR response 0 (alpha ONS)
12890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String onsl = s.getOperatorAlphaLong();
12900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String onss = s.getOperatorAlphaShort();
12910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean equalsOnsl = onsl != null && spn.equals(onsl);
12930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean equalsOnss = onss != null && spn.equals(onss);
12940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return cdmaRoaming && !(equalsOnsl || equalsOnss);
12960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
13000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * nitzReceiveTime is time_t that the NITZ time was posted
13010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
13020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private
13040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void setTimeFromNITZString (String nitz, long nitzReceiveTime)
13050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    {
13060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // "yy/mm/dd,hh:mm:ss(+/-)tz"
13070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // tz is in number of quarter-hours
13080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        long start = SystemClock.elapsedRealtime();
13100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
13110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("NITZ: " + nitz + "," + nitzReceiveTime +
13120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        " start=" + start + " delay=" + (start - nitzReceiveTime));
13130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
13140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
13160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            /* NITZ time (hour:min:sec) will be in UTC but it supplies the timezone
13170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             * offset as well (which we won't worry about until later) */
13180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
13190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            c.clear();
13210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            c.set(Calendar.DST_OFFSET, 0);
13220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String[] nitzSubs = nitz.split("[/:,+-]");
13240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int year = 2000 + Integer.parseInt(nitzSubs[0]);
13260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            c.set(Calendar.YEAR, year);
13270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // month is 0 based!
13290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int month = Integer.parseInt(nitzSubs[1]) - 1;
13300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            c.set(Calendar.MONTH, month);
13310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int date = Integer.parseInt(nitzSubs[2]);
13330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            c.set(Calendar.DATE, date);
13340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int hour = Integer.parseInt(nitzSubs[3]);
13360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            c.set(Calendar.HOUR, hour);
13370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int minute = Integer.parseInt(nitzSubs[4]);
13390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            c.set(Calendar.MINUTE, minute);
13400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int second = Integer.parseInt(nitzSubs[5]);
13420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            c.set(Calendar.SECOND, second);
13430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean sign = (nitz.indexOf('-') == -1);
13450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int tzOffset = Integer.parseInt(nitzSubs[6]);
13470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int dst = (nitzSubs.length >= 8 ) ? Integer.parseInt(nitzSubs[7])
13490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                              : 0;
13500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // The zone offset received from NITZ is for current local time,
13520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // so DST correction is already applied.  Don't add it again.
13530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            //
13540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // tzOffset += dst * 4;
13550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            //
13560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // We could unapply it if we wanted the raw offset.
13570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            tzOffset = (sign ? 1 : -1) * tzOffset * 15 * 60 * 1000;
13590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            TimeZone    zone = null;
13610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // As a special extension, the Android emulator appends the name of
13630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // the host computer's timezone to the nitz string. this is zoneinfo
13640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // timezone name of the form Area!Location or Area!Location!SubLocation
13650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // so we need to convert the ! into /
13660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (nitzSubs.length >= 9) {
13670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String  tzname = nitzSubs[8].replace('!','/');
13680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                zone = TimeZone.getTimeZone( tzname );
13690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
13700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String iso = SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY);
13720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (zone == null) {
13740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (mGotCountryCode) {
13750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (iso != null && iso.length() > 0) {
13760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        zone = TimeUtils.getTimeZone(tzOffset, dst != 0,
13770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                c.getTimeInMillis(),
13780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                iso);
13790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
13800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // We don't have a valid iso country code.  This is
13810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // most likely because we're on a test network that's
13820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // using a bogus MCC (eg, "001"), so get a TimeZone
13830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // based only on the NITZ parameters.
13840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        zone = getNitzTimeZone(tzOffset, (dst != 0), c.getTimeInMillis());
13850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
13860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
13870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
13880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if ((zone == null) || (mZoneOffset != tzOffset) || (mZoneDst != (dst != 0))){
13900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // We got the time before the country or the zone has changed
13910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // so we don't know how to identify the DST rules yet.  Save
13920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // the information and hope to fix it up later.
13930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mNeedFixZone = true;
13950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mZoneOffset  = tzOffset;
13960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mZoneDst     = dst != 0;
13970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mZoneTime    = c.getTimeInMillis();
13980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
13990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) {
140011b9bd95ff8d436ffb5e01998870102f5a412cf9Robert Greenwalt                log("NITZ: tzOffset=" + tzOffset + " dst=" + dst + " zone=" +
140111b9bd95ff8d436ffb5e01998870102f5a412cf9Robert Greenwalt                        (zone!=null ? zone.getID() : "NULL") +
14020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        " iso=" + iso + " mGotCountryCode=" + mGotCountryCode +
14030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        " mNeedFixZone=" + mNeedFixZone);
14040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
14050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (zone != null) {
14070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (getAutoTimeZone()) {
14080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    setAndBroadcastNetworkSetTimeZone(zone.getID());
14090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
14100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                saveNitzTimeZone(zone.getID());
14110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
14120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String ignore = SystemProperties.get("gsm.ignore-nitz");
14140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (ignore != null && ignore.equals("yes")) {
14150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (DBG) log("NITZ: Not setting clock because gsm.ignore-nitz is set");
14160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return;
14170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
14180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
14200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mWakeLock.acquire();
14210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                /**
14230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                 * Correct the NITZ time by how long its taken to get here.
14240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                 */
14250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                long millisSinceNitzReceived
14260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        = SystemClock.elapsedRealtime() - nitzReceiveTime;
14270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (millisSinceNitzReceived < 0) {
14290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // Sanity check: something is wrong
14300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) {
14310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        log("NITZ: not setting time, clock has rolled "
14320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                        + "backwards since NITZ time was received, "
14330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                        + nitz);
14340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
14350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    return;
14360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
14370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (millisSinceNitzReceived > Integer.MAX_VALUE) {
14390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // If the time is this far off, something is wrong > 24 days!
14400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) {
14410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        log("NITZ: not setting time, processing has taken "
14420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                    + (millisSinceNitzReceived / (1000 * 60 * 60 * 24))
14430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                    + " days");
14440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
14450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    return;
14460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
14470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Note: with range checks above, cast to int is safe
14490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                c.add(Calendar.MILLISECOND, (int)millisSinceNitzReceived);
14500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (getAutoTime()) {
14520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    /**
14530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                     * Update system time automatically
14540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                     */
14550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    long gained = c.getTimeInMillis() - System.currentTimeMillis();
14560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    long timeSinceLastUpdate = SystemClock.elapsedRealtime() - mSavedAtTime;
145722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    int nitzUpdateSpacing = Settings.Global.getInt(mCr,
1458b8d0e5993929ca9ecd29f406ae5f39a3e450e89bJeff Brown                            Settings.Global.NITZ_UPDATE_SPACING, mNitzUpdateSpacing);
145922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    int nitzUpdateDiff = Settings.Global.getInt(mCr,
1460b8d0e5993929ca9ecd29f406ae5f39a3e450e89bJeff Brown                            Settings.Global.NITZ_UPDATE_DIFF, mNitzUpdateDiff);
14610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if ((mSavedAtTime == 0) || (timeSinceLastUpdate > nitzUpdateSpacing)
14630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            || (Math.abs(gained) > nitzUpdateDiff)) {
14640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (DBG) {
14650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            log("NITZ: Auto updating time of day to " + c.getTime()
14660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                + " NITZ receive delay=" + millisSinceNitzReceived
14670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                + "ms gained=" + gained + "ms from " + nitz);
14680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
14690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        setAndBroadcastNetworkSetTime(c.getTimeInMillis());
14710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
14720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (DBG) {
14730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            log("NITZ: ignore, a previous update was "
14740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                + timeSinceLastUpdate + "ms ago and gained=" + gained + "ms");
14750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
14760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        return;
14770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
14780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
14790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                /**
14810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                 * Update properties and save the time we did the update
14820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                 */
14830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (DBG) log("NITZ: update nitz time property");
14840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                SystemProperties.set("gsm.nitz.time", String.valueOf(c.getTimeInMillis()));
14850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mSavedTime = c.getTimeInMillis();
14860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mSavedAtTime = SystemClock.elapsedRealtime();
14870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } finally {
14880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                long end = SystemClock.elapsedRealtime();
14890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (DBG) log("NITZ: end=" + end + " dur=" + (end - start));
14900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mWakeLock.release();
14910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
14920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RuntimeException ex) {
14930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            loge("NITZ: Parsing NITZ time " + nitz + " ex=" + ex);
14940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
14950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean getAutoTime() {
14980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
149922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            return Settings.Global.getInt(mCr, Settings.Global.AUTO_TIME) > 0;
15000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (SettingNotFoundException snfe) {
15010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return true;
15020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
15030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean getAutoTimeZone() {
15060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
150722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            return Settings.Global.getInt(mCr, Settings.Global.AUTO_TIME_ZONE) > 0;
15080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (SettingNotFoundException snfe) {
15090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return true;
15100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
15110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void saveNitzTimeZone(String zoneId) {
15140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSavedTimeZone = zoneId;
15150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Set the timezone and send out a sticky broadcast so the system can
15190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * determine if the timezone was set by the carrier.
15200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
15210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param zoneId timezone set by carrier
15220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
15230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void setAndBroadcastNetworkSetTimeZone(String zoneId) {
15240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("setAndBroadcastNetworkSetTimeZone: setTimeZone=" + zoneId);
15250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AlarmManager alarm =
152622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE);
15270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        alarm.setTimeZone(zoneId);
15280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Intent intent = new Intent(TelephonyIntents.ACTION_NETWORK_SET_TIMEZONE);
15290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
15300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        intent.putExtra("time-zone", zoneId);
153122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.getContext().sendStickyBroadcastAsUser(intent, UserHandle.ALL);
15320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Set the time and Send out a sticky broadcast so the system can determine
15360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * if the time was set by the carrier.
15370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
15380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param time time set by network
15390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
15400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void setAndBroadcastNetworkSetTime(long time) {
15410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("setAndBroadcastNetworkSetTime: time=" + time + "ms");
15420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SystemClock.setCurrentTimeMillis(time);
15430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Intent intent = new Intent(TelephonyIntents.ACTION_NETWORK_SET_TIME);
15440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
15450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        intent.putExtra("time", time);
154622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.getContext().sendStickyBroadcastAsUser(intent, UserHandle.ALL);
15470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void revertToNitzTime() {
155022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (Settings.Global.getInt(mCr, Settings.Global.AUTO_TIME, 0) == 0) {
15510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
15520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
15530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
15540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("revertToNitzTime: mSavedTime=" + mSavedTime + " mSavedAtTime=" + mSavedAtTime);
15550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
15560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mSavedTime != 0 && mSavedAtTime != 0) {
15570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            setAndBroadcastNetworkSetTime(mSavedTime
15580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + (SystemClock.elapsedRealtime() - mSavedAtTime));
15590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
15600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void revertToNitzTimeZone() {
156322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (Settings.Global.getInt(mPhone.getContext().getContentResolver(),
1564069488059d9619a2b8bd070e85d6d657bddcf65aChristopher Tate                Settings.Global.AUTO_TIME_ZONE, 0) == 0) {
15650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
15660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
15670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("revertToNitzTimeZone: tz='" + mSavedTimeZone);
15680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mSavedTimeZone != null) {
15690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            setAndBroadcastNetworkSetTimeZone(mSavedTimeZone);
15700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
15710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected boolean isSidsAllZeros() {
15740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mHomeSystemId != null) {
15750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            for (int i=0; i < mHomeSystemId.length; i++) {
15760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (mHomeSystemId[i] != 0) {
15770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    return false;
15780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
15790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
15800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
15810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return true;
15820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Check whether a specified system ID that matches one of the home system IDs.
15860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
15870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean isHomeSid(int sid) {
15880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mHomeSystemId != null) {
15890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            for (int i=0; i < mHomeSystemId.length; i++) {
15900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (sid == mHomeSystemId[i]) {
15910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    return true;
15920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
15930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
15940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
15950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
15960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if phone is camping on a technology
16000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * that could support voice and data simultaneously.
16010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1602cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isConcurrentVoiceAndDataAllowed() {
16040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Note: it needs to be confirmed which CDMA network types
16050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // can support voice and data calls concurrently.
16060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // For the time-being, the return value will be false.
16070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
16080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getMdnNumber() {
16110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mMdn;
16120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getCdmaMin() {
16150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         return mMin;
16160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Returns null if NV is not yet ready */
16190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getPrlVersion() {
16200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mPrlVersion;
16210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
16240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns IMSI as MCC + MNC + MIN
16250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
16260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    String getImsi() {
16270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO: When RUIM is enabled, IMSI will come from RUIM not build-time props.
16280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String operatorNumeric = SystemProperties.get(
16290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, "");
16300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!TextUtils.isEmpty(operatorNumeric) && getCdmaMin() != null) {
16320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return (operatorNumeric + getCdmaMin());
16330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
16340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return null;
16350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
16360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
16390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Check if subscription data has been assigned to mMin
16400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
16410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * return true if MIN info is ready; false otherwise.
16420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
16430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isMinInfoReady() {
16440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mIsMinInfoReady;
16450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
16480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns OTASP_UNKNOWN, OTASP_NEEDED or OTASP_NOT_NEEDED
16490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
16500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    int getOtasp() {
16510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int provisioningState;
16520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mMin == null || (mMin.length() < 6)) {
16530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("getOtasp: bad mMin='" + mMin + "'");
16540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            provisioningState = OTASP_UNKNOWN;
16550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
16560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if ((mMin.equals(UNACTIVATED_MIN_VALUE)
16570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    || mMin.substring(0,6).equals(UNACTIVATED_MIN2_VALUE))
16580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    || SystemProperties.getBoolean("test_cdma_setup", false)) {
16590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                provisioningState = OTASP_NEEDED;
16600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
16610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                provisioningState = OTASP_NOT_NEEDED;
16620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
16630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
16640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("getOtasp: state=" + provisioningState);
16650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return provisioningState;
16660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
16690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void hangupAndPowerOff() {
16700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // hang up all active voice calls
167122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.mCT.mRingingCall.hangupIfAlive();
167222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.mCT.mBackgroundCall.hangupIfAlive();
167322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.mCT.mForegroundCall.hangupIfAlive();
167422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setRadioPower(false, null);
16750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void parseSidNid (String sidStr, String nidStr) {
16780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (sidStr != null) {
16790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String[] sid = sidStr.split(",");
16800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mHomeSystemId = new int[sid.length];
16810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            for (int i = 0; i < sid.length; i++) {
16820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                try {
16830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mHomeSystemId[i] = Integer.parseInt(sid[i]);
16840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } catch (NumberFormatException ex) {
16850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    loge("error parsing system id: " + ex);
16860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
16870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
16880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
16890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("CDMA_SUBSCRIPTION: SID=" + sidStr);
16900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (nidStr != null) {
16920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String[] nid = nidStr.split(",");
16930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mHomeNetworkId = new int[nid.length];
16940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            for (int i = 0; i < nid.length; i++) {
16950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                try {
16960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mHomeNetworkId[i] = Integer.parseInt(nid[i]);
16970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } catch (NumberFormatException ex) {
16980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    loge("CDMA_SUBSCRIPTION: error parsing network id: " + ex);
16990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
17000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
17010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
17020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) log("CDMA_SUBSCRIPTION: NID=" + nidStr);
17030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
17040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
17050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void updateOtaspState() {
17060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int otaspMode = getOtasp();
17070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int oldOtaspMode = mCurrentOtaspMode;
17080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCurrentOtaspMode = otaspMode;
17090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
17100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Notify apps subscription info is ready
171122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mCdmaForSubscriptionInfoReadyRegistrants != null) {
17120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) log("CDMA_SUBSCRIPTION: call notifyRegistrants()");
171322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCdmaForSubscriptionInfoReadyRegistrants.notifyRegistrants();
17140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
17150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (oldOtaspMode != mCurrentOtaspMode) {
17160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) {
17170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                log("CDMA_SUBSCRIPTION: call notifyOtaspChanged old otaspMode=" +
17180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    oldOtaspMode + " new otaspMode=" + mCurrentOtaspMode);
17190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
172022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyOtaspChanged(mCurrentOtaspMode);
17210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
17220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
17230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
17240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1725e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    protected void onUpdateIccAvailability() {
1726e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        if (mUiccController == null ) {
1727e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            return;
1728e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        }
1729e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka
1730e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        UiccCardApplication newUiccApplication =
1731e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccController.getUiccCardApplication(UiccController.APP_FAM_3GPP2);
1732e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka
1733e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (mUiccApplcation != newUiccApplication) {
1734e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (mUiccApplcation != null) {
1735e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                log("Removing stale icc objects.");
1736e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplcation.unregisterForReady(this);
1737e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                if (mIccRecords != null) {
1738e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                    mIccRecords.unregisterForRecordsLoaded(this);
1739e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                }
1740e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                mIccRecords = null;
1741e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplcation = null;
1742e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            }
1743e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (newUiccApplication != null) {
1744e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                log("New card found");
1745e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplcation = newUiccApplication;
1746e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mIccRecords = mUiccApplcation.getIccRecords();
174722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mIsSubscriptionFromRuim) {
1748e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mUiccApplcation.registerForReady(this, EVENT_RUIM_READY, null);
1749e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                    if (mIccRecords != null) {
1750e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                        mIccRecords.registerForRecordsLoaded(this, EVENT_RUIM_RECORDS_LOADED, null);
1751e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                    }
1752e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                }
1753e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            }
1754e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        }
1755e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    }
1756e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka
17570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
17580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void log(String s) {
175999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.d(LOG_TAG, "[CdmaSST] " + s);
17600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
17610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
17620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
17630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void loge(String s) {
176499c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "[CdmaSST] " + s);
17650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
17660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
17670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
17680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
17690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println("CdmaServiceStateTracker extends:");
17700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.dump(fd, pw, args);
177122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mPhone=" + mPhone);
177222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mSS=" + mSS);
177322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mNewSS=" + mNewSS);
177422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mCellLoc=" + mCellLoc);
177522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mNewCellLoc=" + mNewCellLoc);
17760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mCurrentOtaspMode=" + mCurrentOtaspMode);
17770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mCdmaRoaming=" + mCdmaRoaming);
17780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mRoamingIndicator=" + mRoamingIndicator);
17790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mIsInPrl=" + mIsInPrl);
17800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mDefaultRoamingIndicator=" + mDefaultRoamingIndicator);
17810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mRegistrationState=" + mRegistrationState);
17820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mNeedFixZone=" + mNeedFixZone);
17830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mZoneOffset=" + mZoneOffset);
17840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mZoneDst=" + mZoneDst);
17850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mZoneTime=" + mZoneTime);
17860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mGotCountryCode=" + mGotCountryCode);
17870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mSavedTimeZone=" + mSavedTimeZone);
17880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mSavedTime=" + mSavedTime);
17890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mSavedAtTime=" + mSavedAtTime);
17900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mWakeLock=" + mWakeLock);
17910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mCurPlmn=" + mCurPlmn);
17920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mMdn=" + mMdn);
17930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mHomeSystemId=" + mHomeSystemId);
17940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mHomeNetworkId=" + mHomeNetworkId);
17950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mMin=" + mMin);
17960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mPrlVersion=" + mPrlVersion);
17970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mIsMinInfoReady=" + mIsMinInfoReady);
179822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mIsEriTextLoaded=" + mIsEriTextLoaded);
179922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mIsSubscriptionFromRuim=" + mIsSubscriptionFromRuim);
18000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mCdmaSSM=" + mCdmaSSM);
18010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mRegistrationDeniedReason=" + mRegistrationDeniedReason);
180222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mCurrentCarrier=" + mCurrentCarrier);
18030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
18040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
1805