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 195b81adc82a53b3064f4baa3acfeabef31586588aUma Maheswari Ramalingamimport com.android.internal.telephony.PhoneBase; 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.TelephonyProperties; 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.MccTable; 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.EventLogTags; 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.RILConstants; 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.IccCard; 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 26ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.telephony.CellInfo; 27ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.telephony.CellInfoLte; 28ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.telephony.CellSignalStrengthLte; 29ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.telephony.CellIdentityLte; 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.SignalStrength; 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.ServiceState; 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.cdma.CdmaCellLocation; 33ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.text.TextUtils; 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult; 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message; 36ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.os.SystemClock; 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemProperties; 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.TextUtils; 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log; 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.EventLog; 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 43e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccCardApplicationStatus.AppState; 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.gsm.GsmDataConnectionTracker; 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.IccCardConstants; 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor; 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter; 49ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport java.util.ArrayList; 50ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport java.util.List; 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class CdmaLteServiceStateTracker extends CdmaServiceStateTracker { 53ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville private CDMALTEPhone mCdmaLtePhone; 54ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville private final CellInfoLte mCellInfoLte; 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private ServiceState mLteSS; // The last LTE state from Voice Registration 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 58ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville private CellIdentityLte mNewCellIdentityLte = new CellIdentityLte(); 59ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville private CellIdentityLte mLasteCellIdentityLte = new CellIdentityLte(); 60ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public CdmaLteServiceStateTracker(CDMALTEPhone phone) { 62ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville super(phone, new CellInfoLte()); 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCdmaLtePhone = phone; 64ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mCellInfoLte = (CellInfoLte) mCellInfo; 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mLteSS = new ServiceState(); 67ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville ((CellInfoLte)mCellInfo).setCellSignalStrength(new CellSignalStrengthLte()); 68ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville ((CellInfoLte)mCellInfo).setCellIdentity(new CellIdentityLte()); 69ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("CdmaLteServiceStateTracker Constructors"); 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void handleMessage(Message msg) { 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncResult ar; 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int[] ints; 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String[] strings; 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (msg.what) { 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_POLL_STATE_GPRS: 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("handleMessage EVENT_POLL_STATE_GPRS"); 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar = (AsyncResult)msg.obj; 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville handlePollStateResult(msg.what, ar); 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_RUIM_RECORDS_LOADED: 85e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka RuimRecords ruim = (RuimRecords)mIccRecords; 86e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if ((ruim != null) && ruim.isProvisioned()) { 87e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mMdn = ruim.getMdn(); 88e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mMin = ruim.getMin(); 89e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka parseSidNid(ruim.getSid(), ruim.getNid()); 90e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mPrlVersion = ruim.getPrlVersion();; 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIsMinInfoReady = true; 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville updateOtaspState(); 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // SID/NID/PRL is loaded. Poll service state 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // again to update to the roaming state with 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the latest variables. 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pollState(); 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.handleMessage(msg); 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Set the cdmaSS for EVENT_POLL_STATE_REGISTRATION_CDMA 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void setCdmaTechnology(int radioTechnology) { 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Called on voice registration state response. 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Just record new CDMA radio technology 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newSS.setRadioTechnology(radioTechnology); 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Handle the result of one of the pollState()-related requests 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void handlePollStateResultMessage(int what, AsyncResult ar) { 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (what == EVENT_POLL_STATE_GPRS) { 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String states[] = (String[])ar.result; 121ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville if (DBG) { 122ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville log("handlePollStateResultMessage: EVENT_POLL_STATE_GPRS states.length=" + 123ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville states.length + " states=" + states); 124ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int type = 0; 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int regState = -1; 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (states.length > 0) { 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville regState = Integer.parseInt(states[0]); 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // states[3] (if present) is the current radio technology 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (states.length >= 4 && states[3] != null) { 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville type = Integer.parseInt(states[3]); 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (NumberFormatException ex) { 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville loge("handlePollStateResultMessage: error parsing GprsRegistrationState: " 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + ex); 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 140ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville if (states.length >= 10) { 141ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville int mcc; 142ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville int mnc; 143ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville int tac; 144ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville int pci; 145ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville int eci; 146ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville int csgid; 147ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville String operatorNumeric = null; 148ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville 149ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville try { 150ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville operatorNumeric = mLteSS.getOperatorNumeric(); 151ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mcc = Integer.parseInt(operatorNumeric.substring(0,3)); 152ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } catch (Exception e) { 153ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville try { 154ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville operatorNumeric = ss.getOperatorNumeric(); 155ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mcc = Integer.parseInt(operatorNumeric.substring(0,3)); 156ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } catch (Exception ex) { 157ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville loge("handlePollStateResultMessage: bad mcc operatorNumeric=" + 158ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville operatorNumeric + " ex=" + ex); 159ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville operatorNumeric = ""; 160ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mcc = Integer.MAX_VALUE; 161ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 162ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 163ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville try { 164ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mnc = Integer.parseInt(operatorNumeric.substring(3)); 165ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } catch (Exception e) { 166ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville loge("handlePollStateResultMessage: bad mnc operatorNumeric=" + 167ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville operatorNumeric + " e=" + e); 168ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mnc = Integer.MAX_VALUE; 169ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 170859f7a917b27e64fc03ee614152ac37c688307a8Wink Saville 171859f7a917b27e64fc03ee614152ac37c688307a8Wink Saville // Use Integer#decode to be generous in what we receive and allow 172859f7a917b27e64fc03ee614152ac37c688307a8Wink Saville // decimal, hex or octal values. 173ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville try { 174859f7a917b27e64fc03ee614152ac37c688307a8Wink Saville tac = Integer.decode(states[6]); 175ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } catch (Exception e) { 176ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville loge("handlePollStateResultMessage: bad tac states[6]=" + 177ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville states[6] + " e=" + e); 178ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville tac = Integer.MAX_VALUE; 179ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 180ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville try { 181859f7a917b27e64fc03ee614152ac37c688307a8Wink Saville pci = Integer.decode(states[7]); 182ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } catch (Exception e) { 183ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville loge("handlePollStateResultMessage: bad pci states[7]=" + 184ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville states[7] + " e=" + e); 185ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville pci = Integer.MAX_VALUE; 186ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 187ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville try { 188859f7a917b27e64fc03ee614152ac37c688307a8Wink Saville eci = Integer.decode(states[8]); 189ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } catch (Exception e) { 190ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville loge("handlePollStateResultMessage: bad eci states[8]=" + 191ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville states[8] + " e=" + e); 192ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville eci = Integer.MAX_VALUE; 193ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 194ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville try { 195859f7a917b27e64fc03ee614152ac37c688307a8Wink Saville csgid = Integer.decode(states[9]); 196ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } catch (Exception e) { 197ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville // FIX: Always bad so don't pollute the logs 198ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville // loge("handlePollStateResultMessage: bad csgid states[9]=" + 199ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville // states[9] + " e=" + e); 200ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville csgid = Integer.MAX_VALUE; 201ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 202ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mNewCellIdentityLte = new CellIdentityLte(mcc, mnc, eci, pci, tac); 203ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville if (DBG) { 204ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville log("handlePollStateResultMessage: mNewLteCellIdentity=" + 205ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mNewCellIdentityLte); 206ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 207ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mLteSS.setRadioTechnology(type); 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mLteSS.setState(regCodeToServiceState(regState)); 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.handlePollStateResultMessage(what, ar); 2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void pollState() { 2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pollingContext = new int[1]; 2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pollingContext[0] = 0; 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (cm.getRadioState()) { 2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case RADIO_UNAVAILABLE: 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newSS.setStateOutOfService(); 2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newCellLoc.setStateInvalid(); 2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville setSignalStrengthDefaultValues(); 2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mGotCountryCode = false; 2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pollStateDone(); 2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case RADIO_OFF: 2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newSS.setStateOff(); 2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newCellLoc.setStateInvalid(); 2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville setSignalStrengthDefaultValues(); 2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mGotCountryCode = false; 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pollStateDone(); 2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Issue all poll-related commands at once, then count 2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // down the responses which are allowed to arrive 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // out-of-order. 2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pollingContext[0]++; 2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // RIL_REQUEST_OPERATOR is necessary for CDMA 2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cm.getOperator(obtainMessage(EVENT_POLL_STATE_OPERATOR_CDMA, pollingContext)); 2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pollingContext[0]++; 2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // RIL_REQUEST_VOICE_REGISTRATION_STATE is necessary for CDMA 2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cm.getVoiceRegistrationState(obtainMessage(EVENT_POLL_STATE_REGISTRATION_CDMA, 2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pollingContext)); 2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 255ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville pollingContext[0]++; 256ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville // RIL_REQUEST_DATA_REGISTRATION_STATE 257ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville cm.getDataRegistrationState(obtainMessage(EVENT_POLL_STATE_GPRS, 258ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville pollingContext)); 2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void pollStateDone() { 2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // determine data RadioTechnology from both LET and CDMA SS 2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mLteSS.getState() == ServiceState.STATE_IN_SERVICE) { 2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //in LTE service 2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNewRilRadioTechnology = mLteSS.getRilRadioTechnology(); 2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNewDataConnectionState = mLteSS.getState(); 2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newSS.setRadioTechnology(mNewRilRadioTechnology); 2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("pollStateDone LTE/eHRPD STATE_IN_SERVICE mNewRilRadioTechnology = " + 2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNewRilRadioTechnology); 2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // LTE out of service, get CDMA Service State 2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNewRilRadioTechnology = newSS.getRilRadioTechnology(); 2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNewDataConnectionState = radioTechnologyToDataServiceState(mNewRilRadioTechnology); 2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("pollStateDone CDMA STATE_IN_SERVICE mNewRilRadioTechnology = " + 2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNewRilRadioTechnology + " mNewDataConnectionState = " + 2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNewDataConnectionState); 2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // TODO: Add proper support for LTE Only, we should be looking at 2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the preferred network mode, to know when newSS state should 2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // be coming from mLteSs state. This was needed to pass a VZW 2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // LTE Only test. 2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // 2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // If CDMA service is OOS, double check if the device is running with LTE only 2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // mode. If that is the case, derive the service state from LTE side. 2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // To set in LTE only mode, sqlite3 /data/data/com.android.providers.settings/ 2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // databases/settings.db "update secure set value='11' where name='preferred_network_mode'" 2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (newSS.getState() == ServiceState.STATE_OUT_OF_SERVICE) { 2926ce6af4664de8d12c238f00b1f566db010d52a44Jeff Sharkey int networkMode = android.provider.Settings.Global.getInt(phone.getContext() 2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .getContentResolver(), 2946ce6af4664de8d12c238f00b1f566db010d52a44Jeff Sharkey android.provider.Settings.Global.PREFERRED_NETWORK_MODE, 2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville RILConstants.PREFERRED_NETWORK_MODE); 2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (networkMode == RILConstants.NETWORK_MODE_LTE_ONLY) { 2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("pollState: LTE Only mode"); 2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newSS.setState(mLteSS.getState()); 2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("pollStateDone: oldSS=[" + ss + "] newSS=[" + newSS + "]"); 3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasRegistered = ss.getState() != ServiceState.STATE_IN_SERVICE 3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville && newSS.getState() == ServiceState.STATE_IN_SERVICE; 3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasDeregistered = ss.getState() == ServiceState.STATE_IN_SERVICE 3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville && newSS.getState() != ServiceState.STATE_IN_SERVICE; 3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasCdmaDataConnectionAttached = 3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDataConnectionState != ServiceState.STATE_IN_SERVICE 3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville && mNewDataConnectionState == ServiceState.STATE_IN_SERVICE; 3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasCdmaDataConnectionDetached = 3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDataConnectionState == ServiceState.STATE_IN_SERVICE 3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville && mNewDataConnectionState != ServiceState.STATE_IN_SERVICE; 3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasCdmaDataConnectionChanged = 3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDataConnectionState != mNewDataConnectionState; 3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasRadioTechnologyChanged = mRilRadioTechnology != mNewRilRadioTechnology; 3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasChanged = !newSS.equals(ss); 3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasRoamingOn = !ss.getRoaming() && newSS.getRoaming(); 3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasRoamingOff = ss.getRoaming() && !newSS.getRoaming(); 3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasLocationChanged = !newCellLoc.equals(cellLoc); 3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean has4gHandoff = 3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNewDataConnectionState == ServiceState.STATE_IN_SERVICE && 3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (((mRilRadioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) && 3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (mNewRilRadioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD)) || 3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ((mRilRadioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD) && 3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (mNewRilRadioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_LTE))); 3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasMultiApnSupport = 3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (((mNewRilRadioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) || 3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (mNewRilRadioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD)) && 3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ((mRilRadioTechnology != ServiceState.RIL_RADIO_TECHNOLOGY_LTE) && 3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (mRilRadioTechnology != ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD))); 3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasLostMultiApnSupport = 3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ((mNewRilRadioTechnology >= ServiceState.RIL_RADIO_TECHNOLOGY_IS95A) && 3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (mNewRilRadioTechnology <= ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A)); 3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) { 3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville log("pollStateDone:" 3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasRegistered=" + hasRegistered 3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasDeegistered=" + hasDeregistered 3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasCdmaDataConnectionAttached=" + hasCdmaDataConnectionAttached 3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasCdmaDataConnectionDetached=" + hasCdmaDataConnectionDetached 3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasCdmaDataConnectionChanged=" + hasCdmaDataConnectionChanged 3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasRadioTechnologyChanged = " + hasRadioTechnologyChanged 3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasChanged=" + hasChanged 3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasRoamingOn=" + hasRoamingOn 3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasRoamingOff=" + hasRoamingOff 3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasLocationChanged=" + hasLocationChanged 3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " has4gHandoff = " + has4gHandoff 3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasMultiApnSupport=" + hasMultiApnSupport 3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + " hasLostMultiApnSupport=" + hasLostMultiApnSupport); 3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Add an event log when connection state changes 3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ss.getState() != newSS.getState() 3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville || mDataConnectionState != mNewDataConnectionState) { 3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville EventLog.writeEvent(EventLogTags.CDMA_SERVICE_STATE_CHANGE, ss.getState(), 3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDataConnectionState, newSS.getState(), mNewDataConnectionState); 3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ServiceState tss; 3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville tss = ss; 3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ss = newSS; 3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newSS = tss; 3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // clean slate for next time 3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newSS.setStateOutOfService(); 3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mLteSS.setStateOutOfService(); 3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ((hasMultiApnSupport) 3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville && (phone.mDataConnectionTracker instanceof CdmaDataConnectionTracker)) { 3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("GsmDataConnectionTracker Created"); 3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.mDataConnectionTracker.dispose(); 3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.mDataConnectionTracker = new GsmDataConnectionTracker(mCdmaLtePhone); 3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ((hasLostMultiApnSupport) 3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville && (phone.mDataConnectionTracker instanceof GsmDataConnectionTracker)) { 3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG)log("GsmDataConnectionTracker disposed"); 3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.mDataConnectionTracker.dispose(); 3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.mDataConnectionTracker = new CdmaDataConnectionTracker(phone); 3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CdmaCellLocation tcl = cellLoc; 3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cellLoc = newCellLoc; 3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newCellLoc = tcl; 3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDataConnectionState = mNewDataConnectionState; 3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRilRadioTechnology = mNewRilRadioTechnology; 3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNewRilRadioTechnology = 0; 4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newSS.setStateOutOfService(); // clean slate for next time 4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasRadioTechnologyChanged) { 4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.setSystemProperty(TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE, 4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ServiceState.rilRadioTechnologyToString(mRilRadioTechnology)); 4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasRegistered) { 4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNetworkAttachedRegistrants.notifyRegistrants(); 4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasChanged) { 4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (phone.isEriFileLoaded()) { 4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String eriText; 4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Now the CDMAPhone sees the new ServiceState so it can get the 4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // new ERI text 4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ss.getState() == ServiceState.STATE_IN_SERVICE) { 4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville eriText = phone.getCdmaEriText(); 4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (ss.getState() == ServiceState.STATE_POWER_OFF) { 420e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka eriText = (mIccRecords != null) ? mIccRecords.getServiceProviderName() : null; 4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (TextUtils.isEmpty(eriText)) { 4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Sets operator alpha property by retrieving from 4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // build-time system property 4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville eriText = SystemProperties.get("ro.cdma.home.operator.alpha"); 4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Note that ServiceState.STATE_OUT_OF_SERVICE is valid used 4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // for mRegistrationState 0,2,3 and 4 4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville eriText = phone.getContext() 4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .getText(com.android.internal.R.string.roamingTextSearching).toString(); 4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ss.setOperatorAlphaLong(eriText); 4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 435e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (mUiccApplcation != null && mUiccApplcation.getState() == AppState.APPSTATE_READY && 436e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka mIccRecords != null) { 4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // SIM is found on the device. If ERI roaming is OFF, and SID/NID matches 4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // one configfured in SIM, use operator name from CSIM record. 4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean showSpn = 440e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka ((RuimRecords)mIccRecords).getCsimSpnDisplayCondition(); 4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int iconIndex = ss.getCdmaEriIconIndex(); 4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (showSpn && (iconIndex == EriInfo.ROAMING_INDICATOR_OFF) && 444e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka isInHomeSidNid(ss.getSystemId(), ss.getNetworkId()) && 445e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka mIccRecords != null) { 446e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka ss.setOperatorAlphaLong(mIccRecords.getServiceProviderName()); 4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String operatorNumeric; 4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ALPHA, 4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ss.getOperatorAlphaLong()); 4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String prevOperatorNumeric = 4560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, ""); 4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville operatorNumeric = ss.getOperatorNumeric(); 4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, operatorNumeric); 4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (operatorNumeric == null) { 4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (DBG) log("operatorNumeric is null"); 4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, ""); 4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mGotCountryCode = false; 4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String isoCountryCode = ""; 4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String mcc = operatorNumeric.substring(0, 3); 4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville isoCountryCode = MccTable.countryCodeForMcc(Integer.parseInt(operatorNumeric 4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .substring(0, 3))); 4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (NumberFormatException ex) { 4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville loge("countryCodeForMcc error" + ex); 4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (StringIndexOutOfBoundsException ex) { 4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville loge("countryCodeForMcc error" + ex); 4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, 4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville isoCountryCode); 4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mGotCountryCode = true; 4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (shouldFixTimeZoneNow(phone, operatorNumeric, prevOperatorNumeric, 4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNeedFixZone)) { 4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville fixTimeZone(isoCountryCode); 4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING, 4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ss.getRoaming() ? "true" : "false"); 4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville updateSpnDisplay(); 4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.notifyServiceStateChanged(ss); 4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasCdmaDataConnectionAttached || has4gHandoff) { 4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAttachedRegistrants.notifyRegistrants(); 4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasCdmaDataConnectionDetached) { 4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDetachedRegistrants.notifyRegistrants(); 4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ((hasCdmaDataConnectionChanged || hasRadioTechnologyChanged)) { 5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.notifyDataConnection(null); 5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasRoamingOn) { 5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRoamingOnRegistrants.notifyRegistrants(); 5070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasRoamingOff) { 5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mRoamingOffRegistrants.notifyRegistrants(); 5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasLocationChanged) { 5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.notifyLocationChanged(); 5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 516ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville 517ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville ArrayList<CellInfo> arrayCi = new ArrayList<CellInfo>(); 518ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville synchronized(mCellInfo) { 519ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville CellInfoLte cil = (CellInfoLte)mCellInfo; 520ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville 521ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville boolean cidChanged = ! mNewCellIdentityLte.equals(mLasteCellIdentityLte); 522ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville if (hasRegistered || hasDeregistered || cidChanged) { 523ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville // TODO: Handle the absence of LteCellIdentity 524ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville long timeStamp = SystemClock.elapsedRealtime() * 1000; 525ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville boolean registered = ss.getState() == ServiceState.STATE_IN_SERVICE; 526ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville mLasteCellIdentityLte = mNewCellIdentityLte; 527ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville 528ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville cil.setRegisterd(registered); 529ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville cil.setCellIdentity(mLasteCellIdentityLte); 530ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville if (DBG) { 531ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville log("pollStateDone: hasRegistered=" + hasRegistered + 532ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville " hasDeregistered=" + hasDeregistered + 533ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville " cidChanged=" + cidChanged + 534ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville " mCellInfo=" + mCellInfo); 535ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 536ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville arrayCi.add(mCellInfo); 537ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 538e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville mPhoneBase.notifyCellInfo(arrayCi); 539ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 543e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville protected boolean onSignalStrengthResult(AsyncResult ar, boolean isGsm) { 5445b81adc82a53b3064f4baa3acfeabef31586588aUma Maheswari Ramalingam if (mRilRadioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) { 5455b81adc82a53b3064f4baa3acfeabef31586588aUma Maheswari Ramalingam isGsm = true; 546ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 547e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville boolean ssChanged = super.onSignalStrengthResult(ar, isGsm); 548ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville 549e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville synchronized (mCellInfo) { 550e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville if (mRilRadioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) { 551e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville mCellInfoLte.setTimeStamp(SystemClock.elapsedRealtime() * 1000); 552e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville mCellInfoLte.setTimeStampType(CellInfo.TIMESTAMP_TYPE_JAVA_RIL); 553e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville mCellInfoLte.getCellSignalStrength() 554e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville .initialize(mSignalStrength,SignalStrength.INVALID); 5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 556e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville if (mCellInfoLte.getCellIdentity() != null) { 557e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville ArrayList<CellInfo> arrayCi = new ArrayList<CellInfo>(); 558e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville arrayCi.add(mCellInfoLte); 559e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville mPhoneBase.notifyCellInfo(arrayCi); 560ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 5610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 562e0e2ceb1ae025e6dd2adda75c32dba93c6dfeea4Wink Saville return ssChanged; 5630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 5660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isConcurrentVoiceAndDataAllowed() { 5670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Note: it needs to be confirmed which CDMA network types 5680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // can support voice and data calls concurrently. 5690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // For the time-being, the return value will be false. 5700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return (mRilRadioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_LTE); 5710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 5740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Check whether the specified SID and NID pair appears in the HOME SID/NID list 5750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * read from NV or SIM. 5760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 5770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if provided sid/nid pair belongs to operator's home network. 5780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 5790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean isInHomeSidNid(int sid, int nid) { 5800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // if SID/NID is not available, assume this is home network. 5810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (isSidsAllZeros()) return true; 5820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // length of SID/NID shold be same 5840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mHomeSystemId.length != mHomeNetworkId.length) return true; 5850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (sid == 0) return true; 5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0; i < mHomeSystemId.length; i++) { 5890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Use SID only if NID is a reserved value. 5900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // SID 0 and NID 0 and 65535 are reserved. (C.0005 2.6.5.2) 5910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ((mHomeSystemId[i] == sid) && 5920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ((mHomeNetworkId[i] == 0) || (mHomeNetworkId[i] == 65535) || 5930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (nid == 0) || (nid == 65535) || (mHomeNetworkId[i] == nid))) { 5940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 5950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // SID/NID are not in the list. So device is not in home network 5980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 5990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 601ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville /** 602ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville * @return all available cell information, the returned List maybe empty but never null. 603ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville */ 604ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville @Override 605ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville public List<CellInfo> getAllCellInfo() { 606ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville ArrayList<CellInfo> arrayList = new ArrayList<CellInfo>(); 607ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville CellInfo ci; 608ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville synchronized(mCellInfo) { 609ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville arrayList.add(mCellInfoLte); 610ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 611ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville if (DBG) log ("getAllCellInfo: arrayList=" + arrayList); 612ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville return arrayList; 613ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville } 614ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville 6150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 6160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void log(String s) { 6170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Log.d(LOG_TAG, "[CdmaLteSST] " + s); 6180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 6210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void loge(String s) { 6220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Log.e(LOG_TAG, "[CdmaLteSST] " + s); 6230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 6260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 6270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println("CdmaLteServiceStateTracker extends:"); 6280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.dump(fd, pw, args); 6290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mCdmaLtePhone=" + mCdmaLtePhone); 6300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mLteSS=" + mLteSS); 6310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 633