10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 2ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville * Copyright (C) 2012 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony.cdma; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.TelephonyProperties; 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.MccTable; 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.EventLogTags; 2260dc9dc311361f9fb52155ea28d383d55afa90d8Wink Savilleimport com.android.internal.telephony.uicc.RuimRecords; 2360dc9dc311361f9fb52155ea28d383d55afa90d8Wink Savilleimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState; 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 25ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.telephony.CellInfo; 26ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.telephony.CellInfoLte; 27ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.telephony.CellSignalStrengthLte; 28ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.telephony.CellIdentityLte; 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.SignalStrength; 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.ServiceState; 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.cdma.CdmaCellLocation; 32ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.text.TextUtils; 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult; 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message; 35ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.os.SystemClock; 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemProperties; 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3899c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog; 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.EventLog; 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor; 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter; 43ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport java.util.ArrayList; 44ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport java.util.List; 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class CdmaLteServiceStateTracker extends CdmaServiceStateTracker { 47ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville private CDMALTEPhone mCdmaLtePhone; 48ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville private final CellInfoLte mCellInfoLte; 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 50ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville private CellIdentityLte mNewCellIdentityLte = new CellIdentityLte(); 51ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville private CellIdentityLte mLasteCellIdentityLte = new CellIdentityLte(); 52ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public CdmaLteServiceStateTracker(CDMALTEPhone phone) { 54ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville super(phone, new CellInfoLte()); 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCdmaLtePhone = phone; 56ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mCellInfoLte = (CellInfoLte) mCellInfo; 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 58ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville ((CellInfoLte)mCellInfo).setCellSignalStrength(new CellSignalStrengthLte()); 59ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville ((CellInfoLte)mCellInfo).setCellIdentity(new CellIdentityLte()); 60ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("CdmaLteServiceStateTracker Constructors"); 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void handleMessage(Message msg) { 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncResult ar; 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int[] ints; 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String[] strings; 695e2000b856a7959609e8f15148a3584ec372f865Wink Saville 705e2000b856a7959609e8f15148a3584ec372f865Wink Saville if (!mPhone.mIsTheCurrentActivePhone) { 715e2000b856a7959609e8f15148a3584ec372f865Wink Saville loge("Received message " + msg + "[" + msg.what + "]" + 725e2000b856a7959609e8f15148a3584ec372f865Wink Saville " while being destroyed. Ignoring."); 735e2000b856a7959609e8f15148a3584ec372f865Wink Saville return; 745e2000b856a7959609e8f15148a3584ec372f865Wink Saville } 755e2000b856a7959609e8f15148a3584ec372f865Wink Saville 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (msg.what) { 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_POLL_STATE_GPRS: 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("handleMessage EVENT_POLL_STATE_GPRS"); 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar = (AsyncResult)msg.obj; 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville handlePollStateResult(msg.what, ar); 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_RUIM_RECORDS_LOADED: 83b54cd09892e0676d719e6df00e60c77b663f993cWink Saville updatePhoneObject(); 84e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka RuimRecords ruim = (RuimRecords)mIccRecords; 85e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if ((ruim != null) && ruim.isProvisioned()) { 86e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mMdn = ruim.getMdn(); 87e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mMin = ruim.getMin(); 88e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka parseSidNid(ruim.getSid(), ruim.getNid()); 89cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville mPrlVersion = ruim.getPrlVersion(); 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIsMinInfoReady = true; 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville updateOtaspState(); 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // SID/NID/PRL is loaded. Poll service state 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // again to update to the roaming state with 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the latest variables. 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pollState(); 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.handleMessage(msg); 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Handle the result of one of the pollState()-related requests 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void handlePollStateResultMessage(int what, AsyncResult ar) { 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (what == EVENT_POLL_STATE_GPRS) { 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String states[] = (String[])ar.result; 110ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville if (DBG) { 111ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville log("handlePollStateResultMessage: EVENT_POLL_STATE_GPRS states.length=" + 112ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville states.length + " states=" + states); 113ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int type = 0; 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int regState = -1; 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (states.length > 0) { 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville regState = Integer.parseInt(states[0]); 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // states[3] (if present) is the current radio technology 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (states.length >= 4 && states[3] != null) { 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville type = Integer.parseInt(states[3]); 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (NumberFormatException ex) { 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville loge("handlePollStateResultMessage: error parsing GprsRegistrationState: " 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + ex); 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 129ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville if (states.length >= 10) { 130ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville int mcc; 131ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville int mnc; 132ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville int tac; 133ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville int pci; 134ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville int eci; 135ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville int csgid; 136ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville String operatorNumeric = null; 137ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville 138ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville try { 13922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville operatorNumeric = mNewSS.getOperatorNumeric(); 140ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mcc = Integer.parseInt(operatorNumeric.substring(0,3)); 141ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } catch (Exception e) { 142ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville try { 14322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville operatorNumeric = mSS.getOperatorNumeric(); 144ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mcc = Integer.parseInt(operatorNumeric.substring(0,3)); 145ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } catch (Exception ex) { 146ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville loge("handlePollStateResultMessage: bad mcc operatorNumeric=" + 147ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville operatorNumeric + " ex=" + ex); 148ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville operatorNumeric = ""; 149ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mcc = Integer.MAX_VALUE; 150ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 151ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 152ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville try { 153ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mnc = Integer.parseInt(operatorNumeric.substring(3)); 154ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } catch (Exception e) { 155ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville loge("handlePollStateResultMessage: bad mnc operatorNumeric=" + 156ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville operatorNumeric + " e=" + e); 157ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mnc = Integer.MAX_VALUE; 158ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 159859f7a917b27e64fc03ee614152ac37c688307a8Wink Saville 160859f7a917b27e64fc03ee614152ac37c688307a8Wink Saville // Use Integer#decode to be generous in what we receive and allow 161859f7a917b27e64fc03ee614152ac37c688307a8Wink Saville // decimal, hex or octal values. 162ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville try { 163859f7a917b27e64fc03ee614152ac37c688307a8Wink Saville tac = Integer.decode(states[6]); 164ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } catch (Exception e) { 165ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville loge("handlePollStateResultMessage: bad tac states[6]=" + 166ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville states[6] + " e=" + e); 167ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville tac = Integer.MAX_VALUE; 168ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 169ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville try { 170859f7a917b27e64fc03ee614152ac37c688307a8Wink Saville pci = Integer.decode(states[7]); 171ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } catch (Exception e) { 172ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville loge("handlePollStateResultMessage: bad pci states[7]=" + 173ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville states[7] + " e=" + e); 174ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville pci = Integer.MAX_VALUE; 175ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 176ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville try { 177859f7a917b27e64fc03ee614152ac37c688307a8Wink Saville eci = Integer.decode(states[8]); 178ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } catch (Exception e) { 179ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville loge("handlePollStateResultMessage: bad eci states[8]=" + 180ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville states[8] + " e=" + e); 181ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville eci = Integer.MAX_VALUE; 182ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 183ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville try { 184859f7a917b27e64fc03ee614152ac37c688307a8Wink Saville csgid = Integer.decode(states[9]); 185ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } catch (Exception e) { 186ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville // FIX: Always bad so don't pollute the logs 187ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville // loge("handlePollStateResultMessage: bad csgid states[9]=" + 188ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville // states[9] + " e=" + e); 189ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville csgid = Integer.MAX_VALUE; 190ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 191ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mNewCellIdentityLte = new CellIdentityLte(mcc, mnc, eci, pci, tac); 192ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville if (DBG) { 193ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville log("handlePollStateResultMessage: mNewLteCellIdentity=" + 194ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mNewCellIdentityLte); 195ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 196ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 19922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNewSS.setRilDataRadioTechnology(type); 200f92cb4bd5519427a0db673709d94683a8baf203aWink Saville int dataRegState = regCodeToServiceState(regState); 20122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNewSS.setDataRegState(dataRegState); 202f92cb4bd5519427a0db673709d94683a8baf203aWink Saville if (DBG) { 203f92cb4bd5519427a0db673709d94683a8baf203aWink Saville log("handlPollStateResultMessage: CdmaLteSST setDataRegState=" + dataRegState 204f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " regState=" + regState 205f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " dataRadioTechnology=" + type); 206f92cb4bd5519427a0db673709d94683a8baf203aWink Saville } 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.handlePollStateResultMessage(what, ar); 2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void pollState() { 21422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPollingContext = new int[1]; 21522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPollingContext[0] = 0; 2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 21722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville switch (mCi.getRadioState()) { 2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case RADIO_UNAVAILABLE: 21922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNewSS.setStateOutOfService(); 22022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNewCellLoc.setStateInvalid(); 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville setSignalStrengthDefaultValues(); 2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mGotCountryCode = false; 2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pollStateDone(); 2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case RADIO_OFF: 22822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNewSS.setStateOff(); 22922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNewCellLoc.setStateInvalid(); 2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville setSignalStrengthDefaultValues(); 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mGotCountryCode = false; 2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pollStateDone(); 2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Issue all poll-related commands at once, then count 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // down the responses which are allowed to arrive 2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // out-of-order. 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 24122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPollingContext[0]++; 2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // RIL_REQUEST_OPERATOR is necessary for CDMA 24322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.getOperator(obtainMessage(EVENT_POLL_STATE_OPERATOR_CDMA, mPollingContext)); 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 24522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPollingContext[0]++; 2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // RIL_REQUEST_VOICE_REGISTRATION_STATE is necessary for CDMA 24722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.getVoiceRegistrationState(obtainMessage(EVENT_POLL_STATE_REGISTRATION_CDMA, 24822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPollingContext)); 2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 25022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPollingContext[0]++; 251ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville // RIL_REQUEST_DATA_REGISTRATION_STATE 25222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.getDataRegistrationState(obtainMessage(EVENT_POLL_STATE_GPRS, 25322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPollingContext)); 2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void pollStateDone() { 26022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville log("pollStateDone: lte 1 ss=[" + mSS + "] newSS=[" + mNewSS + "]"); 2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 262f1317a4b3492218ac2e449ee990948bac0295b65Wink Saville useDataRegStateForDataOnlyDevices(); 263f1317a4b3492218ac2e449ee990948bac0295b65Wink Saville 26422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville boolean hasRegistered = mSS.getVoiceRegState() != ServiceState.STATE_IN_SERVICE 26522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville && mNewSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE; 2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 26722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville boolean hasDeregistered = mSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE 26822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville && mNewSS.getVoiceRegState() != ServiceState.STATE_IN_SERVICE; 2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasCdmaDataConnectionAttached = 27122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSS.getDataRegState() != ServiceState.STATE_IN_SERVICE 27222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville && mNewSS.getDataRegState() == ServiceState.STATE_IN_SERVICE; 2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasCdmaDataConnectionDetached = 27522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSS.getDataRegState() == ServiceState.STATE_IN_SERVICE 27622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville && mNewSS.getDataRegState() != ServiceState.STATE_IN_SERVICE; 2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasCdmaDataConnectionChanged = 27922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSS.getDataRegState() != mNewSS.getDataRegState(); 280f92cb4bd5519427a0db673709d94683a8baf203aWink Saville 28122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville boolean hasVoiceRadioTechnologyChanged = mSS.getRilVoiceRadioTechnology() 28222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville != mNewSS.getRilVoiceRadioTechnology(); 2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 28422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville boolean hasDataRadioTechnologyChanged = mSS.getRilDataRadioTechnology() 28522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville != mNewSS.getRilDataRadioTechnology(); 2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 28722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville boolean hasChanged = !mNewSS.equals(mSS); 2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 28922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville boolean hasRoamingOn = !mSS.getRoaming() && mNewSS.getRoaming(); 2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 29122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville boolean hasRoamingOff = mSS.getRoaming() && !mNewSS.getRoaming(); 2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 29322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville boolean hasLocationChanged = !mNewCellLoc.equals(mCellLoc); 2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean has4gHandoff = 29622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNewSS.getDataRegState() == ServiceState.STATE_IN_SERVICE && 29722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville (((mSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) && 29822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville (mNewSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD)) || 29922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville ((mSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD) && 30022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville (mNewSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_LTE))); 3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasMultiApnSupport = 30322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville (((mNewSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) || 30422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville (mNewSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD)) && 30522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville ((mSS.getRilDataRadioTechnology() != ServiceState.RIL_RADIO_TECHNOLOGY_LTE) && 30622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville (mSS.getRilDataRadioTechnology() != ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD))); 3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasLostMultiApnSupport = 30922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville ((mNewSS.getRilDataRadioTechnology() >= ServiceState.RIL_RADIO_TECHNOLOGY_IS95A) && 31022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville (mNewSS.getRilDataRadioTechnology() <= ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A)); 3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("pollStateDone:" 3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasRegistered=" + hasRegistered 3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasDeegistered=" + hasDeregistered 3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasCdmaDataConnectionAttached=" + hasCdmaDataConnectionAttached 3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasCdmaDataConnectionDetached=" + hasCdmaDataConnectionDetached 3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasCdmaDataConnectionChanged=" + hasCdmaDataConnectionChanged 319f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " hasVoiceRadioTechnologyChanged= " + hasVoiceRadioTechnologyChanged 320f92cb4bd5519427a0db673709d94683a8baf203aWink Saville + " hasDataRadioTechnologyChanged=" + hasDataRadioTechnologyChanged 3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasChanged=" + hasChanged 3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasRoamingOn=" + hasRoamingOn 3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasRoamingOff=" + hasRoamingOff 3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasLocationChanged=" + hasLocationChanged 3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " has4gHandoff = " + has4gHandoff 3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasMultiApnSupport=" + hasMultiApnSupport 3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasLostMultiApnSupport=" + hasLostMultiApnSupport); 3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Add an event log when connection state changes 33022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mSS.getVoiceRegState() != mNewSS.getVoiceRegState() 33122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mSS.getDataRegState() != mNewSS.getDataRegState()) { 33222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville EventLog.writeEvent(EventLogTags.CDMA_SERVICE_STATE_CHANGE, mSS.getVoiceRegState(), 33322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSS.getDataRegState(), mNewSS.getVoiceRegState(), mNewSS.getDataRegState()); 3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ServiceState tss; 33722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville tss = mSS; 33822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSS = mNewSS; 33922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNewSS = tss; 3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // clean slate for next time 34122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNewSS.setStateOutOfService(); 3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 34322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville CdmaCellLocation tcl = mCellLoc; 34422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCellLoc = mNewCellLoc; 34522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNewCellLoc = tcl; 3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 34722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNewSS.setStateOutOfService(); // clean slate for next time 3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 349b54cd09892e0676d719e6df00e60c77b663f993cWink Saville if (hasVoiceRadioTechnologyChanged) { 350b54cd09892e0676d719e6df00e60c77b663f993cWink Saville updatePhoneObject(); 351b54cd09892e0676d719e6df00e60c77b663f993cWink Saville } 352b54cd09892e0676d719e6df00e60c77b663f993cWink Saville 353a0f04ae3f07c686ddbc4d83edf0f1b7d8d1b4a0aWink Saville if (hasDataRadioTechnologyChanged) { 35422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.setSystemProperty(TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE, 35522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville ServiceState.rilRadioTechnologyToString(mSS.getRilDataRadioTechnology())); 3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasRegistered) { 3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNetworkAttachedRegistrants.notifyRegistrants(); 3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasChanged) { 36322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPhone.isEriFileLoaded()) { 3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String eriText; 3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Now the CDMAPhone sees the new ServiceState so it can get the 3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // new ERI text 36722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE) { 36822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville eriText = mPhone.getCdmaEriText(); 36922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (mSS.getVoiceRegState() == ServiceState.STATE_POWER_OFF) { 370e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka eriText = (mIccRecords != null) ? mIccRecords.getServiceProviderName() : null; 3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (TextUtils.isEmpty(eriText)) { 3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Sets operator alpha property by retrieving from 3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // build-time system property 3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville eriText = SystemProperties.get("ro.cdma.home.operator.alpha"); 3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Note that ServiceState.STATE_OUT_OF_SERVICE is valid used 3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // for mRegistrationState 0,2,3 and 4 37922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville eriText = mPhone.getContext() 3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .getText(com.android.internal.R.string.roamingTextSearching).toString(); 3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 38222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSS.setOperatorAlphaLong(eriText); 3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 385e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplcation != null && mUiccApplcation.getState() == AppState.APPSTATE_READY && 386e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka mIccRecords != null) { 3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // SIM is found on the device. If ERI roaming is OFF, and SID/NID matches 388f92cb4bd5519427a0db673709d94683a8baf203aWink Saville // one configured in SIM, use operator name from CSIM record. 3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean showSpn = 390e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ((RuimRecords)mIccRecords).getCsimSpnDisplayCondition(); 39122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville int iconIndex = mSS.getCdmaEriIconIndex(); 3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (showSpn && (iconIndex == EriInfo.ROAMING_INDICATOR_OFF) && 39422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville isInHomeSidNid(mSS.getSystemId(), mSS.getNetworkId()) && 395e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka mIccRecords != null) { 39622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSS.setOperatorAlphaLong(mIccRecords.getServiceProviderName()); 3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String operatorNumeric; 4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 40222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ALPHA, 40322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSS.getOperatorAlphaLong()); 4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String prevOperatorNumeric = 4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, ""); 40722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville operatorNumeric = mSS.getOperatorNumeric(); 40822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, operatorNumeric); 4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (operatorNumeric == null) { 4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("operatorNumeric is null"); 41222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, ""); 4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mGotCountryCode = false; 4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String isoCountryCode = ""; 4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String mcc = operatorNumeric.substring(0, 3); 4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville isoCountryCode = MccTable.countryCodeForMcc(Integer.parseInt(operatorNumeric 4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .substring(0, 3))); 4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (NumberFormatException ex) { 4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville loge("countryCodeForMcc error" + ex); 4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (StringIndexOutOfBoundsException ex) { 4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville loge("countryCodeForMcc error" + ex); 4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 42622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, 4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville isoCountryCode); 4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mGotCountryCode = true; 4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 43022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (shouldFixTimeZoneNow(mPhone, operatorNumeric, prevOperatorNumeric, 4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNeedFixZone)) { 4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville fixTimeZone(isoCountryCode); 4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 43622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING, 43722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mSS.getRoaming() ? "true" : "false"); 4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville updateSpnDisplay(); 44022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.notifyServiceStateChanged(mSS); 4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasCdmaDataConnectionAttached || has4gHandoff) { 4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAttachedRegistrants.notifyRegistrants(); 4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasCdmaDataConnectionDetached) { 4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDetachedRegistrants.notifyRegistrants(); 4490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 451f92cb4bd5519427a0db673709d94683a8baf203aWink Saville if ((hasCdmaDataConnectionChanged || hasDataRadioTechnologyChanged)) { 452203e588e3c42a81aa8a56f595119c181a63b12caWink Saville notifyDataRegStateRilRadioTechnologyChanged(); 45322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.notifyDataConnection(null); 4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasRoamingOn) { 4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRoamingOnRegistrants.notifyRegistrants(); 4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasRoamingOff) { 4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRoamingOffRegistrants.notifyRegistrants(); 4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasLocationChanged) { 46522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPhone.notifyLocationChanged(); 4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 467ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville 468ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville ArrayList<CellInfo> arrayCi = new ArrayList<CellInfo>(); 469ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville synchronized(mCellInfo) { 470ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville CellInfoLte cil = (CellInfoLte)mCellInfo; 471ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville 472ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville boolean cidChanged = ! mNewCellIdentityLte.equals(mLasteCellIdentityLte); 473ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville if (hasRegistered || hasDeregistered || cidChanged) { 474ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville // TODO: Handle the absence of LteCellIdentity 475ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville long timeStamp = SystemClock.elapsedRealtime() * 1000; 47622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville boolean registered = mSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE; 477ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mLasteCellIdentityLte = mNewCellIdentityLte; 478ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville 479ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville cil.setRegisterd(registered); 480ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville cil.setCellIdentity(mLasteCellIdentityLte); 481ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville if (DBG) { 482ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville log("pollStateDone: hasRegistered=" + hasRegistered + 483ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville " hasDeregistered=" + hasDeregistered + 484ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville " cidChanged=" + cidChanged + 485ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville " mCellInfo=" + mCellInfo); 486ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 487ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville arrayCi.add(mCellInfo); 488ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 489e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville mPhoneBase.notifyCellInfo(arrayCi); 490ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 494e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville protected boolean onSignalStrengthResult(AsyncResult ar, boolean isGsm) { 49522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) { 4965b81adc82a53b3064f4baa3acfeabef31586588aUma Maheswari Ramalingam isGsm = true; 497ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 498e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville boolean ssChanged = super.onSignalStrengthResult(ar, isGsm); 499ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville 500e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville synchronized (mCellInfo) { 50122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) { 502e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville mCellInfoLte.setTimeStamp(SystemClock.elapsedRealtime() * 1000); 503e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville mCellInfoLte.setTimeStampType(CellInfo.TIMESTAMP_TYPE_JAVA_RIL); 504e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville mCellInfoLte.getCellSignalStrength() 505e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville .initialize(mSignalStrength,SignalStrength.INVALID); 5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 507e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville if (mCellInfoLte.getCellIdentity() != null) { 508e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville ArrayList<CellInfo> arrayCi = new ArrayList<CellInfo>(); 509e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville arrayCi.add(mCellInfoLte); 510e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville mPhoneBase.notifyCellInfo(arrayCi); 511ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 5120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 513e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville return ssChanged; 5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 5170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isConcurrentVoiceAndDataAllowed() { 5181785c21bf40489845fa70d8771858c1bfc124dd5Wink Saville // Using the Conncurrent Service Supported flag for CdmaLte devices. 5191785c21bf40489845fa70d8771858c1bfc124dd5Wink Saville return mSS.getCssIndicator() == 1; 5200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 5230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Check whether the specified SID and NID pair appears in the HOME SID/NID list 5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * read from NV or SIM. 5250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if provided sid/nid pair belongs to operator's home network. 5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean isInHomeSidNid(int sid, int nid) { 5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // if SID/NID is not available, assume this is home network. 5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (isSidsAllZeros()) return true; 5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // length of SID/NID shold be same 5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mHomeSystemId.length != mHomeNetworkId.length) return true; 5340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (sid == 0) return true; 5360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0; i < mHomeSystemId.length; i++) { 5380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Use SID only if NID is a reserved value. 5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // SID 0 and NID 0 and 65535 are reserved. (C.0005 2.6.5.2) 5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ((mHomeSystemId[i] == sid) && 5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ((mHomeNetworkId[i] == 0) || (mHomeNetworkId[i] == 65535) || 5420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (nid == 0) || (nid == 65535) || (mHomeNetworkId[i] == nid))) { 5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 5440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // SID/NID are not in the list. So device is not in home network 5470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 5480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 550ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville /** 5515fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville * TODO: Remove when we get new ril/modem for Galaxy Nexus. 5525fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville * 553ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville * @return all available cell information, the returned List maybe empty but never null. 554ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville */ 555ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville @Override 556ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville public List<CellInfo> getAllCellInfo() { 5575fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville if (mCi.getRilVersion() >= 8) { 5585fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville return super.getAllCellInfo(); 5595fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville } else { 5605fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville ArrayList<CellInfo> arrayList = new ArrayList<CellInfo>(); 5615fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville CellInfo ci; 5625fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville synchronized(mCellInfo) { 5635fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville arrayList.add(mCellInfoLte); 5645fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville } 5655fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville if (DBG) log ("getAllCellInfo: arrayList=" + arrayList); 5665fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville return arrayList; 567ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 568ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 569ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville 5700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 5710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void log(String s) { 57299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.d(LOG_TAG, "[CdmaLteSST] " + s); 5730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 5760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void loge(String s) { 57799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.e(LOG_TAG, "[CdmaLteSST] " + s); 5780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 5810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 5820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println("CdmaLteServiceStateTracker extends:"); 5830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.dump(fd, pw, args); 5840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mCdmaLtePhone=" + mCdmaLtePhone); 5850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 587