Telephony: Ignore events on a destroyed phone
[android/platform/frameworks/opt/telephony.git] / src / java / com / android / internal / telephony / cdma / CdmaLteServiceStateTracker.java
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.android.internal.telephony.cdma;
18
19 import com.android.internal.telephony.TelephonyProperties;
20 import com.android.internal.telephony.MccTable;
21 import com.android.internal.telephony.EventLogTags;
22 import com.android.internal.telephony.uicc.RuimRecords;
23 import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState;
24
25 import android.telephony.CellInfo;
26 import android.telephony.CellInfoLte;
27 import android.telephony.CellSignalStrengthLte;
28 import android.telephony.CellIdentityLte;
29 import android.telephony.SignalStrength;
30 import android.telephony.ServiceState;
31 import android.telephony.cdma.CdmaCellLocation;
32 import android.text.TextUtils;
33 import android.os.AsyncResult;
34 import android.os.Message;
35 import android.os.SystemClock;
36 import android.os.SystemProperties;
37
38 import android.telephony.Rlog;
39 import android.util.EventLog;
40
41 import java.io.FileDescriptor;
42 import java.io.PrintWriter;
43 import java.util.ArrayList;
44 import java.util.List;
45
46 public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker {
47     private CDMALTEPhone mCdmaLtePhone;
48     private final CellInfoLte mCellInfoLte;
49
50     private CellIdentityLte mNewCellIdentityLte = new CellIdentityLte();
51     private CellIdentityLte mLasteCellIdentityLte = new CellIdentityLte();
52
53     public CdmaLteServiceStateTracker(CDMALTEPhone phone) {
54         super(phone, new CellInfoLte());
55         mCdmaLtePhone = phone;
56         mCellInfoLte = (CellInfoLte) mCellInfo;
57
58         ((CellInfoLte)mCellInfo).setCellSignalStrength(new CellSignalStrengthLte());
59         ((CellInfoLte)mCellInfo).setCellIdentity(new CellIdentityLte());
60
61         if (DBG) log("CdmaLteServiceStateTracker Constructors");
62     }
63
64     @Override
65     public void handleMessage(Message msg) {
66         AsyncResult ar;
67         int[] ints;
68         String[] strings;
69
70         if (!mPhone.mIsTheCurrentActivePhone) {
71             loge("Received message " + msg + "[" + msg.what + "]" +
72                     " while being destroyed. Ignoring.");
73             return;
74         }
75
76         switch (msg.what) {
77         case EVENT_POLL_STATE_GPRS:
78             if (DBG) log("handleMessage EVENT_POLL_STATE_GPRS");
79             ar = (AsyncResult)msg.obj;
80             handlePollStateResult(msg.what, ar);
81             break;
82         case EVENT_RUIM_RECORDS_LOADED:
83             RuimRecords ruim = (RuimRecords)mIccRecords;
84             if ((ruim != null) && ruim.isProvisioned()) {
85                 mMdn = ruim.getMdn();
86                 mMin = ruim.getMin();
87                 parseSidNid(ruim.getSid(), ruim.getNid());
88                 mPrlVersion = ruim.getPrlVersion();
89                 mIsMinInfoReady = true;
90                 updateOtaspState();
91             }
92             // SID/NID/PRL is loaded. Poll service state
93             // again to update to the roaming state with
94             // the latest variables.
95             pollState();
96             break;
97         default:
98             super.handleMessage(msg);
99         }
100     }
101
102     /**
103      * Handle the result of one of the pollState()-related requests
104      */
105     @Override
106     protected void handlePollStateResultMessage(int what, AsyncResult ar) {
107         if (what == EVENT_POLL_STATE_GPRS) {
108             String states[] = (String[])ar.result;
109             if (DBG) {
110                 log("handlePollStateResultMessage: EVENT_POLL_STATE_GPRS states.length=" +
111                         states.length + " states=" + states);
112             }
113
114             int type = 0;
115             int regState = -1;
116             if (states.length > 0) {
117                 try {
118                     regState = Integer.parseInt(states[0]);
119
120                     // states[3] (if present) is the current radio technology
121                     if (states.length >= 4 && states[3] != null) {
122                         type = Integer.parseInt(states[3]);
123                     }
124                 } catch (NumberFormatException ex) {
125                     loge("handlePollStateResultMessage: error parsing GprsRegistrationState: "
126                                     + ex);
127                 }
128                 if (states.length >= 10) {
129                     int mcc;
130                     int mnc;
131                     int tac;
132                     int pci;
133                     int eci;
134                     int csgid;
135                     String operatorNumeric = null;
136
137                     try {
138                         operatorNumeric = mNewSS.getOperatorNumeric();
139                         mcc = Integer.parseInt(operatorNumeric.substring(0,3));
140                     } catch (Exception e) {
141                         try {
142                             operatorNumeric = mSS.getOperatorNumeric();
143                             mcc = Integer.parseInt(operatorNumeric.substring(0,3));
144                         } catch (Exception ex) {
145                             loge("handlePollStateResultMessage: bad mcc operatorNumeric=" +
146                                     operatorNumeric + " ex=" + ex);
147                             operatorNumeric = "";
148                             mcc = Integer.MAX_VALUE;
149                         }
150                     }
151                     try {
152                         mnc = Integer.parseInt(operatorNumeric.substring(3));
153                     } catch (Exception e) {
154                         loge("handlePollStateResultMessage: bad mnc operatorNumeric=" +
155                                 operatorNumeric + " e=" + e);
156                         mnc = Integer.MAX_VALUE;
157                     }
158
159                     // Use Integer#decode to be generous in what we receive and allow
160                     // decimal, hex or octal values.
161                     try {
162                         tac = Integer.decode(states[6]);
163                     } catch (Exception e) {
164                         loge("handlePollStateResultMessage: bad tac states[6]=" +
165                                 states[6] + " e=" + e);
166                         tac = Integer.MAX_VALUE;
167                     }
168                     try {
169                         pci = Integer.decode(states[7]);
170                     } catch (Exception e) {
171                         loge("handlePollStateResultMessage: bad pci states[7]=" +
172                                 states[7] + " e=" + e);
173                         pci = Integer.MAX_VALUE;
174                     }
175                     try {
176                         eci = Integer.decode(states[8]);
177                     } catch (Exception e) {
178                         loge("handlePollStateResultMessage: bad eci states[8]=" +
179                                 states[8] + " e=" + e);
180                         eci = Integer.MAX_VALUE;
181                     }
182                     try {
183                         csgid = Integer.decode(states[9]);
184                     } catch (Exception e) {
185                         // FIX: Always bad so don't pollute the logs
186                         // loge("handlePollStateResultMessage: bad csgid states[9]=" +
187                         //        states[9] + " e=" + e);
188                         csgid = Integer.MAX_VALUE;
189                     }
190                     mNewCellIdentityLte = new CellIdentityLte(mcc, mnc, eci, pci, tac);
191                     if (DBG) {
192                         log("handlePollStateResultMessage: mNewLteCellIdentity=" +
193                                 mNewCellIdentityLte);
194                     }
195                 }
196             }
197
198             mNewSS.setRilDataRadioTechnology(type);
199             int dataRegState = regCodeToServiceState(regState);
200             mNewSS.setDataRegState(dataRegState);
201             if (DBG) {
202                 log("handlPollStateResultMessage: CdmaLteSST setDataRegState=" + dataRegState
203                         + " regState=" + regState
204                         + " dataRadioTechnology=" + type);
205             }
206         } else {
207             super.handlePollStateResultMessage(what, ar);
208         }
209     }
210
211     @Override
212     protected void pollState() {
213         mPollingContext = new int[1];
214         mPollingContext[0] = 0;
215
216         switch (mCi.getRadioState()) {
217             case RADIO_UNAVAILABLE:
218                 mNewSS.setStateOutOfService();
219                 mNewCellLoc.setStateInvalid();
220                 setSignalStrengthDefaultValues();
221                 mGotCountryCode = false;
222
223                 pollStateDone();
224                 break;
225
226             case RADIO_OFF:
227                 mNewSS.setStateOff();
228                 mNewCellLoc.setStateInvalid();
229                 setSignalStrengthDefaultValues();
230                 mGotCountryCode = false;
231
232                 pollStateDone();
233                 break;
234
235             default:
236                 // Issue all poll-related commands at once, then count
237                 // down the responses which are allowed to arrive
238                 // out-of-order.
239
240                 mPollingContext[0]++;
241                 // RIL_REQUEST_OPERATOR is necessary for CDMA
242                 mCi.getOperator(obtainMessage(EVENT_POLL_STATE_OPERATOR_CDMA, mPollingContext));
243
244                 mPollingContext[0]++;
245                 // RIL_REQUEST_VOICE_REGISTRATION_STATE is necessary for CDMA
246                 mCi.getVoiceRegistrationState(obtainMessage(EVENT_POLL_STATE_REGISTRATION_CDMA,
247                         mPollingContext));
248
249                 mPollingContext[0]++;
250                 // RIL_REQUEST_DATA_REGISTRATION_STATE
251                 mCi.getDataRegistrationState(obtainMessage(EVENT_POLL_STATE_GPRS,
252                                             mPollingContext));
253                 break;
254         }
255     }
256
257     @Override
258     protected void pollStateDone() {
259         log("pollStateDone: lte 1 ss=[" + mSS + "] newSS=[" + mNewSS + "]");
260
261         useDataRegStateForDataOnlyDevices();
262
263         boolean hasRegistered = mSS.getVoiceRegState() != ServiceState.STATE_IN_SERVICE
264                 && mNewSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE;
265
266         boolean hasDeregistered = mSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE
267                 && mNewSS.getVoiceRegState() != ServiceState.STATE_IN_SERVICE;
268
269         boolean hasCdmaDataConnectionAttached =
270             mSS.getDataRegState() != ServiceState.STATE_IN_SERVICE
271                 && mNewSS.getDataRegState() == ServiceState.STATE_IN_SERVICE;
272
273         boolean hasCdmaDataConnectionDetached =
274                 mSS.getDataRegState() == ServiceState.STATE_IN_SERVICE
275                 && mNewSS.getDataRegState() != ServiceState.STATE_IN_SERVICE;
276
277         boolean hasCdmaDataConnectionChanged =
278             mSS.getDataRegState() != mNewSS.getDataRegState();
279
280         boolean hasVoiceRadioTechnologyChanged = mSS.getRilVoiceRadioTechnology()
281                 != mNewSS.getRilVoiceRadioTechnology();
282
283         boolean hasDataRadioTechnologyChanged = mSS.getRilDataRadioTechnology()
284                 != mNewSS.getRilDataRadioTechnology();
285
286         boolean hasChanged = !mNewSS.equals(mSS);
287
288         boolean hasRoamingOn = !mSS.getRoaming() && mNewSS.getRoaming();
289
290         boolean hasRoamingOff = mSS.getRoaming() && !mNewSS.getRoaming();
291
292         boolean hasLocationChanged = !mNewCellLoc.equals(mCellLoc);
293
294         boolean has4gHandoff =
295                 mNewSS.getDataRegState() == ServiceState.STATE_IN_SERVICE &&
296                 (((mSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) &&
297                   (mNewSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD)) ||
298                  ((mSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD) &&
299                   (mNewSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_LTE)));
300
301         boolean hasMultiApnSupport =
302                 (((mNewSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) ||
303                   (mNewSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD)) &&
304                  ((mSS.getRilDataRadioTechnology() != ServiceState.RIL_RADIO_TECHNOLOGY_LTE) &&
305                   (mSS.getRilDataRadioTechnology() != ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD)));
306
307         boolean hasLostMultiApnSupport =
308             ((mNewSS.getRilDataRadioTechnology() >= ServiceState.RIL_RADIO_TECHNOLOGY_IS95A) &&
309              (mNewSS.getRilDataRadioTechnology() <= ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A));
310
311         if (DBG) {
312             log("pollStateDone:"
313                 + " hasRegistered=" + hasRegistered
314                 + " hasDeegistered=" + hasDeregistered
315                 + " hasCdmaDataConnectionAttached=" + hasCdmaDataConnectionAttached
316                 + " hasCdmaDataConnectionDetached=" + hasCdmaDataConnectionDetached
317                 + " hasCdmaDataConnectionChanged=" + hasCdmaDataConnectionChanged
318                 + " hasVoiceRadioTechnologyChanged= " + hasVoiceRadioTechnologyChanged
319                 + " hasDataRadioTechnologyChanged=" + hasDataRadioTechnologyChanged
320                 + " hasChanged=" + hasChanged
321                 + " hasRoamingOn=" + hasRoamingOn
322                 + " hasRoamingOff=" + hasRoamingOff
323                 + " hasLocationChanged=" + hasLocationChanged
324                 + " has4gHandoff = " + has4gHandoff
325                 + " hasMultiApnSupport=" + hasMultiApnSupport
326                 + " hasLostMultiApnSupport=" + hasLostMultiApnSupport);
327         }
328         // Add an event log when connection state changes
329         if (mSS.getVoiceRegState() != mNewSS.getVoiceRegState()
330                 || mSS.getDataRegState() != mNewSS.getDataRegState()) {
331             EventLog.writeEvent(EventLogTags.CDMA_SERVICE_STATE_CHANGE, mSS.getVoiceRegState(),
332                     mSS.getDataRegState(), mNewSS.getVoiceRegState(), mNewSS.getDataRegState());
333         }
334
335         ServiceState tss;
336         tss = mSS;
337         mSS = mNewSS;
338         mNewSS = tss;
339         // clean slate for next time
340         mNewSS.setStateOutOfService();
341
342         CdmaCellLocation tcl = mCellLoc;
343         mCellLoc = mNewCellLoc;
344         mNewCellLoc = tcl;
345
346         mNewSS.setStateOutOfService(); // clean slate for next time
347
348         if (hasDataRadioTechnologyChanged) {
349             mPhone.setSystemProperty(TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE,
350                     ServiceState.rilRadioTechnologyToString(mSS.getRilDataRadioTechnology()));
351         }
352
353         if (hasRegistered) {
354             mNetworkAttachedRegistrants.notifyRegistrants();
355         }
356
357         if (hasChanged) {
358             if (mPhone.isEriFileLoaded()) {
359                 String eriText;
360                 // Now the CDMAPhone sees the new ServiceState so it can get the
361                 // new ERI text
362                 if (mSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE) {
363                     eriText = mPhone.getCdmaEriText();
364                 } else if (mSS.getVoiceRegState() == ServiceState.STATE_POWER_OFF) {
365                     eriText = (mIccRecords != null) ? mIccRecords.getServiceProviderName() : null;
366                     if (TextUtils.isEmpty(eriText)) {
367                         // Sets operator alpha property by retrieving from
368                         // build-time system property
369                         eriText = SystemProperties.get("ro.cdma.home.operator.alpha");
370                     }
371                 } else {
372                     // Note that ServiceState.STATE_OUT_OF_SERVICE is valid used
373                     // for mRegistrationState 0,2,3 and 4
374                     eriText = mPhone.getContext()
375                             .getText(com.android.internal.R.string.roamingTextSearching).toString();
376                 }
377                 mSS.setOperatorAlphaLong(eriText);
378             }
379
380             if (mUiccApplcation != null && mUiccApplcation.getState() == AppState.APPSTATE_READY &&
381                     mIccRecords != null) {
382                 // SIM is found on the device. If ERI roaming is OFF, and SID/NID matches
383                 // one configured in SIM, use operator name  from CSIM record.
384                 boolean showSpn =
385                     ((RuimRecords)mIccRecords).getCsimSpnDisplayCondition();
386                 int iconIndex = mSS.getCdmaEriIconIndex();
387
388                 if (showSpn && (iconIndex == EriInfo.ROAMING_INDICATOR_OFF) &&
389                     isInHomeSidNid(mSS.getSystemId(), mSS.getNetworkId()) &&
390                     mIccRecords != null) {
391                     mSS.setOperatorAlphaLong(mIccRecords.getServiceProviderName());
392                 }
393             }
394
395             String operatorNumeric;
396
397             mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ALPHA,
398                     mSS.getOperatorAlphaLong());
399
400             String prevOperatorNumeric =
401                     SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, "");
402             operatorNumeric = mSS.getOperatorNumeric();
403             mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_NUMERIC, operatorNumeric);
404
405             if (operatorNumeric == null) {
406                 if (DBG) log("operatorNumeric is null");
407                 mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY, "");
408                 mGotCountryCode = false;
409             } else {
410                 String isoCountryCode = "";
411                 String mcc = operatorNumeric.substring(0, 3);
412                 try {
413                     isoCountryCode = MccTable.countryCodeForMcc(Integer.parseInt(operatorNumeric
414                             .substring(0, 3)));
415                 } catch (NumberFormatException ex) {
416                     loge("countryCodeForMcc error" + ex);
417                 } catch (StringIndexOutOfBoundsException ex) {
418                     loge("countryCodeForMcc error" + ex);
419                 }
420
421                 mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY,
422                         isoCountryCode);
423                 mGotCountryCode = true;
424
425                 if (shouldFixTimeZoneNow(mPhone, operatorNumeric, prevOperatorNumeric,
426                         mNeedFixZone)) {
427                     fixTimeZone(isoCountryCode);
428                 }
429             }
430
431             mPhone.setSystemProperty(TelephonyProperties.PROPERTY_OPERATOR_ISROAMING,
432                     mSS.getRoaming() ? "true" : "false");
433
434             updateSpnDisplay();
435             mPhone.notifyServiceStateChanged(mSS);
436         }
437
438         if (hasCdmaDataConnectionAttached || has4gHandoff) {
439             mAttachedRegistrants.notifyRegistrants();
440         }
441
442         if (hasCdmaDataConnectionDetached) {
443             mDetachedRegistrants.notifyRegistrants();
444         }
445
446         if ((hasCdmaDataConnectionChanged || hasDataRadioTechnologyChanged)) {
447             notifyDataRegStateRilRadioTechnologyChanged();
448             mPhone.notifyDataConnection(null);
449         }
450
451         if (hasRoamingOn) {
452             mRoamingOnRegistrants.notifyRegistrants();
453         }
454
455         if (hasRoamingOff) {
456             mRoamingOffRegistrants.notifyRegistrants();
457         }
458
459         if (hasLocationChanged) {
460             mPhone.notifyLocationChanged();
461         }
462
463         ArrayList<CellInfo> arrayCi = new ArrayList<CellInfo>();
464         synchronized(mCellInfo) {
465             CellInfoLte cil = (CellInfoLte)mCellInfo;
466
467             boolean cidChanged = ! mNewCellIdentityLte.equals(mLasteCellIdentityLte);
468             if (hasRegistered || hasDeregistered || cidChanged) {
469                 // TODO: Handle the absence of LteCellIdentity
470                 long timeStamp = SystemClock.elapsedRealtime() * 1000;
471                 boolean registered = mSS.getVoiceRegState() == ServiceState.STATE_IN_SERVICE;
472                 mLasteCellIdentityLte = mNewCellIdentityLte;
473
474                 cil.setRegisterd(registered);
475                 cil.setCellIdentity(mLasteCellIdentityLte);
476                 if (DBG) {
477                     log("pollStateDone: hasRegistered=" + hasRegistered +
478                             " hasDeregistered=" + hasDeregistered +
479                             " cidChanged=" + cidChanged +
480                             " mCellInfo=" + mCellInfo);
481                 }
482                 arrayCi.add(mCellInfo);
483             }
484             mPhoneBase.notifyCellInfo(arrayCi);
485         }
486     }
487
488     @Override
489     protected boolean onSignalStrengthResult(AsyncResult ar, boolean isGsm) {
490         if (mSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) {
491             isGsm = true;
492         }
493         boolean ssChanged = super.onSignalStrengthResult(ar, isGsm);
494
495         synchronized (mCellInfo) {
496             if (mSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) {
497                 mCellInfoLte.setTimeStamp(SystemClock.elapsedRealtime() * 1000);
498                 mCellInfoLte.setTimeStampType(CellInfo.TIMESTAMP_TYPE_JAVA_RIL);
499                 mCellInfoLte.getCellSignalStrength()
500                                 .initialize(mSignalStrength,SignalStrength.INVALID);
501             }
502             if (mCellInfoLte.getCellIdentity() != null) {
503                 ArrayList<CellInfo> arrayCi = new ArrayList<CellInfo>();
504                 arrayCi.add(mCellInfoLte);
505                 mPhoneBase.notifyCellInfo(arrayCi);
506             }
507         }
508         return ssChanged;
509     }
510
511     @Override
512     public boolean isConcurrentVoiceAndDataAllowed() {
513         // For non-LTE, look at the CSS indicator to check on Concurrent V & D capability
514         if (mSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) {
515             return true;
516         } else {
517             return mSS.getCssIndicator() == 1;
518         }
519     }
520
521     /**
522      * Check whether the specified SID and NID pair appears in the HOME SID/NID list
523      * read from NV or SIM.
524      *
525      * @return true if provided sid/nid pair belongs to operator's home network.
526      */
527     private boolean isInHomeSidNid(int sid, int nid) {
528         // if SID/NID is not available, assume this is home network.
529         if (isSidsAllZeros()) return true;
530
531         // length of SID/NID shold be same
532         if (mHomeSystemId.length != mHomeNetworkId.length) return true;
533
534         if (sid == 0) return true;
535
536         for (int i = 0; i < mHomeSystemId.length; i++) {
537             // Use SID only if NID is a reserved value.
538             // SID 0 and NID 0 and 65535 are reserved. (C.0005 2.6.5.2)
539             if ((mHomeSystemId[i] == sid) &&
540                 ((mHomeNetworkId[i] == 0) || (mHomeNetworkId[i] == 65535) ||
541                  (nid == 0) || (nid == 65535) || (mHomeNetworkId[i] == nid))) {
542                 return true;
543             }
544         }
545         // SID/NID are not in the list. So device is not in home network
546         return false;
547     }
548
549     /**
550      * TODO: Remove when we get new ril/modem for Galaxy Nexus.
551      *
552      * @return all available cell information, the returned List maybe empty but never null.
553      */
554     @Override
555     public List<CellInfo> getAllCellInfo() {
556         if (mCi.getRilVersion() >= 8) {
557             return super.getAllCellInfo();
558         } else {
559             ArrayList<CellInfo> arrayList = new ArrayList<CellInfo>();
560             CellInfo ci;
561             synchronized(mCellInfo) {
562                 arrayList.add(mCellInfoLte);
563             }
564             if (DBG) log ("getAllCellInfo: arrayList=" + arrayList);
565             return arrayList;
566         }
567     }
568
569     @Override
570     protected void log(String s) {
571         Rlog.d(LOG_TAG, "[CdmaLteSST] " + s);
572     }
573
574     @Override
575     protected void loge(String s) {
576         Rlog.e(LOG_TAG, "[CdmaLteSST] " + s);
577     }
578
579     @Override
580     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
581         pw.println("CdmaLteServiceStateTracker extends:");
582         super.dump(fd, pw, args);
583         pw.println(" mCdmaLtePhone=" + mCdmaLtePhone);
584     }
585 }