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