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