CdmaServiceStateTracker.java revision 5b81adc82a53b3064f4baa3acfeabef31586588a
1c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/* 2c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Copyright (C) 2008 The Android Open Source Project 3c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 4c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * you may not use this file except in compliance with the License. 6c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * You may obtain a copy of the License at 7c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 8c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * http://www.apache.org/licenses/LICENSE-2.0 9c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 10c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Unless required by applicable law or agreed to in writing, software 11c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See the License for the specific language governing permissions and 14c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * limitations under the License. 15c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 16c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 17c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepackage com.android.internal.telephony.cdma; 18c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 19c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.CommandException; 20c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.CommandsInterface; 21c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.DataConnectionTracker; 22c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.EventLogTags; 23c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.IccCard; 24c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.IccCardConstants; 25c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.MccTable; 26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.PhoneConstants; 27c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.RILConstants; 28c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.Phone; 29c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.ServiceStateTracker; 30c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.TelephonyIntents; 31c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.TelephonyProperties; 32c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.CommandsInterface.RadioState; 33c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 34c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.app.AlarmManager; 35c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.ContentResolver; 36c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.Context; 37c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.Intent; 38c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.database.ContentObserver; 39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.AsyncResult; 40c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Handler; 41c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Message; 42c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.PowerManager; 43c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Registrant; 44c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.RegistrantList; 45c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.SystemClock; 46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.SystemProperties; 47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.provider.Settings; 48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.provider.Settings.Secure; 49c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.provider.Settings.SettingNotFoundException; 50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.ServiceState; 51c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.SignalStrength; 52c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.cdma.CdmaCellLocation; 53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.text.TextUtils; 54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.util.EventLog; 55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.util.Log; 56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.util.TimeUtils; 57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.io.FileDescriptor; 59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.io.PrintWriter; 60c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.Arrays; 61c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.Calendar; 62c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.Date; 63c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.TimeZone; 64c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 65c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/** 66c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide} 67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 68c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic class CdmaServiceStateTracker extends ServiceStateTracker { 69c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final String LOG_TAG = "CDMA"; 70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville CDMAPhone phone; 72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville CdmaCellLocation cellLoc; 73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville CdmaCellLocation newCellLoc; 74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 75c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Min values used to by getOtasp() 76c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final String UNACTIVATED_MIN2_VALUE = "000000"; 77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final String UNACTIVATED_MIN_VALUE = "1111110111"; 78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Current Otasp value 80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int mCurrentOtaspMode = OTASP_UNINITIALIZED; 81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** if time between NITZ updates is less than mNitzUpdateSpacing the update may be ignored. */ 83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int NITZ_UPDATE_SPACING_DEFAULT = 1000 * 60 * 10; 84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private int mNitzUpdateSpacing = SystemProperties.getInt("ro.nitz_update_spacing", 85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville NITZ_UPDATE_SPACING_DEFAULT); 86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** If mNitzUpdateSpacing hasn't been exceeded but update is > mNitzUpdate do the update */ 88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int NITZ_UPDATE_DIFF_DEFAULT = 2000; 89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private int mNitzUpdateDiff = SystemProperties.getInt("ro.nitz_update_diff", 90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville NITZ_UPDATE_DIFF_DEFAULT); 91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean mCdmaRoaming = false; 93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private int mRoamingIndicator; 94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean mIsInPrl; 95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private int mDefaultRoamingIndicator; 96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Initially assume no data connection. 99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected int mDataConnectionState = ServiceState.STATE_OUT_OF_SERVICE; 101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected int mNewDataConnectionState = ServiceState.STATE_OUT_OF_SERVICE; 102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected int mRegistrationState = -1; 103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected RegistrantList cdmaForSubscriptionInfoReadyRegistrants = new RegistrantList(); 104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Sometimes we get the NITZ time before we know what country we 107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * are in. Keep the time zone information from the NITZ string so 108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * we can fix the time zone once know the country. 109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected boolean mNeedFixZone = false; 111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private int mZoneOffset; 112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean mZoneDst; 113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private long mZoneTime; 114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected boolean mGotCountryCode = false; 115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String mSavedTimeZone; 116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long mSavedTime; 117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long mSavedAtTime; 118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * We can't register for SIM_RECORDS_LOADED immediately because the 121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * SIMRecords object may not be instantiated yet. 122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean mNeedToRegForRuimLoaded = false; 124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Wake lock used while setting time of day. */ 126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private PowerManager.WakeLock mWakeLock; 127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final String WAKELOCK_TAG = "ServiceStateTracker"; 128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Contains the name of the registered network in CDMA (either ONS or ERI text). */ 130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected String mCurPlmn = null; 131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected String mMdn; 133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected int mHomeSystemId[] = null; 134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected int mHomeNetworkId[] = null; 135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected String mMin; 136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected String mPrlVersion; 137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected boolean mIsMinInfoReady = false; 138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean isEriTextLoaded = false; 140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected boolean isSubscriptionFromRuim = false; 141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private CdmaSubscriptionSourceManager mCdmaSSM; 142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* Used only for debugging purposes. */ 144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private String mRegistrationDeniedReason; 145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private ContentResolver cr; 147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private String currentCarrier = null; 148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private ContentObserver mAutoTimeObserver = new ContentObserver(new Handler()) { 150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void onChange(boolean selfChange) { 152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Auto time state changed"); 153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville revertToNitzTime(); 154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville }; 156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private ContentObserver mAutoTimeZoneObserver = new ContentObserver(new Handler()) { 158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void onChange(boolean selfChange) { 160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Auto time zone state changed"); 161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville revertToNitzTimeZone(); 162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville }; 164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public CdmaServiceStateTracker(CDMAPhone phone) { 166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville super(); 167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville this.phone = phone; 169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cr = phone.getContext().getContentResolver(); 170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm = phone.mCM; 171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ss = new ServiceState(); 172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS = new ServiceState(); 173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cellLoc = new CdmaCellLocation(); 174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newCellLoc = new CdmaCellLocation(); 175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mSignalStrength = new SignalStrength(); 176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCdmaSSM = CdmaSubscriptionSourceManager.getInstance(phone.getContext(), cm, this, 178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED, null); 179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isSubscriptionFromRuim = (mCdmaSSM.getCdmaSubscriptionSource() == 180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_RUIM); 181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville PowerManager powerManager = 183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville (PowerManager)phone.getContext().getSystemService(Context.POWER_SERVICE); 184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_TAG); 185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.registerForRadioStateChanged(this, EVENT_RADIO_STATE_CHANGED, null); 187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.registerForVoiceNetworkStateChanged(this, EVENT_NETWORK_STATE_CHANGED_CDMA, null); 189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.setOnNITZTime(this, EVENT_NITZ_TIME, null); 190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.setOnSignalStrengthUpdate(this, EVENT_SIGNAL_STRENGTH_UPDATE, null); 191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.registerForCdmaPrlChanged(this, EVENT_CDMA_PRL_VERSION_CHANGED, null); 193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.registerForEriFileLoaded(this, EVENT_ERI_FILE_LOADED, null); 194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.registerForCdmaOtaProvision(this,EVENT_OTA_PROVISION_STATUS_CHANGE, null); 195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // System setting property AIRPLANE_MODE_ON is set in Settings. 197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int airplaneMode = Settings.System.getInt(cr, Settings.System.AIRPLANE_MODE_ON, 0); 198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mDesiredPowerState = ! (airplaneMode > 0); 199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cr.registerContentObserver( 201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Settings.System.getUriFor(Settings.System.AUTO_TIME), true, 202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mAutoTimeObserver); 203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cr.registerContentObserver( 204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Settings.System.getUriFor(Settings.System.AUTO_TIME_ZONE), true, 205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mAutoTimeZoneObserver); 206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setSignalStrengthDefaultValues(); 207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNeedToRegForRuimLoaded = true; 209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dispose() { 212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Unregister for all events. 213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.unregisterForRadioStateChanged(this); 214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.unregisterForVoiceNetworkStateChanged(this); 215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.getIccCard().unregisterForReady(this); 216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.unregisterForCdmaOtaProvision(this); 217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.unregisterForEriFileLoaded(this); 218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.mIccRecords.unregisterForRecordsLoaded(this); 219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.unSetOnSignalStrengthUpdate(this); 220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.unSetOnNITZTime(this); 221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cr.unregisterContentObserver(mAutoTimeObserver); 222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cr.unregisterContentObserver(mAutoTimeZoneObserver); 223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCdmaSSM.dispose(this); 224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.unregisterForCdmaPrlChanged(this); 225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void finalize() { 229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("CdmaServiceStateTracker finalized"); 230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Registration point for subscription info ready 234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param h handler to notify 235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param what what code of message when delivered 236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param obj placed in Message.obj 237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void registerForSubscriptionInfoReady(Handler h, int what, Object obj) { 239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Registrant r = new Registrant(h, what, obj); 240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cdmaForSubscriptionInfoReadyRegistrants.add(r); 241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (isMinInfoReady()) { 243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville r.notifyRegistrant(); 244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void unregisterForSubscriptionInfoReady(Handler h) { 248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cdmaForSubscriptionInfoReadyRegistrants.remove(h); 249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Save current source of cdma subscription 253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param source - 1 for NV, 0 for RUIM 254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void saveCdmaSubscriptionSource(int source) { 256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("Storing cdma subscription source: " + source); 257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Secure.putInt(phone.getContext().getContentResolver(), 258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Secure.CDMA_SUBSCRIPTION_MODE, 259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville source ); 260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void getSubscriptionInfoAndStartPollingThreads() { 263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.getCDMASubscription(obtainMessage(EVENT_POLL_STATE_CDMA_SUBSCRIPTION)); 264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Get Registration Information 266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pollState(); 267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void handleMessage (Message msg) { 271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult ar; 272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int[] ints; 273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String[] strings; 274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!phone.mIsTheCurrentActivePhone) { 276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("Received message " + msg + "[" + msg.what + "]" + 277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville " while being destroyed. Ignoring."); 278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (msg.what) { 282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED: 283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleCdmaSubscriptionSource(mCdmaSSM.getCdmaSubscriptionSource()); 284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_RUIM_READY: 287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // TODO: Consider calling setCurrentPreferredNetworkType as we do in GsmSST. 288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // cm.setCurrentPreferredNetworkType(); 289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The RUIM is now ready i.e if it was locked it has been 291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // unlocked. At this stage, the radio is already powered on. 292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mNeedToRegForRuimLoaded) { 293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.mIccRecords.registerForRecordsLoaded(this, 294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EVENT_RUIM_RECORDS_LOADED, null); 295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNeedToRegForRuimLoaded = false; 296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (phone.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE) { 299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Subscription will be read from SIM I/O 300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Receive EVENT_RUIM_READY"); 301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pollState(); 302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Receive EVENT_RUIM_READY and Send Request getCDMASubscription."); 304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville getSubscriptionInfoAndStartPollingThreads(); 305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.prepareEri(); 307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_NV_READY: 310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // For Non-RUIM phones, the subscription information is stored in 311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Non Volatile. Here when Non-Volatile is ready, we can poll the CDMA 312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // subscription info. 313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville getSubscriptionInfoAndStartPollingThreads(); 314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_RADIO_STATE_CHANGED: 317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if(cm.getRadioState() == RadioState.RADIO_ON) { 318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleCdmaSubscriptionSource(mCdmaSSM.getCdmaSubscriptionSource()); 319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Signal strength polling stops when radio is off. 321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville queueNextSignalStrengthPoll(); 322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // This will do nothing in the 'radio not available' case. 324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPowerStateToDesired(); 325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pollState(); 326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_NETWORK_STATE_CHANGED_CDMA: 329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pollState(); 330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_SIGNAL_STRENGTH: 333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // This callback is called when signal strength is polled 334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // all by itself. 335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!(cm.getRadioState().isOn())) { 337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Polling will continue when radio turns back on. 338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult) msg.obj; 3415b81adc82a53b3064f4baa3acfeabef31586588aUma Maheswari Ramalingam onSignalStrengthResult(ar, phone, false); 342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville queueNextSignalStrengthPoll(); 343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_GET_LOC_DONE_CDMA: 347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult) msg.obj; 348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception == null) { 350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String states[] = (String[])ar.result; 351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int baseStationId = -1; 352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int baseStationLatitude = CdmaCellLocation.INVALID_LAT_LONG; 353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG; 354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int systemId = -1; 355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int networkId = -1; 356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states.length > 9) { 358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[4] != null) { 360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville baseStationId = Integer.parseInt(states[4]); 361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[5] != null) { 363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville baseStationLatitude = Integer.parseInt(states[5]); 364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[6] != null) { 366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville baseStationLongitude = Integer.parseInt(states[6]); 367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Some carriers only return lat-lngs of 0,0 369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (baseStationLatitude == 0 && baseStationLongitude == 0) { 370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville baseStationLatitude = CdmaCellLocation.INVALID_LAT_LONG; 371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG; 372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[8] != null) { 374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville systemId = Integer.parseInt(states[8]); 375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[9] != null) { 377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville networkId = Integer.parseInt(states[9]); 378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (NumberFormatException ex) { 380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("error parsing cell location data: " + ex); 381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cellLoc.setCellLocationData(baseStationId, baseStationLatitude, 385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville baseStationLongitude, systemId, networkId); 386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.notifyLocationChanged(); 387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Release any temporary cell lock, which could have been 390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // acquired to allow a single-shot location update. 391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville disableSingleLocationUpdate(); 392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_POLL_STATE_REGISTRATION_CDMA: 395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_POLL_STATE_OPERATOR_CDMA: 396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult) msg.obj; 397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handlePollStateResult(msg.what, ar); 398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_POLL_STATE_CDMA_SUBSCRIPTION: // Handle RIL_CDMA_SUBSCRIPTION 401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult) msg.obj; 402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception == null) { 404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String cdmaSubscription[] = (String[])ar.result; 405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (cdmaSubscription != null && cdmaSubscription.length >= 5) { 406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mMdn = cdmaSubscription[0]; 407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parseSidNid(cdmaSubscription[1], cdmaSubscription[2]); 408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mMin = cdmaSubscription[3]; 410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPrlVersion = cdmaSubscription[4]; 411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("GET_CDMA_SUBSCRIPTION: MDN=" + mMdn); 412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mIsMinInfoReady = true; 414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville updateOtaspState(); 416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.getIccCard().broadcastIccStateChangedIntent( 417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville IccCardConstants.INTENT_VALUE_ICC_IMSI, null); 418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) { 420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("GET_CDMA_SUBSCRIPTION: error parsing cdmaSubscription params num=" 421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + cdmaSubscription.length); 422c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_POLL_SIGNAL_STRENGTH: 428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Just poll signal strength...not part of pollState() 429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.getSignalStrength(obtainMessage(EVENT_GET_SIGNAL_STRENGTH)); 431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 432c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_NITZ_TIME: 434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult) msg.obj; 435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String nitzString = (String)((Object[])ar.result)[0]; 437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long nitzReceiveTime = ((Long)((Object[])ar.result)[1]).longValue(); 438c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setTimeFromNITZString(nitzString, nitzReceiveTime); 440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_SIGNAL_STRENGTH_UPDATE: 443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // This is a notification from CommandsInterface.setOnSignalStrengthUpdate. 444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult) msg.obj; 446c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 447c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The radio is telling us about signal strength changes, 448c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // so we don't have to ask it. 449c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville dontPollSignalStrength = true; 450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 4515b81adc82a53b3064f4baa3acfeabef31586588aUma Maheswari Ramalingam onSignalStrengthResult(ar, phone, false); 452c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 453c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 454c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_RUIM_RECORDS_LOADED: 455c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville updateSpnDisplay(); 456c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_LOCATION_UPDATES_ENABLED: 459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult) msg.obj; 460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 461c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception == null) { 462c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.getVoiceRegistrationState(obtainMessage(EVENT_GET_LOC_DONE_CDMA, null)); 463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 465c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_ERI_FILE_LOADED: 467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Repoll the state once the ERI file has been loaded. 468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("[CdmaServiceStateTracker] ERI file has been loaded, repolling."); 469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pollState(); 470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 471c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_OTA_PROVISION_STATUS_CHANGE: 473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception == null) { 475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ints = (int[]) ar.result; 476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int otaStatus = ints[0]; 477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (otaStatus == Phone.CDMA_OTA_PROVISION_STATUS_COMMITTED 478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville || otaStatus == Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED) { 479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("EVENT_OTA_PROVISION_STATUS_CHANGE: Complete, Reload MDN"); 480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.getCDMASubscription( obtainMessage(EVENT_POLL_STATE_CDMA_SUBSCRIPTION)); 481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_CDMA_PRL_VERSION_CHANGED: 486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar = (AsyncResult)msg.obj; 487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception == null) { 488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ints = (int[]) ar.result; 489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPrlVersion = Integer.toString(ints[0]); 490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville super.handleMessage(msg); 495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 496c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Private Instance Methods 500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void handleCdmaSubscriptionSource(int newSubscriptionSource) { 502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("Subscription Source : " + newSubscriptionSource); 503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isSubscriptionFromRuim = 504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville (newSubscriptionSource == CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_RUIM); 505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville saveCdmaSubscriptionSource(newSubscriptionSource); 506c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!isSubscriptionFromRuim) { 507c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // NV is ready when subscription source is NV 508c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendMessage(obtainMessage(EVENT_NV_READY)); 509c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 510c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.getIccCard().registerForReady(this, EVENT_RUIM_READY, null); 511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 512c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 513c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 514c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 515c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void setPowerStateToDesired() { 516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If we want it on and it's off, turn it on 517c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mDesiredPowerState 518c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && cm.getRadioState() == CommandsInterface.RadioState.RADIO_OFF) { 519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.setRadioPower(true, null); 520c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (!mDesiredPowerState && cm.getRadioState().isOn()) { 521c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville DataConnectionTracker dcTracker = phone.mDataConnectionTracker; 522c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If it's on and available and we want it off gracefully 524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville powerOffRadioSafely(dcTracker); 525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } // Otherwise, we're in the desired state 526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void updateSpnDisplay() { 530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // mOperatorAlphaLong contains the ERI text 531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String plmn = ss.getOperatorAlphaLong(); 532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!TextUtils.equals(plmn, mCurPlmn)) { 533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Allow A blank plmn, "" to set showPlmn to true. Previously, we 534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // would set showPlmn to true only if plmn was not empty, i.e. was not 535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // null and not blank. But this would cause us to incorrectly display 536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // "No Service". Now showPlmn is set to true for any non null string. 537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean showPlmn = plmn != null; 538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) { 539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log(String.format("updateSpnDisplay: changed sending intent" + 540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville " showPlmn='%b' plmn='%s'", showPlmn, plmn)); 541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Intent intent = new Intent(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION); 543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville intent.putExtra(TelephonyIntents.EXTRA_SHOW_SPN, false); 545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville intent.putExtra(TelephonyIntents.EXTRA_SPN, ""); 546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville intent.putExtra(TelephonyIntents.EXTRA_SHOW_PLMN, showPlmn); 547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville intent.putExtra(TelephonyIntents.EXTRA_PLMN, plmn); 548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.getContext().sendStickyBroadcast(intent); 549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCurPlmn = plmn; 552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected Phone getPhone() { 556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return phone; 557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 560c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Determine data network type based on radio technology. 561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void setCdmaTechnology(int radioTech){ 563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNewDataConnectionState = radioTechnologyToDataServiceState(radioTech); 564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setRadioTechnology(radioTech); 565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNewRilRadioTechnology = radioTech; 566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Hanlde the PollStateResult message 570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void handlePollStateResultMessage(int what, AsyncResult ar){ 572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int ints[]; 573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String states[]; 574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (what) { 575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_POLL_STATE_REGISTRATION_CDMA: // Handle RIL_REQUEST_REGISTRATION_STATE. 576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville states = (String[])ar.result; 577c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int registrationState = 4; //[0] registrationState 579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int radioTechnology = -1; //[3] radioTechnology 580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int baseStationId = -1; //[4] baseStationId 581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //[5] baseStationLatitude 582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int baseStationLatitude = CdmaCellLocation.INVALID_LAT_LONG; 583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //[6] baseStationLongitude 584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG; 585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int cssIndicator = 0; //[7] init with 0, because it is treated as a boolean 586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int systemId = 0; //[8] systemId 587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int networkId = 0; //[9] networkId 588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int roamingIndicator = -1; //[10] Roaming indicator 589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int systemIsInPrl = 0; //[11] Indicates if current system is in PRL 590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int defaultRoamingIndicator = 0; //[12] Is default roaming indicator from PRL 591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int reasonForDenial = 0; //[13] Denial reason if registrationState = 3 592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states.length >= 14) { 594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 595c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[0] != null) { 596c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville registrationState = Integer.parseInt(states[0]); 597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[3] != null) { 599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville radioTechnology = Integer.parseInt(states[3]); 600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[4] != null) { 602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville baseStationId = Integer.parseInt(states[4]); 603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[5] != null) { 605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville baseStationLatitude = Integer.parseInt(states[5]); 606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[6] != null) { 608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville baseStationLongitude = Integer.parseInt(states[6]); 609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Some carriers only return lat-lngs of 0,0 611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (baseStationLatitude == 0 && baseStationLongitude == 0) { 612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville baseStationLatitude = CdmaCellLocation.INVALID_LAT_LONG; 613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville baseStationLongitude = CdmaCellLocation.INVALID_LAT_LONG; 614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[7] != null) { 616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cssIndicator = Integer.parseInt(states[7]); 617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[8] != null) { 619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville systemId = Integer.parseInt(states[8]); 620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[9] != null) { 622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville networkId = Integer.parseInt(states[9]); 623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[10] != null) { 625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville roamingIndicator = Integer.parseInt(states[10]); 626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[11] != null) { 628c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville systemIsInPrl = Integer.parseInt(states[11]); 629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[12] != null) { 631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville defaultRoamingIndicator = Integer.parseInt(states[12]); 632c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 633c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (states[13] != null) { 634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville reasonForDenial = Integer.parseInt(states[13]); 635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (NumberFormatException ex) { 637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("EVENT_POLL_STATE_REGISTRATION_CDMA: error parsing: " + ex); 638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new RuntimeException("Warning! Wrong number of parameters returned from " 641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "RIL_REQUEST_REGISTRATION_STATE: expected 14 or more " 642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "strings and got " + states.length + " strings"); 643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRegistrationState = registrationState; 646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // When registration state is roaming and TSB58 647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // roaming indicator is not in the carrier-specified 648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // list of ERIs for home system, mCdmaRoaming is true. 649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCdmaRoaming = 650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville regCodeIsRoaming(registrationState) && !isRoamIndForHomeSystem(states[10]); 651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setState (regCodeToServiceState(registrationState)); 652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setCdmaTechnology(radioTechnology); 654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setCssIndicator(cssIndicator); 656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setSystemAndNetworkId(systemId, networkId); 657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRoamingIndicator = roamingIndicator; 658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mIsInPrl = (systemIsInPrl == 0) ? false : true; 659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mDefaultRoamingIndicator = defaultRoamingIndicator; 660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Values are -1 if not available. 663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newCellLoc.setCellLocationData(baseStationId, baseStationLatitude, 664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville baseStationLongitude, systemId, networkId); 665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (reasonForDenial == 0) { 667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRegistrationDeniedReason = ServiceStateTracker.REGISTRATION_DENIED_GEN; 668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (reasonForDenial == 1) { 669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRegistrationDeniedReason = ServiceStateTracker.REGISTRATION_DENIED_AUTH; 670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRegistrationDeniedReason = ""; 672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mRegistrationState == 3) { 675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("Registration denied, " + mRegistrationDeniedReason); 676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_POLL_STATE_OPERATOR_CDMA: // Handle RIL_REQUEST_OPERATOR 680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String opNames[] = (String[])ar.result; 681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (opNames != null && opNames.length >= 3) { 683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If the NUMERIC field isn't valid use PROPERTY_CDMA_HOME_OPERATOR_NUMERIC 684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if ((opNames[2] == null) || (opNames[2].length() < 5) 685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville || ("00000".equals(opNames[2]))) { 686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville opNames[2] = SystemProperties.get( 687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC, "00000"); 688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) { 689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("RIL_REQUEST_OPERATOR.response[2], the numeric, " + 690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville " is bad. Using SystemProperties '" + 691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC + 692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "'= " + opNames[2]); 693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!isSubscriptionFromRuim) { 697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // In CDMA in case on NV, the ss.mOperatorAlphaLong is set later with the 698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ERI text, so here it is ignored what is coming from the modem. 699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setOperatorName(null, opNames[1], opNames[2]); 700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setOperatorName(opNames[0], opNames[1], opNames[2]); 702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("EVENT_POLL_STATE_OPERATOR_CDMA: error parsing opNames"); 705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("handlePollStateResultMessage: RIL response handle in wrong phone!" 709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + " Expected CDMA RIL request and get GSM RIL request."); 710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Handle the result of one of the pollState() - related requests 716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 718c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void handlePollStateResult(int what, AsyncResult ar) { 719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Ignore stale requests from last poll. 720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.userObj != pollingContext) return; 721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 722c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception != null) { 723c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville CommandException.Error err=null; 724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ar.exception instanceof CommandException) { 726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville err = ((CommandException)(ar.exception)).getCommandError(); 727c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 728c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 729c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (err == CommandException.Error.RADIO_NOT_AVAILABLE) { 730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Radio has crashed or turned off. 731c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cancelPollState(); 732c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 733c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 734c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 735c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!cm.getRadioState().isOn()) { 736c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Radio has crashed or turned off. 737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cancelPollState(); 738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 740c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 741c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (err != CommandException.Error.OP_NOT_ALLOWED_BEFORE_REG_NW) { 742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("handlePollStateResult: RIL returned an error where it must succeed" 743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + ar.exception); 744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else try { 746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handlePollStateResultMessage(what, ar); 747c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (RuntimeException ex) { 748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("handlePollStateResult: Exception while polling service state. " 749c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "Probably malformed RIL response." + ex); 750c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 751c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 752c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pollingContext[0]--; 753c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 754c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (pollingContext[0] == 0) { 755c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean namMatch = false; 756c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!isSidsAllZeros() && isHomeSid(newSS.getSystemId())) { 757c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville namMatch = true; 758c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 759c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 760c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Setting SS Roaming (general) 761c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (isSubscriptionFromRuim) { 762c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setRoaming(isRoamingBetweenOperators(mCdmaRoaming, newSS)); 763c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 764c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setRoaming(mCdmaRoaming); 765c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 766c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 767c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Setting SS CdmaRoamingIndicator and CdmaDefaultRoamingIndicator 768c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setCdmaDefaultRoamingIndicator(mDefaultRoamingIndicator); 769c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setCdmaRoamingIndicator(mRoamingIndicator); 770c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean isPrlLoaded = true; 771c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (TextUtils.isEmpty(mPrlVersion)) { 772c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isPrlLoaded = false; 773c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 774c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!isPrlLoaded) { 775c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setCdmaRoamingIndicator(EriInfo.ROAMING_INDICATOR_OFF); 776c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (!isSidsAllZeros()) { 777c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!namMatch && !mIsInPrl) { 778c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Use default 779c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setCdmaRoamingIndicator(mDefaultRoamingIndicator); 780c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (namMatch && !mIsInPrl) { 781c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setCdmaRoamingIndicator(EriInfo.ROAMING_INDICATOR_FLASH); 782c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (!namMatch && mIsInPrl) { 783c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Use the one from PRL/ERI 784c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setCdmaRoamingIndicator(mRoamingIndicator); 785c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 786c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // It means namMatch && mIsInPrl 787c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if ((mRoamingIndicator <= 2)) { 788c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setCdmaRoamingIndicator(EriInfo.ROAMING_INDICATOR_OFF); 789c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 790c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Use the one from PRL/ERI 791c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setCdmaRoamingIndicator(mRoamingIndicator); 792c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 793c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 794c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 795c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 796c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int roamingIndicator = newSS.getCdmaRoamingIndicator(); 797c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setCdmaEriIconIndex(phone.mEriManager.getCdmaEriIconIndex(roamingIndicator, 798c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mDefaultRoamingIndicator)); 799c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setCdmaEriIconMode(phone.mEriManager.getCdmaEriIconMode(roamingIndicator, 800c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mDefaultRoamingIndicator)); 801c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 802c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // NOTE: Some operator may require overriding mCdmaRoaming 803c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // (set by the modem), depending on the mRoamingIndicator. 804c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 805c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) { 806c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("Set CDMA Roaming Indicator to: " + newSS.getCdmaRoamingIndicator() 807c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + ". mCdmaRoaming = " + mCdmaRoaming + ", isPrlLoaded = " + isPrlLoaded 808c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + ". namMatch = " + namMatch + " , mIsInPrl = " + mIsInPrl 809c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + ", mRoamingIndicator = " + mRoamingIndicator 810c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + ", mDefaultRoamingIndicator= " + mDefaultRoamingIndicator); 811c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 812c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pollStateDone(); 813c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 814c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 815c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 816c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 817c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void setSignalStrengthDefaultValues() { 8185b81adc82a53b3064f4baa3acfeabef31586588aUma Maheswari Ramalingam mSignalStrength = new SignalStrength( false); 819c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 820c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 821c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 822c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * A complete "service state" from our perspective is 823c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * composed of a handful of separate requests to the radio. 824c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 825c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * We make all of these requests at once, but then abandon them 826c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and start over again if the radio notifies us that some 827c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * event has changed 828c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 829c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void 830c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pollState() { 831c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pollingContext = new int[1]; 832c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pollingContext[0] = 0; 833c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 834c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (cm.getRadioState()) { 835c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case RADIO_UNAVAILABLE: 836c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setStateOutOfService(); 837c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newCellLoc.setStateInvalid(); 838c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setSignalStrengthDefaultValues(); 839c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mGotCountryCode = false; 840c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 841c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pollStateDone(); 842c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 843c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 844c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case RADIO_OFF: 845c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setStateOff(); 846c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newCellLoc.setStateInvalid(); 847c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setSignalStrengthDefaultValues(); 848c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mGotCountryCode = false; 849c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 850c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pollStateDone(); 851c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 852c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 853c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 854c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Issue all poll-related commands at once, then count 855c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // down the responses which are allowed to arrive 856c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // out-of-order. 857c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 858c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pollingContext[0]++; 859c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // RIL_REQUEST_OPERATOR is necessary for CDMA 860c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.getOperator( 861c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_POLL_STATE_OPERATOR_CDMA, pollingContext)); 862c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 863c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pollingContext[0]++; 864c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // RIL_REQUEST_VOICE_REGISTRATION_STATE is necessary for CDMA 865c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.getVoiceRegistrationState( 866c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville obtainMessage(EVENT_POLL_STATE_REGISTRATION_CDMA, pollingContext)); 867c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 868c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 869c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 870c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 871c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 872c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void fixTimeZone(String isoCountryCode) { 873c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville TimeZone zone = null; 874c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If the offset is (0, false) and the time zone property 875c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // is set, use the time zone property rather than GMT. 876c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String zoneName = SystemProperties.get(TIMEZONE_PROPERTY); 877c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) { 878c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("fixTimeZone zoneName='" + zoneName + 879c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "' mZoneOffset=" + mZoneOffset + " mZoneDst=" + mZoneDst + 880c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville " iso-cc='" + isoCountryCode + 881c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "' iso-cc-idx=" + Arrays.binarySearch(GMT_COUNTRY_CODES, isoCountryCode)); 882c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 883c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if ((mZoneOffset == 0) && (mZoneDst == false) && (zoneName != null) 884c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && (zoneName.length() > 0) 885c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && (Arrays.binarySearch(GMT_COUNTRY_CODES, isoCountryCode) < 0)) { 886c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // For NITZ string without time zone, 887c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // need adjust time to reflect default time zone setting 888c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville zone = TimeZone.getDefault(); 889c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mNeedFixZone) { 890c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long ctm = System.currentTimeMillis(); 891c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long tzOffset = zone.getOffset(ctm); 892c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) { 893c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("fixTimeZone: tzOffset=" + tzOffset + 894c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville " ltod=" + TimeUtils.logTimeOfDay(ctm)); 895c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 896c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (getAutoTime()) { 897c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long adj = ctm - tzOffset; 898c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("fixTimeZone: adj ltod=" + TimeUtils.logTimeOfDay(adj)); 899c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setAndBroadcastNetworkSetTime(adj); 900c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 901c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Adjust the saved NITZ time to account for tzOffset. 902c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mSavedTime = mSavedTime - tzOffset; 903c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("fixTimeZone: adj mSavedTime=" + mSavedTime); 904c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 905c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 906c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("fixTimeZone: using default TimeZone"); 907c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (isoCountryCode.equals("")) { 908c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Country code not found. This is likely a test network. 909c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Get a TimeZone based only on the NITZ parameters (best guess). 910c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville zone = getNitzTimeZone(mZoneOffset, mZoneDst, mZoneTime); 911c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("fixTimeZone: using NITZ TimeZone"); 912c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 913c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville zone = TimeUtils.getTimeZone(mZoneOffset, mZoneDst, mZoneTime, isoCountryCode); 914c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("fixTimeZone: using getTimeZone(off, dst, time, iso)"); 915c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 916c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 917c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNeedFixZone = false; 918c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 919c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (zone != null) { 920c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("fixTimeZone: zone != null zone.getID=" + zone.getID()); 921c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (getAutoTimeZone()) { 922c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setAndBroadcastNetworkSetTimeZone(zone.getID()); 923c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 924c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("fixTimeZone: skip changing zone as getAutoTimeZone was false"); 925c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 926c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville saveNitzTimeZone(zone.getID()); 927c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 928c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("fixTimeZone: zone == null, do nothing for zone"); 929c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 930c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 931c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 932c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void pollStateDone() { 933c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("pollStateDone: oldSS=[" + ss + "] newSS=[" + newSS + "]"); 934c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 935c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean hasRegistered = 936c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ss.getState() != ServiceState.STATE_IN_SERVICE 937c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && newSS.getState() == ServiceState.STATE_IN_SERVICE; 938c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 939c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean hasDeregistered = 940c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ss.getState() == ServiceState.STATE_IN_SERVICE 941c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && newSS.getState() != ServiceState.STATE_IN_SERVICE; 942c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 943c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean hasCdmaDataConnectionAttached = 944c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mDataConnectionState != ServiceState.STATE_IN_SERVICE 945c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && mNewDataConnectionState == ServiceState.STATE_IN_SERVICE; 946c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 947c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean hasCdmaDataConnectionDetached = 948c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mDataConnectionState == ServiceState.STATE_IN_SERVICE 949c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && mNewDataConnectionState != ServiceState.STATE_IN_SERVICE; 950c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 951c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean hasCdmaDataConnectionChanged = 952c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mDataConnectionState != mNewDataConnectionState; 953c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 954c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean hasRadioTechnologyChanged = mRilRadioTechnology != mNewRilRadioTechnology; 955c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 956c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean hasChanged = !newSS.equals(ss); 957c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 958c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean hasRoamingOn = !ss.getRoaming() && newSS.getRoaming(); 959c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 960c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean hasRoamingOff = ss.getRoaming() && !newSS.getRoaming(); 961c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 962c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean hasLocationChanged = !newCellLoc.equals(cellLoc); 963c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 964c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Add an event log when connection state changes 965c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ss.getState() != newSS.getState() || 966c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mDataConnectionState != mNewDataConnectionState) { 967c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville EventLog.writeEvent(EventLogTags.CDMA_SERVICE_STATE_CHANGE, 968c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ss.getState(), mDataConnectionState, 969c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.getState(), mNewDataConnectionState); 970c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 971c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 972c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ServiceState tss; 973c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville tss = ss; 974c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ss = newSS; 975c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS = tss; 976c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // clean slate for next time 977c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setStateOutOfService(); 978c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 979c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville CdmaCellLocation tcl = cellLoc; 980c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cellLoc = newCellLoc; 981c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newCellLoc = tcl; 982c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 983c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mDataConnectionState = mNewDataConnectionState; 984c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRilRadioTechnology = mNewRilRadioTechnology; 985c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // this new state has been applied - forget it until we get a new new state 986c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNewRilRadioTechnology = 0; 987c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 988c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newSS.setStateOutOfService(); // clean slate for next time 989c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 990c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (hasRadioTechnologyChanged) { 991c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.setSystemProperty(TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE, 992c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ServiceState.rilRadioTechnologyToString(mRilRadioTechnology)); 993c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 994c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 995c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (hasRegistered) { 996c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNetworkAttachedRegistrants.notifyRegistrants(); 997c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 998c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 999c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (hasChanged) { 1000c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if ((cm.getRadioState().isOn()) && (!isSubscriptionFromRuim)) { 1001c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String eriText; 1002c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Now the CDMAPhone sees the new ServiceState so it can get the new ERI text 1003c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ss.getState() == ServiceState.STATE_IN_SERVICE) { 1004c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville eriText = phone.getCdmaEriText(); 1005c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1006c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Note that ServiceState.STATE_OUT_OF_SERVICE is valid used for 1007c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // mRegistrationState 0,2,3 and 4 1008c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville eriText = phone.getContext().getText( 1009c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville com.android.internal.R.string.roamingTextSearching).toString(); 1010c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1011c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ss.setOperatorAlphaLong(eriText); 1012c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1013c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1014c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String operatorNumeric; 1015c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1016c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ALPHA, 1017c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ss.getOperatorAlphaLong()); 1018c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1019c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String prevOperatorNumeric = 1020c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, ""); 1021c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville operatorNumeric = ss.getOperatorNumeric(); 1022c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, operatorNumeric); 1023c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1024c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (operatorNumeric == null) { 1025c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("operatorNumeric is null"); 1026c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, ""); 1027c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mGotCountryCode = false; 1028c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1029c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String isoCountryCode = ""; 1030c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String mcc = operatorNumeric.substring(0, 3); 1031c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try{ 1032c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isoCountryCode = MccTable.countryCodeForMcc(Integer.parseInt( 1033c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville operatorNumeric.substring(0,3))); 1034c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch ( NumberFormatException ex){ 1035c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("pollStateDone: countryCodeForMcc error" + ex); 1036c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch ( StringIndexOutOfBoundsException ex) { 1037c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("pollStateDone: countryCodeForMcc error" + ex); 1038c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1039c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1040c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, 1041c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isoCountryCode); 1042c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mGotCountryCode = true; 1043c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1044c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (shouldFixTimeZoneNow(phone, operatorNumeric, prevOperatorNumeric, 1045c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNeedFixZone)) { 1046c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fixTimeZone(isoCountryCode); 1047c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1048c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1049c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1050c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING, 1051c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ss.getRoaming() ? "true" : "false"); 1052c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1053c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville updateSpnDisplay(); 1054c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.notifyServiceStateChanged(ss); 1055c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1056c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1057c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (hasCdmaDataConnectionAttached) { 1058c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mAttachedRegistrants.notifyRegistrants(); 1059c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1060c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1061c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (hasCdmaDataConnectionDetached) { 1062c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mDetachedRegistrants.notifyRegistrants(); 1063c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1064c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1065c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (hasCdmaDataConnectionChanged || hasRadioTechnologyChanged) { 1066c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.notifyDataConnection(null); 1067c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1068c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1069c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (hasRoamingOn) { 1070c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRoamingOnRegistrants.notifyRegistrants(); 1071c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1072c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1073c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (hasRoamingOff) { 1074c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mRoamingOffRegistrants.notifyRegistrants(); 1075c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1076c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1077c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (hasLocationChanged) { 1078c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.notifyLocationChanged(); 1079c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1080c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1081c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1082c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1083c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Returns a TimeZone object based only on parameters from the NITZ string. 1084c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1085c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private TimeZone getNitzTimeZone(int offset, boolean dst, long when) { 1086c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville TimeZone guess = findTimeZone(offset, dst, when); 1087c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (guess == null) { 1088c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Couldn't find a proper timezone. Perhaps the DST data is wrong. 1089c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville guess = findTimeZone(offset, !dst, when); 1090c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1091c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("getNitzTimeZone returning " + (guess == null ? guess : guess.getID())); 1092c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return guess; 1093c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1094c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1095c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private TimeZone findTimeZone(int offset, boolean dst, long when) { 1096c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int rawOffset = offset; 1097c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (dst) { 1098c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville rawOffset -= 3600000; 1099c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String[] zones = TimeZone.getAvailableIDs(rawOffset); 1101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville TimeZone guess = null; 1102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Date d = new Date(when); 1103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (String zone : zones) { 1104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville TimeZone tz = TimeZone.getTimeZone(zone); 1105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (tz.getOffset(when) == offset && 1106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville tz.inDaylightTime(d) == dst) { 1107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville guess = tz; 1108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return guess; 1113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * TODO: This code is exactly the same as in GsmServiceStateTracker 1117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and has a TODO to not poll signal strength if screen is off. 1118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * This code should probably be hoisted to the base class so 1119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * the fix, when added, works for both. 1120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 1122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville queueNextSignalStrengthPoll() { 1123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (dontPollSignalStrength) { 1124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The radio is telling us about signal strength changes 1125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // we don't have to ask it 1126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message msg; 1130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville msg = obtainMessage(); 1132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville msg.what = EVENT_POLL_SIGNAL_STRENGTH; 1133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // TODO Don't poll signal strength if screen is off 1135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville sendMessageDelayed(msg, POLL_PERIOD_MILLIS); 1136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected int radioTechnologyToDataServiceState(int code) { 1139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int retVal = ServiceState.STATE_OUT_OF_SERVICE; 1140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch(code) { 1141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 0: 1142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 1: 1143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 2: 1144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 3: 1145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 4: 1146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 5: 1147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 6: // RADIO_TECHNOLOGY_1xRTT 1149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 7: // RADIO_TECHNOLOGY_EVDO_0 1150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 8: // RADIO_TECHNOLOGY_EVDO_A 1151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 12: // RADIO_TECHNOLOGY_EVDO_B 1152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 13: // RADIO_TECHNOLOGY_EHRPD 1153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville retVal = ServiceState.STATE_IN_SERVICE; 1154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 1156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("radioTechnologyToDataServiceState: Wrong radioTechnology code."); 1157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return(retVal); 1160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** code is registration state 0-5 from TS 27.007 7.2 */ 1163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected int 1164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville regCodeToServiceState(int code) { 1165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (code) { 1166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 0: // Not searching and not registered 1167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return ServiceState.STATE_OUT_OF_SERVICE; 1168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 1: 1169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return ServiceState.STATE_IN_SERVICE; 1170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 2: // 2 is "searching", fall through 1171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 3: // 3 is "registration denied", fall through 1172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 4: // 4 is "unknown", not valid in current baseband 1173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return ServiceState.STATE_OUT_OF_SERVICE; 1174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case 5:// 5 is "Registered, roaming" 1175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return ServiceState.STATE_IN_SERVICE; 1176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 1178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("regCodeToServiceState: unexpected service state " + code); 1179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return ServiceState.STATE_OUT_OF_SERVICE; 1180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public int getCurrentDataConnectionState() { 1184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mDataConnectionState; 1185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * code is registration state 0-5 from TS 27.007 7.2 1189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * returns true if registered roam, false otherwise 1190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 1192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville regCodeIsRoaming (int code) { 1193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 5 is "in service -- roam" 1194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return 5 == code; 1195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Determine whether a roaming indicator is in the carrier-specified list of ERIs for 1199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * home system 1200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 1201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param roamInd roaming indicator in String 1202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @return true if the roamInd is in the carrier-specified list of ERIs for home network 1203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean isRoamIndForHomeSystem(String roamInd) { 1205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // retrieve the carrier-specified list of ERIs for home system 1206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String homeRoamIndicators = SystemProperties.get("ro.cdma.homesystem"); 1207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!TextUtils.isEmpty(homeRoamIndicators)) { 1209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // searches through the comma-separated list for a match, 1210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // return true if one is found. 1211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (String homeRoamInd : homeRoamIndicators.split(",")) { 1212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (homeRoamInd.equals(roamInd)) { 1213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 1214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // no matches found against the list! 1217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 1218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // no system property found for the roaming indicators for home system 1221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 1222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Set roaming state when cdmaRoaming is true and ons is different from spn 1226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param cdmaRoaming TS 27.007 7.2 CREG registered roaming 1227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param s ServiceState hold current ons 1228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @return true for roaming state set 1229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private 1231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean isRoamingBetweenOperators(boolean cdmaRoaming, ServiceState s) { 1232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String spn = SystemProperties.get(TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA, "empty"); 1233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // NOTE: in case of RUIM we should completely ignore the ERI data file and 1235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // mOperatorAlphaLong is set from RIL_REQUEST_OPERATOR response 0 (alpha ONS) 1236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String onsl = s.getOperatorAlphaLong(); 1237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String onss = s.getOperatorAlphaShort(); 1238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean equalsOnsl = onsl != null && spn.equals(onsl); 1240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean equalsOnss = onss != null && spn.equals(onss); 1241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return cdmaRoaming && !(equalsOnsl || equalsOnss); 1243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * nitzReceiveTime is time_t that the NITZ time was posted 1248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private 1251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void setTimeFromNITZString (String nitz, long nitzReceiveTime) 1252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville { 1253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // "yy/mm/dd,hh:mm:ss(+/-)tz" 1254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // tz is in number of quarter-hours 1255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long start = SystemClock.elapsedRealtime(); 1257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) { 1258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("NITZ: " + nitz + "," + nitzReceiveTime + 1259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville " start=" + start + " delay=" + (start - nitzReceiveTime)); 1260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 1263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* NITZ time (hour:min:sec) will be in UTC but it supplies the timezone 1264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * offset as well (which we won't worry about until later) */ 1265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 1266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c.clear(); 1268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c.set(Calendar.DST_OFFSET, 0); 1269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String[] nitzSubs = nitz.split("[/:,+-]"); 1271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int year = 2000 + Integer.parseInt(nitzSubs[0]); 1273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c.set(Calendar.YEAR, year); 1274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // month is 0 based! 1276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int month = Integer.parseInt(nitzSubs[1]) - 1; 1277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c.set(Calendar.MONTH, month); 1278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int date = Integer.parseInt(nitzSubs[2]); 1280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c.set(Calendar.DATE, date); 1281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int hour = Integer.parseInt(nitzSubs[3]); 1283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c.set(Calendar.HOUR, hour); 1284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int minute = Integer.parseInt(nitzSubs[4]); 1286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c.set(Calendar.MINUTE, minute); 1287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int second = Integer.parseInt(nitzSubs[5]); 1289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c.set(Calendar.SECOND, second); 1290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean sign = (nitz.indexOf('-') == -1); 1292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int tzOffset = Integer.parseInt(nitzSubs[6]); 1294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int dst = (nitzSubs.length >= 8 ) ? Integer.parseInt(nitzSubs[7]) 1296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville : 0; 1297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The zone offset received from NITZ is for current local time, 1299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // so DST correction is already applied. Don't add it again. 1300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 1301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // tzOffset += dst * 4; 1302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 1303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We could unapply it if we wanted the raw offset. 1304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville tzOffset = (sign ? 1 : -1) * tzOffset * 15 * 60 * 1000; 1306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville TimeZone zone = null; 1308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // As a special extension, the Android emulator appends the name of 1310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // the host computer's timezone to the nitz string. this is zoneinfo 1311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // timezone name of the form Area!Location or Area!Location!SubLocation 1312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // so we need to convert the ! into / 1313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (nitzSubs.length >= 9) { 1314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String tzname = nitzSubs[8].replace('!','/'); 1315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville zone = TimeZone.getTimeZone( tzname ); 1316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String iso = SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY); 1319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (zone == null) { 1321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mGotCountryCode) { 1322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (iso != null && iso.length() > 0) { 1323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville zone = TimeUtils.getTimeZone(tzOffset, dst != 0, 1324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c.getTimeInMillis(), 1325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville iso); 1326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We don't have a valid iso country code. This is 1328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // most likely because we're on a test network that's 1329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // using a bogus MCC (eg, "001"), so get a TimeZone 1330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // based only on the NITZ parameters. 1331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville zone = getNitzTimeZone(tzOffset, (dst != 0), c.getTimeInMillis()); 1332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if ((zone == null) || (mZoneOffset != tzOffset) || (mZoneDst != (dst != 0))){ 1337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We got the time before the country or the zone has changed 1338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // so we don't know how to identify the DST rules yet. Save 1339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // the information and hope to fix it up later. 1340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mNeedFixZone = true; 1342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mZoneOffset = tzOffset; 1343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mZoneDst = dst != 0; 1344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mZoneTime = c.getTimeInMillis(); 1345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) { 1347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("NITZ: tzOffset=" + tzOffset + " dst=" + dst + " zone=" + zone.getID() + 1348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville " iso=" + iso + " mGotCountryCode=" + mGotCountryCode + 1349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville " mNeedFixZone=" + mNeedFixZone); 1350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (zone != null) { 1353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (getAutoTimeZone()) { 1354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setAndBroadcastNetworkSetTimeZone(zone.getID()); 1355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville saveNitzTimeZone(zone.getID()); 1357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String ignore = SystemProperties.get("gsm.ignore-nitz"); 1360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (ignore != null && ignore.equals("yes")) { 1361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("NITZ: Not setting clock because gsm.ignore-nitz is set"); 1362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 1366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mWakeLock.acquire(); 1367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Correct the NITZ time by how long its taken to get here. 1370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long millisSinceNitzReceived 1372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville = SystemClock.elapsedRealtime() - nitzReceiveTime; 1373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (millisSinceNitzReceived < 0) { 1375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Sanity check: something is wrong 1376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) { 1377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("NITZ: not setting time, clock has rolled " 1378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "backwards since NITZ time was received, " 1379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + nitz); 1380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (millisSinceNitzReceived > Integer.MAX_VALUE) { 1385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If the time is this far off, something is wrong > 24 days! 1386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) { 1387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("NITZ: not setting time, processing has taken " 1388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + (millisSinceNitzReceived / (1000 * 60 * 60 * 24)) 1389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + " days"); 1390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Note: with range checks above, cast to int is safe 1395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c.add(Calendar.MILLISECOND, (int)millisSinceNitzReceived); 1396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (getAutoTime()) { 1398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Update system time automatically 1400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long gained = c.getTimeInMillis() - System.currentTimeMillis(); 1402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long timeSinceLastUpdate = SystemClock.elapsedRealtime() - mSavedAtTime; 1403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int nitzUpdateSpacing = Settings.Secure.getInt(cr, 1404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Settings.Secure.NITZ_UPDATE_SPACING, mNitzUpdateSpacing); 1405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int nitzUpdateDiff = Settings.Secure.getInt(cr, 1406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Settings.Secure.NITZ_UPDATE_DIFF, mNitzUpdateDiff); 1407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if ((mSavedAtTime == 0) || (timeSinceLastUpdate > nitzUpdateSpacing) 1409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville || (Math.abs(gained) > nitzUpdateDiff)) { 1410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) { 1411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("NITZ: Auto updating time of day to " + c.getTime() 1412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + " NITZ receive delay=" + millisSinceNitzReceived 1413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "ms gained=" + gained + "ms from " + nitz); 1414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setAndBroadcastNetworkSetTime(c.getTimeInMillis()); 1417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) { 1419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("NITZ: ignore, a previous update was " 1420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + timeSinceLastUpdate + "ms ago and gained=" + gained + "ms"); 1421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1422c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Update properties and save the time we did the update 1428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("NITZ: update nitz time property"); 1430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SystemProperties.set("gsm.nitz.time", String.valueOf(c.getTimeInMillis())); 1431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mSavedTime = c.getTimeInMillis(); 1432c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mSavedAtTime = SystemClock.elapsedRealtime(); 1433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } finally { 1434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long end = SystemClock.elapsedRealtime(); 1435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("NITZ: end=" + end + " dur=" + (end - start)); 1436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mWakeLock.release(); 1437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1438c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (RuntimeException ex) { 1439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("NITZ: Parsing NITZ time " + nitz + " ex=" + ex); 1440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean getAutoTime() { 1444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 1445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return Settings.System.getInt(cr, Settings.System.AUTO_TIME) > 0; 1446c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (SettingNotFoundException snfe) { 1447c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 1448c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1449c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1451c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean getAutoTimeZone() { 1452c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 1453c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return Settings.System.getInt(cr, Settings.System.AUTO_TIME_ZONE) > 0; 1454c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (SettingNotFoundException snfe) { 1455c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 1456c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void saveNitzTimeZone(String zoneId) { 1460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mSavedTimeZone = zoneId; 1461c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1462c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Set the timezone and send out a sticky broadcast so the system can 1465c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * determine if the timezone was set by the carrier. 1466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 1467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param zoneId timezone set by carrier 1468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void setAndBroadcastNetworkSetTimeZone(String zoneId) { 1470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("setAndBroadcastNetworkSetTimeZone: setTimeZone=" + zoneId); 1471c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AlarmManager alarm = 1472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville (AlarmManager) phone.getContext().getSystemService(Context.ALARM_SERVICE); 1473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville alarm.setTimeZone(zoneId); 1474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Intent intent = new Intent(TelephonyIntents.ACTION_NETWORK_SET_TIMEZONE); 1475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 1476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville intent.putExtra("time-zone", zoneId); 1477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.getContext().sendStickyBroadcast(intent); 1478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Set the time and Send out a sticky broadcast so the system can determine 1482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * if the time was set by the carrier. 1483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 1484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param time time set by network 1485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void setAndBroadcastNetworkSetTime(long time) { 1487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("setAndBroadcastNetworkSetTime: time=" + time + "ms"); 1488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SystemClock.setCurrentTimeMillis(time); 1489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Intent intent = new Intent(TelephonyIntents.ACTION_NETWORK_SET_TIME); 1490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 1491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville intent.putExtra("time", time); 1492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.getContext().sendStickyBroadcast(intent); 1493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void revertToNitzTime() { 1496c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Settings.System.getInt(cr, Settings.System.AUTO_TIME, 0) == 0) { 1497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) { 1500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("revertToNitzTime: mSavedTime=" + mSavedTime + " mSavedAtTime=" + mSavedAtTime); 1501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mSavedTime != 0 && mSavedAtTime != 0) { 1503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setAndBroadcastNetworkSetTime(mSavedTime 1504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + (SystemClock.elapsedRealtime() - mSavedAtTime)); 1505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1506c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1507c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1508c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void revertToNitzTimeZone() { 1509c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Settings.System.getInt(phone.getContext().getContentResolver(), 1510c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Settings.System.AUTO_TIME_ZONE, 0) == 0) { 1511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 1512c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1513c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("revertToNitzTimeZone: tz='" + mSavedTimeZone); 1514c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mSavedTimeZone != null) { 1515c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setAndBroadcastNetworkSetTimeZone(mSavedTimeZone); 1516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1517c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1518c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected boolean isSidsAllZeros() { 1520c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mHomeSystemId != null) { 1521c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (int i=0; i < mHomeSystemId.length; i++) { 1522c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mHomeSystemId[i] != 0) { 1523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 1524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 1528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Check whether a specified system ID that matches one of the home system IDs. 1532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean isHomeSid(int sid) { 1534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mHomeSystemId != null) { 1535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (int i=0; i < mHomeSystemId.length; i++) { 1536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (sid == mHomeSystemId[i]) { 1537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 1538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 1542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @return true if phone is camping on a technology 1546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * that could support voice and data simultaneously. 1547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public boolean isConcurrentVoiceAndDataAllowed() { 1549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Note: it needs to be confirmed which CDMA network types 1550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // can support voice and data calls concurrently. 1551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // For the time-being, the return value will be false. 1552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 1553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getMdnNumber() { 1556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mMdn; 1557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getCdmaMin() { 1560c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mMin; 1561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Returns null if NV is not yet ready */ 1564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getPrlVersion() { 1565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mPrlVersion; 1566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Returns IMSI as MCC + MNC + MIN 1570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String getImsi() { 1572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // TODO: When RUIM is enabled, IMSI will come from RUIM not build-time props. 1573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String operatorNumeric = SystemProperties.get( 1574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC, ""); 1575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!TextUtils.isEmpty(operatorNumeric) && getCdmaMin() != null) { 1577c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return (operatorNumeric + getCdmaMin()); 1578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return null; 1580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Check if subscription data has been assigned to mMin 1585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 1586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * return true if MIN info is ready; false otherwise. 1587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public boolean isMinInfoReady() { 1589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return mIsMinInfoReady; 1590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 1593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Returns OTASP_UNKNOWN, OTASP_NEEDED or OTASP_NOT_NEEDED 1594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 1595c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int getOtasp() { 1596c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int provisioningState; 1597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mMin == null || (mMin.length() < 6)) { 1598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("getOtasp: bad mMin='" + mMin + "'"); 1599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville provisioningState = OTASP_UNKNOWN; 1600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if ((mMin.equals(UNACTIVATED_MIN_VALUE) 1602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville || mMin.substring(0,6).equals(UNACTIVATED_MIN2_VALUE)) 1603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville || SystemProperties.getBoolean("test_cdma_setup", false)) { 1604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville provisioningState = OTASP_NEEDED; 1605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville provisioningState = OTASP_NOT_NEEDED; 1607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("getOtasp: state=" + provisioningState); 1610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return provisioningState; 1611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 1614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void hangupAndPowerOff() { 1615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // hang up all active voice calls 1616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.mCT.ringingCall.hangupIfAlive(); 1617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.mCT.backgroundCall.hangupIfAlive(); 1618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.mCT.foregroundCall.hangupIfAlive(); 1619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cm.setRadioPower(false, null); 1620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void parseSidNid (String sidStr, String nidStr) { 1623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (sidStr != null) { 1624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String[] sid = sidStr.split(","); 1625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mHomeSystemId = new int[sid.length]; 1626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (int i = 0; i < sid.length; i++) { 1627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 1628c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mHomeSystemId[i] = Integer.parseInt(sid[i]); 1629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (NumberFormatException ex) { 1630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("error parsing system id: " + ex); 1631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1632c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1633c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("CDMA_SUBSCRIPTION: SID=" + sidStr); 1635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (nidStr != null) { 1637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String[] nid = nidStr.split(","); 1638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mHomeNetworkId = new int[nid.length]; 1639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (int i = 0; i < nid.length; i++) { 1640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 1641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mHomeNetworkId[i] = Integer.parseInt(nid[i]); 1642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (NumberFormatException ex) { 1643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville loge("CDMA_SUBSCRIPTION: error parsing network id: " + ex); 1644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("CDMA_SUBSCRIPTION: NID=" + nidStr); 1648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void updateOtaspState() { 1651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int otaspMode = getOtasp(); 1652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int oldOtaspMode = mCurrentOtaspMode; 1653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mCurrentOtaspMode = otaspMode; 1654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Notify apps subscription info is ready 1656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (cdmaForSubscriptionInfoReadyRegistrants != null) { 1657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) log("CDMA_SUBSCRIPTION: call notifyRegistrants()"); 1658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cdmaForSubscriptionInfoReadyRegistrants.notifyRegistrants(); 1659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (oldOtaspMode != mCurrentOtaspMode) { 1661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (DBG) { 1662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("CDMA_SUBSCRIPTION: call notifyOtaspChanged old otaspMode=" + 1663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville oldOtaspMode + " new otaspMode=" + mCurrentOtaspMode); 1664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville phone.notifyOtaspChanged(mCurrentOtaspMode); 1666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 1670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void log(String s) { 1671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Log.d(LOG_TAG, "[CdmaSST] " + s); 1672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 1675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void loge(String s) { 1676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Log.e(LOG_TAG, "[CdmaSST] " + s); 1677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 1680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 1681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println("CdmaServiceStateTracker extends:"); 1682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville super.dump(fd, pw, args); 1683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" phone=" + phone); 1684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" cellLoc=" + cellLoc); 1685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" newCellLoc=" + newCellLoc); 1686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mCurrentOtaspMode=" + mCurrentOtaspMode); 1687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mCdmaRoaming=" + mCdmaRoaming); 1688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mRoamingIndicator=" + mRoamingIndicator); 1689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mIsInPrl=" + mIsInPrl); 1690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mDefaultRoamingIndicator=" + mDefaultRoamingIndicator); 1691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mDataConnectionState=" + mDataConnectionState); 1692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mNewDataConnectionState=" + mNewDataConnectionState); 1693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mRegistrationState=" + mRegistrationState); 1694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mNeedFixZone=" + mNeedFixZone); 1695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mZoneOffset=" + mZoneOffset); 1696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mZoneDst=" + mZoneDst); 1697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mZoneTime=" + mZoneTime); 1698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mGotCountryCode=" + mGotCountryCode); 1699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mSavedTimeZone=" + mSavedTimeZone); 1700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mSavedTime=" + mSavedTime); 1701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mSavedAtTime=" + mSavedAtTime); 1702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mNeedToRegForRuimLoaded=" + mNeedToRegForRuimLoaded); 1703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mWakeLock=" + mWakeLock); 1704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mCurPlmn=" + mCurPlmn); 1705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mMdn=" + mMdn); 1706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mHomeSystemId=" + mHomeSystemId); 1707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mHomeNetworkId=" + mHomeNetworkId); 1708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mMin=" + mMin); 1709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mPrlVersion=" + mPrlVersion); 1710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mIsMinInfoReady=" + mIsMinInfoReady); 1711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" isEriTextLoaded=" + isEriTextLoaded); 1712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" isSubscriptionFromRuim=" + isSubscriptionFromRuim); 1713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mCdmaSSM=" + mCdmaSSM); 1714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" mRegistrationDeniedReason=" + mRegistrationDeniedReason); 1715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville pw.println(" currentCarrier=" + currentCarrier); 1716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 1718