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