• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 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.analytics;
18 
19 import static com.android.internal.telephony.InboundSmsHandler.SOURCE_INJECTED_FROM_IMS;
20 import static com.android.internal.telephony.InboundSmsHandler.SOURCE_INJECTED_FROM_UNKNOWN;
21 import static com.android.internal.telephony.TelephonyStatsLog.INCOMING_SMS__ERROR__SMS_ERROR_GENERIC;
22 import static com.android.internal.telephony.TelephonyStatsLog.INCOMING_SMS__ERROR__SMS_ERROR_NOT_SUPPORTED;
23 import static com.android.internal.telephony.TelephonyStatsLog.INCOMING_SMS__ERROR__SMS_ERROR_NO_MEMORY;
24 import static com.android.internal.telephony.TelephonyStatsLog.INCOMING_SMS__ERROR__SMS_SUCCESS;
25 
26 import android.annotation.NonNull;
27 import android.annotation.Nullable;
28 import android.annotation.SuppressLint;
29 import android.app.Activity;
30 import android.content.BroadcastReceiver;
31 import android.content.Context;
32 import android.content.Intent;
33 import android.content.IntentFilter;
34 import android.os.Handler;
35 import android.os.HandlerThread;
36 import android.os.SystemClock;
37 import android.provider.Settings;
38 import android.provider.Telephony.Sms.Intents;
39 import android.telephony.Annotation;
40 import android.telephony.DisconnectCause;
41 import android.telephony.ServiceState;
42 import android.telephony.SmsManager;
43 import android.telephony.SubscriptionInfo;
44 import android.telephony.SubscriptionManager;
45 import android.telephony.TelephonyCallback;
46 import android.telephony.TelephonyManager;
47 import android.telephony.ims.ImsReasonInfo;
48 import android.telephony.ims.stub.ImsRegistrationImplBase;
49 
50 import com.android.internal.os.BackgroundThread;
51 import com.android.internal.telephony.InboundSmsHandler;
52 import com.android.internal.telephony.Phone;
53 import com.android.internal.telephony.PhoneConstants;
54 import com.android.internal.telephony.ServiceStateTracker;
55 import com.android.internal.telephony.flags.Flags;
56 import com.android.telephony.Rlog;
57 
58 import java.io.FileDescriptor;
59 import java.io.PrintWriter;
60 import java.util.ArrayList;
61 import java.util.HashMap;
62 import java.util.List;
63 import java.util.Map;
64 import java.util.concurrent.Executor;
65 import java.util.concurrent.ExecutorService;
66 import java.util.concurrent.Executors;
67 import java.util.concurrent.atomic.AtomicReference;
68 
69 /**
70  * Class to handle all telephony analytics related operations Initializes all the Analytics,
71  * Provider and Util classes. Registers the required Callbacks for supporting the
72  * ServiceStateAnalytics , SMS Analytics and Call Analytics
73  */
74 public class TelephonyAnalytics {
75     private static final String TAG = TelephonyAnalytics.class.getSimpleName();
76     protected static final int INVALID_SUB_ID = -1;
77     private final int mSlotIndex;
78     private final HandlerThread mHandlerThread;
79     private final Handler mHandler;
80     private ExecutorService mExecutorService;
81     protected TelephonyAnalyticsUtil mTelephonyAnalyticsUtil;
82     protected int mSubId;
83     protected ServiceStateAnalytics mServiceStateAnalytics;
84     protected Context mContext;
85     protected Executor mExecutor;
86     protected SubscriptionManager mSubscriptionManager;
87     protected final SubscriptionManager.OnSubscriptionsChangedListener
88             mSubscriptionsChangeListener =
89             new SubscriptionManager.OnSubscriptionsChangedListener() {
90                 @Override
91                 public void onSubscriptionsChanged() {
92                     int newSubId = getSubId();
93                     if ((mSubId != newSubId)
94                             && (newSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID)) {
95                         stopAnalytics(mSubId);
96                         mSubId = newSubId;
97                         startAnalytics(newSubId);
98                         Rlog.d(
99                                 TAG,
100                                 "Started Listener, mSubId = "
101                                         + mSubId
102                                         + "SlotId = "
103                                         + mSlotIndex);
104                     }
105                 }
106             };
107     protected CallAnalyticsProvider mCallAnalyticsProvider;
108     protected SmsMmsAnalyticsProvider mSmsMmsAnalyticsProvider;
109     protected ServiceStateAnalyticsProvider mServiceStateAnalyticsProvider;
110     protected SmsMmsAnalytics mSmsMmsAnalytics;
111     protected CallAnalytics mCallAnalytics;
112     protected Phone mPhone;
113 
TelephonyAnalytics(Phone phone)114     public TelephonyAnalytics(Phone phone) {
115         mPhone = phone;
116         mContext = mPhone.getContext();
117         mExecutor = Runnable::run;
118         mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class);
119         mSlotIndex = mPhone.getPhoneId();
120 
121         if (Flags.threadShred()) {
122             mHandlerThread = null; // TODO: maybe this doesn't need to be a member variable
123             mHandler = new Handler(BackgroundThread.get().getLooper());
124         } else {
125             mHandlerThread = new HandlerThread(TelephonyAnalytics.class.getSimpleName());
126             mHandlerThread.start();
127             mHandler = new Handler(mHandlerThread.getLooper());
128         }
129         mExecutorService = Executors.newSingleThreadExecutor();
130         mTelephonyAnalyticsUtil = TelephonyAnalyticsUtil.getInstance(mContext);
131         initializeAnalyticsClasses();
132         mCallAnalyticsProvider = new CallAnalyticsProvider(mTelephonyAnalyticsUtil, mSlotIndex);
133         mSmsMmsAnalyticsProvider = new SmsMmsAnalyticsProvider(mTelephonyAnalyticsUtil, mSlotIndex);
134         mServiceStateAnalyticsProvider =
135                 new ServiceStateAnalyticsProvider(mTelephonyAnalyticsUtil, mSlotIndex);
136 
137         startAnalytics(mSubId);
138 
139         if (mSubscriptionManager != null) {
140             mSubscriptionManager.addOnSubscriptionsChangedListener(
141                     mExecutor, mSubscriptionsChangeListener);
142             Rlog.d(TAG, "stopped listener");
143         }
144     }
145 
146     @SuppressLint("MissingPermission")
getSubId()147     private int getSubId() {
148         int subId = INVALID_SUB_ID;
149         try {
150             SubscriptionInfo info =
151                     mSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(mSlotIndex);
152             subId = info.getSubscriptionId();
153             Rlog.d("TelephonyAnalyticsSubId", "SubId = " + subId
154                     + "SlotIndex = " + mSlotIndex);
155         } catch (NullPointerException e) {
156             Rlog.e("TelephonyAnalyticsSubId", "Null Pointer Exception Caught");
157         }
158         return subId;
159     }
160 
initializeAnalyticsClasses()161     private void initializeAnalyticsClasses() {
162         mServiceStateAnalytics = new ServiceStateAnalytics(mExecutor);
163         mSmsMmsAnalytics = new SmsMmsAnalytics();
164         mCallAnalytics = new CallAnalytics();
165     }
166 
startAnalytics(int subId)167     protected void startAnalytics(int subId) {
168         if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
169             Rlog.d(
170                     "StartAnalytics",
171                     "Invalid SubId = " + SubscriptionManager.INVALID_SUBSCRIPTION_ID);
172             return;
173         }
174         mServiceStateAnalytics.registerMyListener(mContext, subId);
175     }
176 
stopAnalytics(int subId)177     protected void stopAnalytics(int subId) {
178         if (mServiceStateAnalytics != null) {
179             mServiceStateAnalytics.unregisterMyListener(subId);
180         }
181     }
182 
getSmsMmsAnalytics()183     public SmsMmsAnalytics getSmsMmsAnalytics() {
184         return mSmsMmsAnalytics;
185     }
186 
getCallAnalytics()187     public CallAnalytics getCallAnalytics() {
188         return mCallAnalytics;
189     }
190 
191     /**
192      * Uses the provider class objects,collects the aggregated report from the respective provider
193      * classes. Dumps the collected stats in the bugreport.
194      */
dump(FileDescriptor fd, PrintWriter pw, String[] args)195     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
196         pw.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
197         pw.println("+    Telephony Analytics Report [2 months] [Slot ID = " + mSlotIndex + "]  +");
198         pw.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
199         pw.println("Call Analytics Summary");
200         ArrayList<String> aggregatedCallInfo = mCallAnalyticsProvider.aggregate();
201         for (String info : aggregatedCallInfo) {
202             pw.println("\t" + info);
203         }
204         pw.println("-----------------------------------------------");
205         pw.println("SMS/MMS Analytics Summary");
206         ArrayList<String> aggregatedSmsMmsInfo = mSmsMmsAnalyticsProvider.aggregate();
207         for (String info : aggregatedSmsMmsInfo) {
208             pw.println("\t\t" + info);
209         }
210         pw.println("-----------------------------------------------");
211         mServiceStateAnalytics.recordCurrentStateBeforeDump();
212         pw.println("Service State Analytics Summary ");
213         ArrayList<String> aggregatedServiceStateInfo = mServiceStateAnalyticsProvider.aggregate();
214         for (String info : aggregatedServiceStateInfo) {
215             pw.println("\t\t" + info);
216         }
217         pw.println("-----------------------------------------------");
218     }
219 
220     /**
221      * Provides implementation for processing received Call related data. It implements functions to
222      * handle various scenarios pertaining to Calls. Passes the data to its provider class
223      * for further processing.
224      */
225     public class CallAnalytics {
226         private static final String TAG = CallAnalytics.class.getSimpleName();
227 
228         private enum Status {
229             SUCCESS("Success"),
230             FAILURE("Failure");
231             public String value;
232 
Status(String value)233             Status(String value) {
234                 this.value = value;
235             }
236         }
237 
238         private enum CallType {
239             NORMAL_CALL("Normal Call"),
240             SOS_CALL("SOS Call");
241             public String value;
242 
CallType(String value)243             CallType(String value) {
244                 this.value = value;
245             }
246         }
247 
CallAnalytics()248         public CallAnalytics() {}
249 
250         /**
251          * Collects and processes data related to calls once the call is terminated.
252          *
253          * @param isEmergency : Stores whether the call is an SOS call or not
254          * @param isOverIms : Stores whether the call is over IMS.
255          * @param rat : Stores the Radio Access Technology being used when the call ended
256          * @param simSlotIndex : Sim Slot from which call was operating.
257          * @param disconnectCause : Reason for call disconnect.
258          */
onCallTerminated( boolean isEmergency, boolean isOverIms, int rat, int simSlotIndex, int disconnectCause)259         public void onCallTerminated(
260                 boolean isEmergency,
261                 boolean isOverIms,
262                 int rat,
263                 int simSlotIndex,
264                 int disconnectCause) {
265             String disconnectCauseString;
266             String status;
267             String callType;
268             if (isEmergency) {
269                 callType = CallType.SOS_CALL.value;
270             } else {
271                 callType = CallType.NORMAL_CALL.value;
272             }
273             if (isOverIms) {
274                 disconnectCauseString =
275                         sImsCodeMap.getOrDefault(disconnectCause, "UNKNOWN_REJECT_CAUSE");
276                 if (disconnectCauseString.equals("UNKNOWN_REJECT_CAUSE")) {
277                     Rlog.d(TAG, "UNKNOWN_REJECT_CAUSE: " + disconnectCause);
278                 }
279                 status =
280                         disconnectCause == ImsReasonInfo.CODE_USER_TERMINATED
281                                 || disconnectCause
282                                 == ImsReasonInfo.CODE_USER_TERMINATED_BY_REMOTE
283                                 ? Status.SUCCESS.value
284                                 : Status.FAILURE.value;
285             } else {
286                 disconnectCauseString = DisconnectCause.toString(disconnectCause);
287                 status =
288                         disconnectCause == DisconnectCause.LOCAL
289                                 || disconnectCause == DisconnectCause.NORMAL
290                                 ? Status.SUCCESS.value
291                                 : Status.FAILURE.value;
292             }
293             String ratString = TelephonyManager.getNetworkTypeName(rat);
294             sendDataToProvider(callType, status, simSlotIndex, rat, ratString,
295                     disconnectCause, disconnectCauseString);
296         }
297 
sendDataToProvider(String callType, String status, int simSlotIndex, int rat, String ratString, int disconnectCause, String disconnectCauseString)298         private void sendDataToProvider(String callType, String status, int simSlotIndex,
299                 int rat, String ratString, int disconnectCause, String disconnectCauseString) {
300             mExecutorService.execute(() -> {
301                 mCallAnalyticsProvider.insertDataToDb(
302                         callType, status, simSlotIndex, ratString, disconnectCauseString);
303                 ArrayList<String> data;
304                 data =
305                         new ArrayList<>(
306                                 List.of(
307                                         callType,
308                                         status,
309                                         disconnectCauseString,
310                                         "(" + disconnectCause + ")",
311                                         ratString,
312                                         "(" + rat + ")",
313                                         Integer.toString(simSlotIndex)));
314                 Rlog.d(TAG, data.toString());
315             });
316         }
317 
318         private static final Map<Integer, String> sImsCodeMap;
319 
320         static {
321             sImsCodeMap = new HashMap<>();
sImsCodeMap.put(ImsReasonInfo.CODE_UNSPECIFIED, "CODE_UNSPECIFIED")322             sImsCodeMap.put(ImsReasonInfo.CODE_UNSPECIFIED, "CODE_UNSPECIFIED");
sImsCodeMap.put( ImsReasonInfo.CODE_LOCAL_ILLEGAL_ARGUMENT, "CODE_LOCAL_ILLEGAL_ARGUMENT")323             sImsCodeMap.put(
324                     ImsReasonInfo.CODE_LOCAL_ILLEGAL_ARGUMENT, "CODE_LOCAL_ILLEGAL_ARGUMENT");
sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_ILLEGAL_STATE, "CODE_LOCAL_ILLEGAL_STATE")325             sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_ILLEGAL_STATE, "CODE_LOCAL_ILLEGAL_STATE");
sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_INTERNAL_ERROR, "CODE_LOCAL_INTERNAL_ERROR")326             sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_INTERNAL_ERROR, "CODE_LOCAL_INTERNAL_ERROR");
sImsCodeMap.put( ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN, "CODE_LOCAL_IMS_SERVICE_DOWN")327             sImsCodeMap.put(
328                     ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN, "CODE_LOCAL_IMS_SERVICE_DOWN");
sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_NO_PENDING_CALL, "CODE_LOCAL_NO_PENDING_CALL")329             sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_NO_PENDING_CALL, "CODE_LOCAL_NO_PENDING_CALL");
sImsCodeMap.put( ImsReasonInfo.CODE_LOCAL_ENDED_BY_CONFERENCE_MERGE, "CODE_LOCAL_ENDED_BY_CONFERENCE_MERGE")330             sImsCodeMap.put(
331                     ImsReasonInfo.CODE_LOCAL_ENDED_BY_CONFERENCE_MERGE,
332                     "CODE_LOCAL_ENDED_BY_CONFERENCE_MERGE");
sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_POWER_OFF, "CODE_LOCAL_POWER_OFF")333             sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_POWER_OFF, "CODE_LOCAL_POWER_OFF");
sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_LOW_BATTERY, "CODE_LOCAL_LOW_BATTERY")334             sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_LOW_BATTERY, "CODE_LOCAL_LOW_BATTERY");
sImsCodeMap.put( ImsReasonInfo.CODE_LOCAL_NETWORK_NO_SERVICE, "CODE_LOCAL_NETWORK_NO_SERVICE")335             sImsCodeMap.put(
336                     ImsReasonInfo.CODE_LOCAL_NETWORK_NO_SERVICE, "CODE_LOCAL_NETWORK_NO_SERVICE");
sImsCodeMap.put( ImsReasonInfo.CODE_LOCAL_NETWORK_NO_LTE_COVERAGE, "CODE_LOCAL_NETWORK_NO_LTE_COVERAGE")337             sImsCodeMap.put(
338                     ImsReasonInfo.CODE_LOCAL_NETWORK_NO_LTE_COVERAGE,
339                     "CODE_LOCAL_NETWORK_NO_LTE_COVERAGE");
sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_NETWORK_ROAMING, "CODE_LOCAL_NETWORK_ROAMING")340             sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_NETWORK_ROAMING, "CODE_LOCAL_NETWORK_ROAMING");
sImsCodeMap.put( ImsReasonInfo.CODE_LOCAL_NETWORK_IP_CHANGED, "CODE_LOCAL_NETWORK_IP_CHANGED")341             sImsCodeMap.put(
342                     ImsReasonInfo.CODE_LOCAL_NETWORK_IP_CHANGED, "CODE_LOCAL_NETWORK_IP_CHANGED");
sImsCodeMap.put( ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE, "CODE_LOCAL_SERVICE_UNAVAILABLE")343             sImsCodeMap.put(
344                     ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE, "CODE_LOCAL_SERVICE_UNAVAILABLE");
sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, "CODE_LOCAL_NOT_REGISTERED")345             sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, "CODE_LOCAL_NOT_REGISTERED");
sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_CALL_EXCEEDED, "CODE_LOCAL_CALL_EXCEEDED")346             sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_CALL_EXCEEDED, "CODE_LOCAL_CALL_EXCEEDED");
sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_CALL_BUSY, "CODE_LOCAL_CALL_BUSY")347             sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_CALL_BUSY, "CODE_LOCAL_CALL_BUSY");
sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_CALL_DECLINE, "CODE_LOCAL_CALL_DECLINE")348             sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_CALL_DECLINE, "CODE_LOCAL_CALL_DECLINE");
sImsCodeMap.put( ImsReasonInfo.CODE_LOCAL_CALL_VCC_ON_PROGRESSING, "CODE_LOCAL_CALL_VCC_ON_PROGRESSING")349             sImsCodeMap.put(
350                     ImsReasonInfo.CODE_LOCAL_CALL_VCC_ON_PROGRESSING,
351                     "CODE_LOCAL_CALL_VCC_ON_PROGRESSING");
sImsCodeMap.put( ImsReasonInfo.CODE_LOCAL_CALL_RESOURCE_RESERVATION_FAILED, "CODE_LOCAL_CALL_RESOURCE_RESERVATION_FAILED")352             sImsCodeMap.put(
353                     ImsReasonInfo.CODE_LOCAL_CALL_RESOURCE_RESERVATION_FAILED,
354                     "CODE_LOCAL_CALL_RESOURCE_RESERVATION_FAILED");
sImsCodeMap.put( ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED, "CODE_LOCAL_CALL_CS_RETRY_REQUIRED")355             sImsCodeMap.put(
356                     ImsReasonInfo.CODE_LOCAL_CALL_CS_RETRY_REQUIRED,
357                     "CODE_LOCAL_CALL_CS_RETRY_REQUIRED");
sImsCodeMap.put( ImsReasonInfo.CODE_LOCAL_CALL_VOLTE_RETRY_REQUIRED, "CODE_LOCAL_CALL_VOLTE_RETRY_REQUIRED")358             sImsCodeMap.put(
359                     ImsReasonInfo.CODE_LOCAL_CALL_VOLTE_RETRY_REQUIRED,
360                     "CODE_LOCAL_CALL_VOLTE_RETRY_REQUIRED");
sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_CALL_TERMINATED, "CODE_LOCAL_CALL_TERMINATED")361             sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_CALL_TERMINATED, "CODE_LOCAL_CALL_TERMINATED");
sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_HO_NOT_FEASIBLE, "CODE_LOCAL_HO_NOT_FEASIBLE")362             sImsCodeMap.put(ImsReasonInfo.CODE_LOCAL_HO_NOT_FEASIBLE, "CODE_LOCAL_HO_NOT_FEASIBLE");
sImsCodeMap.put(ImsReasonInfo.CODE_TIMEOUT_1XX_WAITING, "CODE_TIMEOUT_1XX_WAITING")363             sImsCodeMap.put(ImsReasonInfo.CODE_TIMEOUT_1XX_WAITING, "CODE_TIMEOUT_1XX_WAITING");
sImsCodeMap.put(ImsReasonInfo.CODE_TIMEOUT_NO_ANSWER, "CODE_TIMEOUT_NO_ANSWER")364             sImsCodeMap.put(ImsReasonInfo.CODE_TIMEOUT_NO_ANSWER, "CODE_TIMEOUT_NO_ANSWER");
sImsCodeMap.put( ImsReasonInfo.CODE_TIMEOUT_NO_ANSWER_CALL_UPDATE, "CODE_TIMEOUT_NO_ANSWER_CALL_UPDATE")365             sImsCodeMap.put(
366                     ImsReasonInfo.CODE_TIMEOUT_NO_ANSWER_CALL_UPDATE,
367                     "CODE_TIMEOUT_NO_ANSWER_CALL_UPDATE");
sImsCodeMap.put(ImsReasonInfo.CODE_CALL_BARRED, "CODE_CALL_BARRED")368             sImsCodeMap.put(ImsReasonInfo.CODE_CALL_BARRED, "CODE_CALL_BARRED");
sImsCodeMap.put(ImsReasonInfo.CODE_FDN_BLOCKED, "CODE_FDN_BLOCKED")369             sImsCodeMap.put(ImsReasonInfo.CODE_FDN_BLOCKED, "CODE_FDN_BLOCKED");
sImsCodeMap.put(ImsReasonInfo.CODE_IMEI_NOT_ACCEPTED, "CODE_IMEI_NOT_ACCEPTED")370             sImsCodeMap.put(ImsReasonInfo.CODE_IMEI_NOT_ACCEPTED, "CODE_IMEI_NOT_ACCEPTED");
sImsCodeMap.put(ImsReasonInfo.CODE_DIAL_MODIFIED_TO_USSD, "CODE_DIAL_MODIFIED_TO_USSD")371             sImsCodeMap.put(ImsReasonInfo.CODE_DIAL_MODIFIED_TO_USSD, "CODE_DIAL_MODIFIED_TO_USSD");
sImsCodeMap.put(ImsReasonInfo.CODE_DIAL_MODIFIED_TO_SS, "CODE_DIAL_MODIFIED_TO_SS")372             sImsCodeMap.put(ImsReasonInfo.CODE_DIAL_MODIFIED_TO_SS, "CODE_DIAL_MODIFIED_TO_SS");
sImsCodeMap.put(ImsReasonInfo.CODE_DIAL_MODIFIED_TO_DIAL, "CODE_DIAL_MODIFIED_TO_DIAL")373             sImsCodeMap.put(ImsReasonInfo.CODE_DIAL_MODIFIED_TO_DIAL, "CODE_DIAL_MODIFIED_TO_DIAL");
sImsCodeMap.put( ImsReasonInfo.CODE_DIAL_MODIFIED_TO_DIAL_VIDEO, "CODE_DIAL_MODIFIED_TO_DIAL_VIDEO")374             sImsCodeMap.put(
375                     ImsReasonInfo.CODE_DIAL_MODIFIED_TO_DIAL_VIDEO,
376                     "CODE_DIAL_MODIFIED_TO_DIAL_VIDEO");
sImsCodeMap.put( ImsReasonInfo.CODE_DIAL_VIDEO_MODIFIED_TO_DIAL, "CODE_DIAL_VIDEO_MODIFIED_TO_DIAL")377             sImsCodeMap.put(
378                     ImsReasonInfo.CODE_DIAL_VIDEO_MODIFIED_TO_DIAL,
379                     "CODE_DIAL_VIDEO_MODIFIED_TO_DIAL");
sImsCodeMap.put( ImsReasonInfo.CODE_DIAL_VIDEO_MODIFIED_TO_DIAL_VIDEO, "CODE_DIAL_VIDEO_MODIFIED_TO_DIAL_VIDEO")380             sImsCodeMap.put(
381                     ImsReasonInfo.CODE_DIAL_VIDEO_MODIFIED_TO_DIAL_VIDEO,
382                     "CODE_DIAL_VIDEO_MODIFIED_TO_DIAL_VIDEO");
sImsCodeMap.put( ImsReasonInfo.CODE_DIAL_VIDEO_MODIFIED_TO_SS, "CODE_DIAL_VIDEO_MODIFIED_TO_SS")383             sImsCodeMap.put(
384                     ImsReasonInfo.CODE_DIAL_VIDEO_MODIFIED_TO_SS, "CODE_DIAL_VIDEO_MODIFIED_TO_SS");
sImsCodeMap.put( ImsReasonInfo.CODE_DIAL_VIDEO_MODIFIED_TO_USSD, "CODE_DIAL_VIDEO_MODIFIED_TO_USSD")385             sImsCodeMap.put(
386                     ImsReasonInfo.CODE_DIAL_VIDEO_MODIFIED_TO_USSD,
387                     "CODE_DIAL_VIDEO_MODIFIED_TO_USSD");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_REDIRECTED, "CODE_SIP_REDIRECTED")388             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_REDIRECTED, "CODE_SIP_REDIRECTED");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_BAD_REQUEST, "CODE_SIP_BAD_REQUEST")389             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_BAD_REQUEST, "CODE_SIP_BAD_REQUEST");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_FORBIDDEN, "CODE_SIP_FORBIDDEN")390             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_FORBIDDEN, "CODE_SIP_FORBIDDEN");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_NOT_FOUND, "CODE_SIP_NOT_FOUND")391             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_NOT_FOUND, "CODE_SIP_NOT_FOUND");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_NOT_SUPPORTED, "CODE_SIP_NOT_SUPPORTED")392             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_NOT_SUPPORTED, "CODE_SIP_NOT_SUPPORTED");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_REQUEST_TIMEOUT, "CODE_SIP_REQUEST_TIMEOUT")393             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_REQUEST_TIMEOUT, "CODE_SIP_REQUEST_TIMEOUT");
sImsCodeMap.put( ImsReasonInfo.CODE_SIP_TEMPRARILY_UNAVAILABLE, "CODE_SIP_TEMPRARILY_UNAVAILABLE")394             sImsCodeMap.put(
395                     ImsReasonInfo.CODE_SIP_TEMPRARILY_UNAVAILABLE,
396                     "CODE_SIP_TEMPRARILY_UNAVAILABLE");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_BAD_ADDRESS, "CODE_SIP_BAD_ADDRESS")397             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_BAD_ADDRESS, "CODE_SIP_BAD_ADDRESS");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_BUSY, "CODE_SIP_BUSY")398             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_BUSY, "CODE_SIP_BUSY");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_REQUEST_CANCELLED, "CODE_SIP_REQUEST_CANCELLED")399             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_REQUEST_CANCELLED, "CODE_SIP_REQUEST_CANCELLED");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_NOT_ACCEPTABLE, "CODE_SIP_NOT_ACCEPTABLE")400             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_NOT_ACCEPTABLE, "CODE_SIP_NOT_ACCEPTABLE");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_NOT_REACHABLE, "CODE_SIP_NOT_REACHABLE")401             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_NOT_REACHABLE, "CODE_SIP_NOT_REACHABLE");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_CLIENT_ERROR, "CODE_SIP_CLIENT_ERROR")402             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_CLIENT_ERROR, "CODE_SIP_CLIENT_ERROR");
sImsCodeMap.put( ImsReasonInfo.CODE_SIP_TRANSACTION_DOES_NOT_EXIST, "CODE_SIP_TRANSACTION_DOES_NOT_EXIST")403             sImsCodeMap.put(
404                     ImsReasonInfo.CODE_SIP_TRANSACTION_DOES_NOT_EXIST,
405                     "CODE_SIP_TRANSACTION_DOES_NOT_EXIST");
sImsCodeMap.put( ImsReasonInfo.CODE_SIP_SERVER_INTERNAL_ERROR, "CODE_SIP_SERVER_INTERNAL_ERROR")406             sImsCodeMap.put(
407                     ImsReasonInfo.CODE_SIP_SERVER_INTERNAL_ERROR, "CODE_SIP_SERVER_INTERNAL_ERROR");
sImsCodeMap.put( ImsReasonInfo.CODE_SIP_SERVICE_UNAVAILABLE, "CODE_SIP_SERVICE_UNAVAILABLE")408             sImsCodeMap.put(
409                     ImsReasonInfo.CODE_SIP_SERVICE_UNAVAILABLE, "CODE_SIP_SERVICE_UNAVAILABLE");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_SERVER_TIMEOUT, "CODE_SIP_SERVER_TIMEOUT")410             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_SERVER_TIMEOUT, "CODE_SIP_SERVER_TIMEOUT");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_SERVER_ERROR, "CODE_SIP_SERVER_ERROR")411             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_SERVER_ERROR, "CODE_SIP_SERVER_ERROR");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_USER_REJECTED, "CODE_SIP_USER_REJECTED")412             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_USER_REJECTED, "CODE_SIP_USER_REJECTED");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_GLOBAL_ERROR, "CODE_SIP_GLOBAL_ERROR")413             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_GLOBAL_ERROR, "CODE_SIP_GLOBAL_ERROR");
sImsCodeMap.put( ImsReasonInfo.CODE_EMERGENCY_TEMP_FAILURE, "CODE_EMERGENCY_TEMP_FAILURE")414             sImsCodeMap.put(
415                     ImsReasonInfo.CODE_EMERGENCY_TEMP_FAILURE, "CODE_EMERGENCY_TEMP_FAILURE");
sImsCodeMap.put( ImsReasonInfo.CODE_EMERGENCY_PERM_FAILURE, "CODE_EMERGENCY_PERM_FAILURE")416             sImsCodeMap.put(
417                     ImsReasonInfo.CODE_EMERGENCY_PERM_FAILURE, "CODE_EMERGENCY_PERM_FAILURE");
sImsCodeMap.put( ImsReasonInfo.CODE_SIP_USER_MARKED_UNWANTED, "CODE_SIP_USER_MARKED_UNWANTED")418             sImsCodeMap.put(
419                     ImsReasonInfo.CODE_SIP_USER_MARKED_UNWANTED, "CODE_SIP_USER_MARKED_UNWANTED");
sImsCodeMap.put( ImsReasonInfo.CODE_SIP_METHOD_NOT_ALLOWED, "CODE_SIP_METHOD_NOT_ALLOWED")420             sImsCodeMap.put(
421                     ImsReasonInfo.CODE_SIP_METHOD_NOT_ALLOWED, "CODE_SIP_METHOD_NOT_ALLOWED");
sImsCodeMap.put( ImsReasonInfo.CODE_SIP_PROXY_AUTHENTICATION_REQUIRED, "CODE_SIP_PROXY_AUTHENTICATION_REQUIRED")422             sImsCodeMap.put(
423                     ImsReasonInfo.CODE_SIP_PROXY_AUTHENTICATION_REQUIRED,
424                     "CODE_SIP_PROXY_AUTHENTICATION_REQUIRED");
sImsCodeMap.put( ImsReasonInfo.CODE_SIP_REQUEST_ENTITY_TOO_LARGE, "CODE_SIP_REQUEST_ENTITY_TOO_LARGE")425             sImsCodeMap.put(
426                     ImsReasonInfo.CODE_SIP_REQUEST_ENTITY_TOO_LARGE,
427                     "CODE_SIP_REQUEST_ENTITY_TOO_LARGE");
sImsCodeMap.put( ImsReasonInfo.CODE_SIP_REQUEST_URI_TOO_LARGE, "CODE_SIP_REQUEST_URI_TOO_LARGE")428             sImsCodeMap.put(
429                     ImsReasonInfo.CODE_SIP_REQUEST_URI_TOO_LARGE, "CODE_SIP_REQUEST_URI_TOO_LARGE");
sImsCodeMap.put( ImsReasonInfo.CODE_SIP_EXTENSION_REQUIRED, "CODE_SIP_EXTENSION_REQUIRED")430             sImsCodeMap.put(
431                     ImsReasonInfo.CODE_SIP_EXTENSION_REQUIRED, "CODE_SIP_EXTENSION_REQUIRED");
sImsCodeMap.put( ImsReasonInfo.CODE_SIP_INTERVAL_TOO_BRIEF, "CODE_SIP_INTERVAL_TOO_BRIEF")432             sImsCodeMap.put(
433                     ImsReasonInfo.CODE_SIP_INTERVAL_TOO_BRIEF, "CODE_SIP_INTERVAL_TOO_BRIEF");
sImsCodeMap.put( ImsReasonInfo.CODE_SIP_CALL_OR_TRANS_DOES_NOT_EXIST, "CODE_SIP_CALL_OR_TRANS_DOES_NOT_EXIST")434             sImsCodeMap.put(
435                     ImsReasonInfo.CODE_SIP_CALL_OR_TRANS_DOES_NOT_EXIST,
436                     "CODE_SIP_CALL_OR_TRANS_DOES_NOT_EXIST");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_LOOP_DETECTED, "CODE_SIP_LOOP_DETECTED")437             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_LOOP_DETECTED, "CODE_SIP_LOOP_DETECTED");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_TOO_MANY_HOPS, "CODE_SIP_TOO_MANY_HOPS")438             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_TOO_MANY_HOPS, "CODE_SIP_TOO_MANY_HOPS");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_AMBIGUOUS, "CODE_SIP_AMBIGUOUS")439             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_AMBIGUOUS, "CODE_SIP_AMBIGUOUS");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_REQUEST_PENDING, "CODE_SIP_REQUEST_PENDING")440             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_REQUEST_PENDING, "CODE_SIP_REQUEST_PENDING");
sImsCodeMap.put(ImsReasonInfo.CODE_SIP_UNDECIPHERABLE, "CODE_SIP_UNDECIPHERABLE")441             sImsCodeMap.put(ImsReasonInfo.CODE_SIP_UNDECIPHERABLE, "CODE_SIP_UNDECIPHERABLE");
sImsCodeMap.put(ImsReasonInfo.CODE_MEDIA_INIT_FAILED, "CODE_MEDIA_INIT_FAILED")442             sImsCodeMap.put(ImsReasonInfo.CODE_MEDIA_INIT_FAILED, "CODE_MEDIA_INIT_FAILED");
sImsCodeMap.put(ImsReasonInfo.CODE_MEDIA_NO_DATA, "CODE_MEDIA_NO_DATA")443             sImsCodeMap.put(ImsReasonInfo.CODE_MEDIA_NO_DATA, "CODE_MEDIA_NO_DATA");
sImsCodeMap.put(ImsReasonInfo.CODE_MEDIA_NOT_ACCEPTABLE, "CODE_MEDIA_NOT_ACCEPTABLE")444             sImsCodeMap.put(ImsReasonInfo.CODE_MEDIA_NOT_ACCEPTABLE, "CODE_MEDIA_NOT_ACCEPTABLE");
sImsCodeMap.put(ImsReasonInfo.CODE_MEDIA_UNSPECIFIED, "CODE_MEDIA_UNSPECIFIED")445             sImsCodeMap.put(ImsReasonInfo.CODE_MEDIA_UNSPECIFIED, "CODE_MEDIA_UNSPECIFIED");
sImsCodeMap.put(ImsReasonInfo.CODE_USER_TERMINATED, "CODE_USER_TERMINATED")446             sImsCodeMap.put(ImsReasonInfo.CODE_USER_TERMINATED, "CODE_USER_TERMINATED");
sImsCodeMap.put(ImsReasonInfo.CODE_USER_NOANSWER, "CODE_USER_NOANSWER")447             sImsCodeMap.put(ImsReasonInfo.CODE_USER_NOANSWER, "CODE_USER_NOANSWER");
sImsCodeMap.put(ImsReasonInfo.CODE_USER_IGNORE, "CODE_USER_IGNORE")448             sImsCodeMap.put(ImsReasonInfo.CODE_USER_IGNORE, "CODE_USER_IGNORE");
sImsCodeMap.put(ImsReasonInfo.CODE_USER_DECLINE, "CODE_USER_DECLINE")449             sImsCodeMap.put(ImsReasonInfo.CODE_USER_DECLINE, "CODE_USER_DECLINE");
sImsCodeMap.put(ImsReasonInfo.CODE_LOW_BATTERY, "CODE_LOW_BATTERY")450             sImsCodeMap.put(ImsReasonInfo.CODE_LOW_BATTERY, "CODE_LOW_BATTERY");
sImsCodeMap.put(ImsReasonInfo.CODE_BLACKLISTED_CALL_ID, "CODE_BLACKLISTED_CALL_ID")451             sImsCodeMap.put(ImsReasonInfo.CODE_BLACKLISTED_CALL_ID, "CODE_BLACKLISTED_CALL_ID");
sImsCodeMap.put( ImsReasonInfo.CODE_USER_TERMINATED_BY_REMOTE, "CODE_USER_TERMINATED_BY_REMOTE")452             sImsCodeMap.put(
453                     ImsReasonInfo.CODE_USER_TERMINATED_BY_REMOTE, "CODE_USER_TERMINATED_BY_REMOTE");
sImsCodeMap.put( ImsReasonInfo.CODE_USER_REJECTED_SESSION_MODIFICATION, "CODE_USER_REJECTED_SESSION_MODIFICATION")454             sImsCodeMap.put(
455                     ImsReasonInfo.CODE_USER_REJECTED_SESSION_MODIFICATION,
456                     "CODE_USER_REJECTED_SESSION_MODIFICATION");
sImsCodeMap.put( ImsReasonInfo.CODE_USER_CANCELLED_SESSION_MODIFICATION, "CODE_USER_CANCELLED_SESSION_MODIFICATION")457             sImsCodeMap.put(
458                     ImsReasonInfo.CODE_USER_CANCELLED_SESSION_MODIFICATION,
459                     "CODE_USER_CANCELLED_SESSION_MODIFICATION");
sImsCodeMap.put( ImsReasonInfo.CODE_SESSION_MODIFICATION_FAILED, "CODE_SESSION_MODIFICATION_FAILED")460             sImsCodeMap.put(
461                     ImsReasonInfo.CODE_SESSION_MODIFICATION_FAILED,
462                     "CODE_SESSION_MODIFICATION_FAILED");
sImsCodeMap.put(ImsReasonInfo.CODE_UT_NOT_SUPPORTED, "CODE_UT_NOT_SUPPORTED")463             sImsCodeMap.put(ImsReasonInfo.CODE_UT_NOT_SUPPORTED, "CODE_UT_NOT_SUPPORTED");
sImsCodeMap.put( ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, "CODE_UT_SERVICE_UNAVAILABLE")464             sImsCodeMap.put(
465                     ImsReasonInfo.CODE_UT_SERVICE_UNAVAILABLE, "CODE_UT_SERVICE_UNAVAILABLE");
sImsCodeMap.put( ImsReasonInfo.CODE_UT_OPERATION_NOT_ALLOWED, "CODE_UT_OPERATION_NOT_ALLOWED")466             sImsCodeMap.put(
467                     ImsReasonInfo.CODE_UT_OPERATION_NOT_ALLOWED, "CODE_UT_OPERATION_NOT_ALLOWED");
sImsCodeMap.put(ImsReasonInfo.CODE_UT_NETWORK_ERROR, "CODE_UT_NETWORK_ERROR")468             sImsCodeMap.put(ImsReasonInfo.CODE_UT_NETWORK_ERROR, "CODE_UT_NETWORK_ERROR");
sImsCodeMap.put( ImsReasonInfo.CODE_UT_CB_PASSWORD_MISMATCH, "CODE_UT_CB_PASSWORD_MISMATCH")469             sImsCodeMap.put(
470                     ImsReasonInfo.CODE_UT_CB_PASSWORD_MISMATCH, "CODE_UT_CB_PASSWORD_MISMATCH");
sImsCodeMap.put( ImsReasonInfo.CODE_UT_SS_MODIFIED_TO_DIAL, "CODE_UT_SS_MODIFIED_TO_DIAL")471             sImsCodeMap.put(
472                     ImsReasonInfo.CODE_UT_SS_MODIFIED_TO_DIAL, "CODE_UT_SS_MODIFIED_TO_DIAL");
sImsCodeMap.put( ImsReasonInfo.CODE_UT_SS_MODIFIED_TO_USSD, "CODE_UT_SS_MODIFIED_TO_USSD")473             sImsCodeMap.put(
474                     ImsReasonInfo.CODE_UT_SS_MODIFIED_TO_USSD, "CODE_UT_SS_MODIFIED_TO_USSD");
sImsCodeMap.put(ImsReasonInfo.CODE_UT_SS_MODIFIED_TO_SS, "CODE_UT_SS_MODIFIED_TO_SS")475             sImsCodeMap.put(ImsReasonInfo.CODE_UT_SS_MODIFIED_TO_SS, "CODE_UT_SS_MODIFIED_TO_SS");
sImsCodeMap.put( ImsReasonInfo.CODE_UT_SS_MODIFIED_TO_DIAL_VIDEO, "CODE_UT_SS_MODIFIED_TO_DIAL_VIDEO")476             sImsCodeMap.put(
477                     ImsReasonInfo.CODE_UT_SS_MODIFIED_TO_DIAL_VIDEO,
478                     "CODE_UT_SS_MODIFIED_TO_DIAL_VIDEO");
sImsCodeMap.put(ImsReasonInfo.CODE_ECBM_NOT_SUPPORTED, "CODE_ECBM_NOT_SUPPORTED")479             sImsCodeMap.put(ImsReasonInfo.CODE_ECBM_NOT_SUPPORTED, "CODE_ECBM_NOT_SUPPORTED");
sImsCodeMap.put( ImsReasonInfo.CODE_MULTIENDPOINT_NOT_SUPPORTED, "CODE_MULTIENDPOINT_NOT_SUPPORTED")480             sImsCodeMap.put(
481                     ImsReasonInfo.CODE_MULTIENDPOINT_NOT_SUPPORTED,
482                     "CODE_MULTIENDPOINT_NOT_SUPPORTED");
sImsCodeMap.put(ImsReasonInfo.CODE_REGISTRATION_ERROR, "CODE_REGISTRATION_ERROR")483             sImsCodeMap.put(ImsReasonInfo.CODE_REGISTRATION_ERROR, "CODE_REGISTRATION_ERROR");
sImsCodeMap.put(ImsReasonInfo.CODE_ANSWERED_ELSEWHERE, "CODE_ANSWERED_ELSEWHERE")484             sImsCodeMap.put(ImsReasonInfo.CODE_ANSWERED_ELSEWHERE, "CODE_ANSWERED_ELSEWHERE");
sImsCodeMap.put(ImsReasonInfo.CODE_CALL_PULL_OUT_OF_SYNC, "CODE_CALL_PULL_OUT_OF_SYNC")485             sImsCodeMap.put(ImsReasonInfo.CODE_CALL_PULL_OUT_OF_SYNC, "CODE_CALL_PULL_OUT_OF_SYNC");
sImsCodeMap.put( ImsReasonInfo.CODE_CALL_END_CAUSE_CALL_PULL, "CODE_CALL_END_CAUSE_CALL_PULL")486             sImsCodeMap.put(
487                     ImsReasonInfo.CODE_CALL_END_CAUSE_CALL_PULL, "CODE_CALL_END_CAUSE_CALL_PULL");
sImsCodeMap.put( ImsReasonInfo.CODE_CALL_DROP_IWLAN_TO_LTE_UNAVAILABLE, "CODE_CALL_DROP_IWLAN_TO_LTE_UNAVAILABLE")488             sImsCodeMap.put(
489                     ImsReasonInfo.CODE_CALL_DROP_IWLAN_TO_LTE_UNAVAILABLE,
490                     "CODE_CALL_DROP_IWLAN_TO_LTE_UNAVAILABLE");
sImsCodeMap.put(ImsReasonInfo.CODE_REJECTED_ELSEWHERE, "CODE_REJECTED_ELSEWHERE")491             sImsCodeMap.put(ImsReasonInfo.CODE_REJECTED_ELSEWHERE, "CODE_REJECTED_ELSEWHERE");
sImsCodeMap.put(ImsReasonInfo.CODE_SUPP_SVC_FAILED, "CODE_SUPP_SVC_FAILED")492             sImsCodeMap.put(ImsReasonInfo.CODE_SUPP_SVC_FAILED, "CODE_SUPP_SVC_FAILED");
sImsCodeMap.put(ImsReasonInfo.CODE_SUPP_SVC_CANCELLED, "CODE_SUPP_SVC_CANCELLED")493             sImsCodeMap.put(ImsReasonInfo.CODE_SUPP_SVC_CANCELLED, "CODE_SUPP_SVC_CANCELLED");
sImsCodeMap.put( ImsReasonInfo.CODE_SUPP_SVC_REINVITE_COLLISION, "CODE_SUPP_SVC_REINVITE_COLLISION")494             sImsCodeMap.put(
495                     ImsReasonInfo.CODE_SUPP_SVC_REINVITE_COLLISION,
496                     "CODE_SUPP_SVC_REINVITE_COLLISION");
sImsCodeMap.put(ImsReasonInfo.CODE_IWLAN_DPD_FAILURE, "CODE_IWLAN_DPD_FAILURE")497             sImsCodeMap.put(ImsReasonInfo.CODE_IWLAN_DPD_FAILURE, "CODE_IWLAN_DPD_FAILURE");
sImsCodeMap.put( ImsReasonInfo.CODE_EPDG_TUNNEL_ESTABLISH_FAILURE, "CODE_EPDG_TUNNEL_ESTABLISH_FAILURE")498             sImsCodeMap.put(
499                     ImsReasonInfo.CODE_EPDG_TUNNEL_ESTABLISH_FAILURE,
500                     "CODE_EPDG_TUNNEL_ESTABLISH_FAILURE");
sImsCodeMap.put( ImsReasonInfo.CODE_EPDG_TUNNEL_REKEY_FAILURE, "CODE_EPDG_TUNNEL_REKEY_FAILURE")501             sImsCodeMap.put(
502                     ImsReasonInfo.CODE_EPDG_TUNNEL_REKEY_FAILURE, "CODE_EPDG_TUNNEL_REKEY_FAILURE");
sImsCodeMap.put( ImsReasonInfo.CODE_EPDG_TUNNEL_LOST_CONNECTION, "CODE_EPDG_TUNNEL_LOST_CONNECTION")503             sImsCodeMap.put(
504                     ImsReasonInfo.CODE_EPDG_TUNNEL_LOST_CONNECTION,
505                     "CODE_EPDG_TUNNEL_LOST_CONNECTION");
sImsCodeMap.put( ImsReasonInfo.CODE_MAXIMUM_NUMBER_OF_CALLS_REACHED, "CODE_MAXIMUM_NUMBER_OF_CALLS_REACHED")506             sImsCodeMap.put(
507                     ImsReasonInfo.CODE_MAXIMUM_NUMBER_OF_CALLS_REACHED,
508                     "CODE_MAXIMUM_NUMBER_OF_CALLS_REACHED");
sImsCodeMap.put(ImsReasonInfo.CODE_REMOTE_CALL_DECLINE, "CODE_REMOTE_CALL_DECLINE")509             sImsCodeMap.put(ImsReasonInfo.CODE_REMOTE_CALL_DECLINE, "CODE_REMOTE_CALL_DECLINE");
sImsCodeMap.put(ImsReasonInfo.CODE_DATA_LIMIT_REACHED, "CODE_DATA_LIMIT_REACHED")510             sImsCodeMap.put(ImsReasonInfo.CODE_DATA_LIMIT_REACHED, "CODE_DATA_LIMIT_REACHED");
sImsCodeMap.put(ImsReasonInfo.CODE_DATA_DISABLED, "CODE_DATA_DISABLED")511             sImsCodeMap.put(ImsReasonInfo.CODE_DATA_DISABLED, "CODE_DATA_DISABLED");
sImsCodeMap.put(ImsReasonInfo.CODE_WIFI_LOST, "CODE_WIFI_LOST")512             sImsCodeMap.put(ImsReasonInfo.CODE_WIFI_LOST, "CODE_WIFI_LOST");
sImsCodeMap.put(ImsReasonInfo.CODE_IKEV2_AUTH_FAILURE, "CODE_IKEV2_AUTH_FAILURE")513             sImsCodeMap.put(ImsReasonInfo.CODE_IKEV2_AUTH_FAILURE, "CODE_IKEV2_AUTH_FAILURE");
sImsCodeMap.put(ImsReasonInfo.CODE_RADIO_OFF, "CODE_RADIO_OFF")514             sImsCodeMap.put(ImsReasonInfo.CODE_RADIO_OFF, "CODE_RADIO_OFF");
sImsCodeMap.put(ImsReasonInfo.CODE_NO_VALID_SIM, "CODE_NO_VALID_SIM")515             sImsCodeMap.put(ImsReasonInfo.CODE_NO_VALID_SIM, "CODE_NO_VALID_SIM");
sImsCodeMap.put(ImsReasonInfo.CODE_RADIO_INTERNAL_ERROR, "CODE_RADIO_INTERNAL_ERROR")516             sImsCodeMap.put(ImsReasonInfo.CODE_RADIO_INTERNAL_ERROR, "CODE_RADIO_INTERNAL_ERROR");
sImsCodeMap.put(ImsReasonInfo.CODE_NETWORK_RESP_TIMEOUT, "CODE_NETWORK_RESP_TIMEOUT")517             sImsCodeMap.put(ImsReasonInfo.CODE_NETWORK_RESP_TIMEOUT, "CODE_NETWORK_RESP_TIMEOUT");
sImsCodeMap.put(ImsReasonInfo.CODE_NETWORK_REJECT, "CODE_NETWORK_REJECT")518             sImsCodeMap.put(ImsReasonInfo.CODE_NETWORK_REJECT, "CODE_NETWORK_REJECT");
sImsCodeMap.put(ImsReasonInfo.CODE_RADIO_ACCESS_FAILURE, "CODE_RADIO_ACCESS_FAILURE")519             sImsCodeMap.put(ImsReasonInfo.CODE_RADIO_ACCESS_FAILURE, "CODE_RADIO_ACCESS_FAILURE");
sImsCodeMap.put(ImsReasonInfo.CODE_RADIO_LINK_FAILURE, "CODE_RADIO_LINK_FAILURE")520             sImsCodeMap.put(ImsReasonInfo.CODE_RADIO_LINK_FAILURE, "CODE_RADIO_LINK_FAILURE");
sImsCodeMap.put(ImsReasonInfo.CODE_RADIO_LINK_LOST, "CODE_RADIO_LINK_LOST")521             sImsCodeMap.put(ImsReasonInfo.CODE_RADIO_LINK_LOST, "CODE_RADIO_LINK_LOST");
sImsCodeMap.put(ImsReasonInfo.CODE_RADIO_UPLINK_FAILURE, "CODE_RADIO_UPLINK_FAILURE")522             sImsCodeMap.put(ImsReasonInfo.CODE_RADIO_UPLINK_FAILURE, "CODE_RADIO_UPLINK_FAILURE");
sImsCodeMap.put(ImsReasonInfo.CODE_RADIO_SETUP_FAILURE, "CODE_RADIO_SETUP_FAILURE")523             sImsCodeMap.put(ImsReasonInfo.CODE_RADIO_SETUP_FAILURE, "CODE_RADIO_SETUP_FAILURE");
sImsCodeMap.put(ImsReasonInfo.CODE_RADIO_RELEASE_NORMAL, "CODE_RADIO_RELEASE_NORMAL")524             sImsCodeMap.put(ImsReasonInfo.CODE_RADIO_RELEASE_NORMAL, "CODE_RADIO_RELEASE_NORMAL");
sImsCodeMap.put( ImsReasonInfo.CODE_RADIO_RELEASE_ABNORMAL, "CODE_RADIO_RELEASE_ABNORMAL")525             sImsCodeMap.put(
526                     ImsReasonInfo.CODE_RADIO_RELEASE_ABNORMAL, "CODE_RADIO_RELEASE_ABNORMAL");
sImsCodeMap.put(ImsReasonInfo.CODE_ACCESS_CLASS_BLOCKED, "CODE_ACCESS_CLASS_BLOCKED")527             sImsCodeMap.put(ImsReasonInfo.CODE_ACCESS_CLASS_BLOCKED, "CODE_ACCESS_CLASS_BLOCKED");
sImsCodeMap.put(ImsReasonInfo.CODE_NETWORK_DETACH, "CODE_NETWORK_DETACH")528             sImsCodeMap.put(ImsReasonInfo.CODE_NETWORK_DETACH, "CODE_NETWORK_DETACH");
sImsCodeMap.put( ImsReasonInfo.CODE_SIP_ALTERNATE_EMERGENCY_CALL, "CODE_SIP_ALTERNATE_EMERGENCY_CALL")529             sImsCodeMap.put(
530                     ImsReasonInfo.CODE_SIP_ALTERNATE_EMERGENCY_CALL,
531                     "CODE_SIP_ALTERNATE_EMERGENCY_CALL");
sImsCodeMap.put(ImsReasonInfo.CODE_UNOBTAINABLE_NUMBER, "CODE_UNOBTAINABLE_NUMBER")532             sImsCodeMap.put(ImsReasonInfo.CODE_UNOBTAINABLE_NUMBER, "CODE_UNOBTAINABLE_NUMBER");
sImsCodeMap.put(ImsReasonInfo.CODE_NO_CSFB_IN_CS_ROAM, "CODE_NO_CSFB_IN_CS_ROAM")533             sImsCodeMap.put(ImsReasonInfo.CODE_NO_CSFB_IN_CS_ROAM, "CODE_NO_CSFB_IN_CS_ROAM");
sImsCodeMap.put(ImsReasonInfo.CODE_REJECT_UNKNOWN, "CODE_REJECT_UNKNOWN")534             sImsCodeMap.put(ImsReasonInfo.CODE_REJECT_UNKNOWN, "CODE_REJECT_UNKNOWN");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_ONGOING_CALL_WAITING_DISABLED, "CODE_REJECT_ONGOING_CALL_WAITING_DISABLED")535             sImsCodeMap.put(
536                     ImsReasonInfo.CODE_REJECT_ONGOING_CALL_WAITING_DISABLED,
537                     "CODE_REJECT_ONGOING_CALL_WAITING_DISABLED");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_CALL_ON_OTHER_SUB, "CODE_REJECT_CALL_ON_OTHER_SUB")538             sImsCodeMap.put(
539                     ImsReasonInfo.CODE_REJECT_CALL_ON_OTHER_SUB, "CODE_REJECT_CALL_ON_OTHER_SUB");
sImsCodeMap.put(ImsReasonInfo.CODE_REJECT_1X_COLLISION, "CODE_REJECT_1X_COLLISION")540             sImsCodeMap.put(ImsReasonInfo.CODE_REJECT_1X_COLLISION, "CODE_REJECT_1X_COLLISION");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_SERVICE_NOT_REGISTERED, "CODE_REJECT_SERVICE_NOT_REGISTERED")541             sImsCodeMap.put(
542                     ImsReasonInfo.CODE_REJECT_SERVICE_NOT_REGISTERED,
543                     "CODE_REJECT_SERVICE_NOT_REGISTERED");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_CALL_TYPE_NOT_ALLOWED, "CODE_REJECT_CALL_TYPE_NOT_ALLOWED")544             sImsCodeMap.put(
545                     ImsReasonInfo.CODE_REJECT_CALL_TYPE_NOT_ALLOWED,
546                     "CODE_REJECT_CALL_TYPE_NOT_ALLOWED");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_ONGOING_E911_CALL, "CODE_REJECT_ONGOING_E911_CALL")547             sImsCodeMap.put(
548                     ImsReasonInfo.CODE_REJECT_ONGOING_E911_CALL, "CODE_REJECT_ONGOING_E911_CALL");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_ONGOING_CALL_SETUP, "CODE_REJECT_ONGOING_CALL_SETUP")549             sImsCodeMap.put(
550                     ImsReasonInfo.CODE_REJECT_ONGOING_CALL_SETUP, "CODE_REJECT_ONGOING_CALL_SETUP");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_MAX_CALL_LIMIT_REACHED, "CODE_REJECT_MAX_CALL_LIMIT_REACHED")551             sImsCodeMap.put(
552                     ImsReasonInfo.CODE_REJECT_MAX_CALL_LIMIT_REACHED,
553                     "CODE_REJECT_MAX_CALL_LIMIT_REACHED");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_UNSUPPORTED_SIP_HEADERS, "CODE_REJECT_UNSUPPORTED_SIP_HEADERS")554             sImsCodeMap.put(
555                     ImsReasonInfo.CODE_REJECT_UNSUPPORTED_SIP_HEADERS,
556                     "CODE_REJECT_UNSUPPORTED_SIP_HEADERS");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_UNSUPPORTED_SDP_HEADERS, "CODE_REJECT_UNSUPPORTED_SDP_HEADERS")557             sImsCodeMap.put(
558                     ImsReasonInfo.CODE_REJECT_UNSUPPORTED_SDP_HEADERS,
559                     "CODE_REJECT_UNSUPPORTED_SDP_HEADERS");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_ONGOING_CALL_TRANSFER, "CODE_REJECT_ONGOING_CALL_TRANSFER")560             sImsCodeMap.put(
561                     ImsReasonInfo.CODE_REJECT_ONGOING_CALL_TRANSFER,
562                     "CODE_REJECT_ONGOING_CALL_TRANSFER");
sImsCodeMap.put(ImsReasonInfo.CODE_REJECT_INTERNAL_ERROR, "CODE_REJECT_INTERNAL_ERROR")563             sImsCodeMap.put(ImsReasonInfo.CODE_REJECT_INTERNAL_ERROR, "CODE_REJECT_INTERNAL_ERROR");
sImsCodeMap.put(ImsReasonInfo.CODE_REJECT_QOS_FAILURE, "CODE_REJECT_QOS_FAILURE")564             sImsCodeMap.put(ImsReasonInfo.CODE_REJECT_QOS_FAILURE, "CODE_REJECT_QOS_FAILURE");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_ONGOING_HANDOVER, "CODE_REJECT_ONGOING_HANDOVER")565             sImsCodeMap.put(
566                     ImsReasonInfo.CODE_REJECT_ONGOING_HANDOVER, "CODE_REJECT_ONGOING_HANDOVER");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_VT_TTY_NOT_ALLOWED, "CODE_REJECT_VT_TTY_NOT_ALLOWED")567             sImsCodeMap.put(
568                     ImsReasonInfo.CODE_REJECT_VT_TTY_NOT_ALLOWED, "CODE_REJECT_VT_TTY_NOT_ALLOWED");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_ONGOING_CALL_UPGRADE, "CODE_REJECT_ONGOING_CALL_UPGRADE")569             sImsCodeMap.put(
570                     ImsReasonInfo.CODE_REJECT_ONGOING_CALL_UPGRADE,
571                     "CODE_REJECT_ONGOING_CALL_UPGRADE");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_CONFERENCE_TTY_NOT_ALLOWED, "CODE_REJECT_CONFERENCE_TTY_NOT_ALLOWED")572             sImsCodeMap.put(
573                     ImsReasonInfo.CODE_REJECT_CONFERENCE_TTY_NOT_ALLOWED,
574                     "CODE_REJECT_CONFERENCE_TTY_NOT_ALLOWED");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_ONGOING_CONFERENCE_CALL, "CODE_REJECT_ONGOING_CONFERENCE_CALL")575             sImsCodeMap.put(
576                     ImsReasonInfo.CODE_REJECT_ONGOING_CONFERENCE_CALL,
577                     "CODE_REJECT_ONGOING_CONFERENCE_CALL");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_VT_AVPF_NOT_ALLOWED, "CODE_REJECT_VT_AVPF_NOT_ALLOWED")578             sImsCodeMap.put(
579                     ImsReasonInfo.CODE_REJECT_VT_AVPF_NOT_ALLOWED,
580                     "CODE_REJECT_VT_AVPF_NOT_ALLOWED");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_ONGOING_ENCRYPTED_CALL, "CODE_REJECT_ONGOING_ENCRYPTED_CALL")581             sImsCodeMap.put(
582                     ImsReasonInfo.CODE_REJECT_ONGOING_ENCRYPTED_CALL,
583                     "CODE_REJECT_ONGOING_ENCRYPTED_CALL");
sImsCodeMap.put( ImsReasonInfo.CODE_REJECT_ONGOING_CS_CALL, "CODE_REJECT_ONGOING_CS_CALL")584             sImsCodeMap.put(
585                     ImsReasonInfo.CODE_REJECT_ONGOING_CS_CALL, "CODE_REJECT_ONGOING_CS_CALL");
sImsCodeMap.put(ImsReasonInfo.CODE_NETWORK_CONGESTION, "CODE_NETWORK_CONGESTION")586             sImsCodeMap.put(ImsReasonInfo.CODE_NETWORK_CONGESTION, "CODE_NETWORK_CONGESTION");
sImsCodeMap.put( ImsReasonInfo.CODE_RETRY_ON_IMS_WITHOUT_RTT, "CODE_RETRY_ON_IMS_WITHOUT_RTT")587             sImsCodeMap.put(
588                     ImsReasonInfo.CODE_RETRY_ON_IMS_WITHOUT_RTT, "CODE_RETRY_ON_IMS_WITHOUT_RTT");
sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_1, "CODE_OEM_CAUSE_1")589             sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_1, "CODE_OEM_CAUSE_1");
sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_2, "CODE_OEM_CAUSE_2")590             sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_2, "CODE_OEM_CAUSE_2");
sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_3, "CODE_OEM_CAUSE_3")591             sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_3, "CODE_OEM_CAUSE_3");
sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_4, "CODE_OEM_CAUSE_4")592             sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_4, "CODE_OEM_CAUSE_4");
sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_5, "CODE_OEM_CAUSE_5")593             sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_5, "CODE_OEM_CAUSE_5");
sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_6, "CODE_OEM_CAUSE_6")594             sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_6, "CODE_OEM_CAUSE_6");
sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_7, "CODE_OEM_CAUSE_7")595             sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_7, "CODE_OEM_CAUSE_7");
sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_8, "CODE_OEM_CAUSE_8")596             sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_8, "CODE_OEM_CAUSE_8");
sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_9, "CODE_OEM_CAUSE_9")597             sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_9, "CODE_OEM_CAUSE_9");
sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_10, "CODE_OEM_CAUSE_10")598             sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_10, "CODE_OEM_CAUSE_10");
sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_11, "CODE_OEM_CAUSE_11")599             sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_11, "CODE_OEM_CAUSE_11");
sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_12, "CODE_OEM_CAUSE_12")600             sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_12, "CODE_OEM_CAUSE_12");
sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_13, "CODE_OEM_CAUSE_13")601             sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_13, "CODE_OEM_CAUSE_13");
sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_14, "CODE_OEM_CAUSE_14")602             sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_14, "CODE_OEM_CAUSE_14");
sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_15, "CODE_OEM_CAUSE_15")603             sImsCodeMap.put(ImsReasonInfo.CODE_OEM_CAUSE_15, "CODE_OEM_CAUSE_15");
604         }
605     }
606 
607     /**
608      * Implements and Registers the required Listeners and BroadcastReceivers for receiving
609      * ServiceState related information. Performs required logic on received data and then Passes
610      * the information to its provider class for further processing.
611      */
612     public class ServiceStateAnalytics extends TelephonyCallback
613             implements TelephonyCallback.ServiceStateListener {
614         private final Executor mExecutor;
615         private static final String TAG = ServiceStateAnalytics.class.getSimpleName();
616         private static final int BUFFER_TIME = 10000;
617 
618         private TelephonyManager mTelephonyManager;
619 
620         private enum DeviceStatus {
621             APM,
622             CELLULAR_OOS_WITH_IWLAN,
623             NO_NETWORK_COVERAGE,
624             SIM_ABSENT,
625             IN_SERVICE;
626         }
627 
628         private final AtomicReference<TimeStampedServiceState> mLastState =
629                 new AtomicReference<>(null);
630         private static final String NA = "NA";
631         private final BroadcastReceiver mBroadcastReceiver =
632                 new BroadcastReceiver() {
633                     @Override
634                     public void onReceive(Context context, Intent intent) {
635                         final long now = getTimeMillis();
636                         if (intent.getAction()
637                                 .equals(TelephonyManager.ACTION_SIM_CARD_STATE_CHANGED)) {
638                             int simState =
639                                     intent.getIntExtra(
640                                             TelephonyManager.EXTRA_SIM_STATE,
641                                             TelephonyManager.SIM_STATE_UNKNOWN);
642                             if (simState == TelephonyManager.SIM_STATE_ABSENT) {
643                                 Rlog.d("AnkitSimAbsent", "Sim is Absent");
644                                 logSimAbsentState();
645                             }
646                         }
647                     }
648                 };
649 
ServiceStateAnalytics(Executor executor)650         protected ServiceStateAnalytics(Executor executor) {
651             super();
652             mExecutor = executor;
653             IntentFilter mIntentFilter =
654                     new IntentFilter(TelephonyManager.ACTION_SIM_CARD_STATE_CHANGED);
655             mContext.registerReceiver(mBroadcastReceiver, mIntentFilter);
656         }
657 
658         @Override
onServiceStateChanged(@onNull ServiceState serviceState)659         public void onServiceStateChanged(@NonNull ServiceState serviceState) {
660             int dataRegState = serviceState.getDataRegState();
661             int voiceRegState = serviceState.getVoiceRegState();
662             int voiceRadioTechnology = serviceState.getRilVoiceRadioTechnology();
663             int dataRadioTechnology = serviceState.getRilDataRadioTechnology();
664 
665             mExecutorService.execute(() -> {
666                 logServiceState(dataRegState, voiceRegState, voiceRadioTechnology,
667                         dataRadioTechnology);
668             });
669         }
670 
logServiceState( int dataRegState, int voiceRegState, int voiceRadioTechnology, int dataRadioTechnology)671         private void logServiceState(
672                 int dataRegState,
673                 int voiceRegState,
674                 int voiceRadioTechnology,
675                 int dataRadioTechnology) {
676             long now = getTimeMillis();
677             String voiceRadioTechnologyName =
678                     ServiceState.rilRadioTechnologyToString(voiceRadioTechnology);
679             String dataRadioTechnologyName =
680                     ServiceState.rilRadioTechnologyToString(dataRadioTechnology);
681 
682             if (isAirplaneModeOn()) {
683                 if (dataRadioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN
684                         && dataRegState == ServiceState.STATE_IN_SERVICE) {
685                     logOosWithIwlan(now);
686                 } else {
687                     logAirplaneModeServiceState(now);
688                 }
689             } else {
690                 if (voiceRadioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN
691                         && dataRadioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN) {
692                     logNoNetworkCoverage(now);
693 
694                 } else if (voiceRadioTechnology != ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN
695                         && dataRadioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN) {
696                     if (voiceRegState == ServiceState.STATE_IN_SERVICE) {
697                         logInServiceData(voiceRadioTechnologyName, now);
698                     } else {
699                         logNoNetworkCoverage(now);
700                     }
701                 } else if (voiceRadioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN) {
702                     if (dataRegState == ServiceState.STATE_IN_SERVICE) {
703                         if (dataRadioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN) {
704                             logOosWithIwlan(now);
705                         } else {
706                             logInServiceData(dataRadioTechnologyName, now);
707                         }
708                     } else {
709                         logNoNetworkCoverage(now);
710                     }
711                 } else {
712                     if (dataRegState == ServiceState.STATE_IN_SERVICE
713                             || voiceRegState == ServiceState.STATE_IN_SERVICE) {
714                         logInServiceData(voiceRadioTechnologyName, now);
715                     } else {
716                         logNoNetworkCoverage(now);
717                     }
718                 }
719             }
720         }
721 
logSimAbsentState()722         private void logSimAbsentState() {
723             long now = getTimeMillis();
724             TimeStampedServiceState currentState =
725                     new TimeStampedServiceState(
726                             mSlotIndex, NA, DeviceStatus.SIM_ABSENT.name(), now);
727             setCurrentStateAndAddLastState(currentState, now);
728         }
logOosWithIwlan(long now)729         private void logOosWithIwlan(long now) {
730             TimeStampedServiceState currentState =
731                     new TimeStampedServiceState(mSlotIndex, NA,
732                             DeviceStatus.CELLULAR_OOS_WITH_IWLAN.name(), now);
733             setCurrentStateAndAddLastState(currentState, now);
734         }
735 
logAirplaneModeServiceState(long now)736         private void logAirplaneModeServiceState(long now) {
737             TimeStampedServiceState currentState =
738                     new TimeStampedServiceState(mSlotIndex, NA, DeviceStatus.APM.name(), now);
739             setCurrentStateAndAddLastState(currentState, now);
740         }
741 
logNoNetworkCoverage(long now)742         private void logNoNetworkCoverage(long now) {
743             TimeStampedServiceState currentState =
744                     new TimeStampedServiceState(
745                             mSlotIndex, NA, DeviceStatus.NO_NETWORK_COVERAGE.name(), now);
746             setCurrentStateAndAddLastState(currentState, now);
747         }
748 
logInServiceData(String rat, long now)749         private void logInServiceData(String rat, long now) {
750             TimeStampedServiceState currentState =
751                     new TimeStampedServiceState(
752                             mSlotIndex, rat, DeviceStatus.IN_SERVICE.name(), now);
753             setCurrentStateAndAddLastState(currentState, now);
754         }
755 
setCurrentStateAndAddLastState( TimeStampedServiceState currentState, long now)756         private void setCurrentStateAndAddLastState(
757                 TimeStampedServiceState currentState, long now) {
758             TimeStampedServiceState lastState = mLastState.getAndSet(currentState);
759             addData(lastState, now);
760         }
761 
addData(TimeStampedServiceState lastState, long now)762         private void addData(TimeStampedServiceState lastState, long now) {
763             if (lastState == null) {
764                 return;
765             }
766             if (now - lastState.mTimestampStart < BUFFER_TIME) {
767                 return;
768             }
769             Rlog.d(TAG, "Last State = " + lastState.toString() + "End = " + now);
770             mServiceStateAnalyticsProvider.insertDataToDb(lastState, now);
771         }
772 
recordCurrentStateBeforeDump()773         private void recordCurrentStateBeforeDump() {
774             long now = getTimeMillis();
775             Rlog.d("RecordingStateBDump", "Recording " + now);
776             TimeStampedServiceState currentState = mLastState.get();
777             mLastState.set(createCopyWithUpdatedTimestamp(currentState));
778             addData(currentState, now);
779         }
780 
createCopyWithUpdatedTimestamp( TimeStampedServiceState currentState)781         private TimeStampedServiceState createCopyWithUpdatedTimestamp(
782                 TimeStampedServiceState currentState) {
783             if (currentState == null) {
784                 return null;
785             }
786             long now = getTimeMillis();
787             TimeStampedServiceState state =
788                     new TimeStampedServiceState(
789                             currentState.mSlotIndex,
790                             currentState.mRAT,
791                             currentState.mDeviceStatus,
792                             now);
793             return state;
794         }
795 
isAirplaneModeOn()796         private boolean isAirplaneModeOn() {
797             return Settings.Global.getInt(
798                     mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0)
799                     != 0;
800         }
801 
getTimeMillis()802         protected long getTimeMillis() {
803             return SystemClock.elapsedRealtime();
804         }
805 
registerMyListener(Context context, int subId)806         void registerMyListener(Context context, int subId) {
807             try {
808                 mTelephonyManager =
809                         context.getSystemService(TelephonyManager.class)
810                                 .createForSubscriptionId(subId);
811                 mTelephonyManager.registerTelephonyCallback(mExecutor, this);
812 
813             } catch (NullPointerException e) {
814                 log("Null pointer exception caught " + e);
815             }
816         }
817 
unregisterMyListener(int subId)818         void unregisterMyListener(int subId) {
819             mTelephonyManager.unregisterTelephonyCallback(this);
820         }
821 
log(String s)822         private void log(String s) {
823             Rlog.d(ServiceStateAnalytics.class.getSimpleName(), s);
824         }
825 
826         /**
827          * Serves the functionality of storing service state related information,
828          * Along with the timestamp at which the state was detected.
829          */
830         public static class TimeStampedServiceState {
831             protected final int mSlotIndex;
832             protected final String mRAT;
833             protected final String mDeviceStatus;
834             protected final long mTimestampStart;
835 
TimeStampedServiceState( int slotIndex, String rat, String deviceStatus, long timestampStart)836             public TimeStampedServiceState(
837                     int slotIndex, String rat, String deviceStatus, long timestampStart) {
838                 mSlotIndex = slotIndex;
839                 mRAT = rat;
840                 mDeviceStatus = deviceStatus;
841                 mTimestampStart = timestampStart;
842             }
843 
844             @Override
toString()845             public String toString() {
846                 return "SlotIndex = "
847                         + mSlotIndex
848                         + " RAT = "
849                         + mRAT
850                         + " DeviceStatus = "
851                         + mDeviceStatus
852                         + "TimeStampStart = "
853                         + mTimestampStart;
854             }
855             /** Getter function for slotIndex */
getSlotIndex()856             public int getSlotIndex() {
857                 return mSlotIndex;
858             }
859 
860             /** Getter function for state start Timestamp */
getTimestampStart()861             public long getTimestampStart() {
862                 return mTimestampStart;
863             }
864 
865             /** Getter function for device Status */
getDeviceStatus()866             public String getDeviceStatus() {
867                 return mDeviceStatus;
868             }
869 
870             /** Getter function for radio access technology  */
getRAT()871             public String getRAT() {
872                 return mRAT;
873             }
874         }
875     }
876 
877     /**
878      * Provides implementation for processing received Sms related data. Implements functions to
879      * handle various scenarios pertaining to Sms. Passes the data to its provider for further
880      * processing.
881      */
882     public class SmsMmsAnalytics {
883         private static final String TAG = SmsMmsAnalytics.class.getSimpleName();
SmsMmsAnalytics()884         public SmsMmsAnalytics() {
885 
886         }
887 
888         /** Collects Outgoing Sms related information. */
onOutgoingSms(boolean isOverIms, @SmsManager.Result int sendErrorCode)889         public void onOutgoingSms(boolean isOverIms, @SmsManager.Result int sendErrorCode) {
890             Rlog.d(
891                     TAG,
892                     "Is Over Ims = "
893                             + isOverIms
894                             + " sendErrorCode = "
895                             + sendErrorCode
896                             + "SlotInfo ="
897                             + mSlotIndex);
898             logOutgoingSms(isOverIms, sendErrorCode);
899         }
900 
901         /** Collects Successful Incoming Sms related information. */
onIncomingSmsSuccess(@nboundSmsHandler.SmsSource int smsSource)902         public void onIncomingSmsSuccess(@InboundSmsHandler.SmsSource int smsSource) {
903             Rlog.d(TAG, " smsSource = " + smsSource);
904             String status = "Success";
905             String failureReason = "NA";
906             logIncomingSms(smsSource, status, failureReason);
907         }
908 
909         /** Collects Failed Incoming Multipart Sms related information. */
onDroppedIncomingMultipartSms()910         public void onDroppedIncomingMultipartSms() {
911             String status = "Failure";
912             String type = "SMS Incoming";
913             // Mark the RAT as unknown since it might have changed over time.
914             int rat = TelephonyManager.NETWORK_TYPE_UNKNOWN;
915             String ratString = ServiceState.rilRadioTechnologyToString(rat);
916             String failureReason = "INCOMING_SMS__ERROR__SMS_ERROR_GENERIC";
917             sendDataToProvider(status, type, ratString, failureReason);
918         }
919 
920         /** Collects Failed Incoming Sms related information. */
onIncomingSmsError(@nboundSmsHandler.SmsSource int smsSource, int result)921         public void onIncomingSmsError(@InboundSmsHandler.SmsSource int smsSource, int result) {
922             String status = "Failure";
923             String failureReason = getIncomingSmsErrorString(result);
924             logIncomingSms(smsSource, status, failureReason);
925             Rlog.d(
926                     TAG,
927                     " smsSource = "
928                             + smsSource
929                             + "Result = "
930                             + result
931                             + "IncomingError = "
932                             + failureReason
933                             + "("
934                             + getIncomingError(result)
935                             + ")");
936         }
937 
logOutgoingSms(boolean isOverIms, @SmsManager.Result int sendErrorCode)938         private void logOutgoingSms(boolean isOverIms, @SmsManager.Result int sendErrorCode) {
939             try {
940                 String type = "SMS Outgoing";
941                 String status = sendErrorCode == 0 ? "Success" : "Failure";
942                 int rat = getRat(isOverIms);
943                 String ratString = TelephonyManager.getNetworkTypeName(rat);
944                 String failureReason =
945                         status.equals("Success") ? "NA" : getSmsFailureReasonString(sendErrorCode);
946                 Rlog.d(
947                         TAG,
948                         "SlotInfo = "
949                                 + mSlotIndex
950                                 + " Type = "
951                                 + type
952                                 + " Status = "
953                                 + status
954                                 + "RAT "
955                                 + ratString
956                                 + " "
957                                 + rat
958                                 + "Failure Reason = "
959                                 + failureReason);
960                 sendDataToProvider(status, type, ratString, failureReason);
961 
962             } catch (Exception e) {
963                 Rlog.d(TAG, "Error in SmsLogs" + e);
964             }
965         }
966 
logIncomingSms( @nboundSmsHandler.SmsSource int smsSource, String status, String failureReason)967         private void logIncomingSms(
968                 @InboundSmsHandler.SmsSource int smsSource, String status, String failureReason) {
969             String type = "SMS Incoming";
970             try {
971                 int rat = getRat(smsSource);
972                 String ratString = TelephonyManager.getNetworkTypeName(rat);
973                 sendDataToProvider(status, type, ratString, failureReason);
974                 Rlog.d(
975                         TAG,
976                         "SlotInfo ="
977                                 + mSlotIndex
978                                 + " Type = "
979                                 + type
980                                 + " Status = "
981                                 + status
982                                 + " RAT "
983                                 + ratString
984                                 + " ("
985                                 + rat
986                                 + " ) Failure Reason = "
987                                 + failureReason);
988             } catch (Exception e) {
989                 Rlog.e(TAG, "Exception = " + e);
990             }
991         }
992 
sendDataToProvider( String status, String type, String rat, String failureReason)993         private void sendDataToProvider(
994                 String status, String type, String rat, String failureReason) {
995             mExecutorService.execute(() -> {
996                 mSmsMmsAnalyticsProvider.insertDataToDb(status, type, rat, failureReason);
997             });
998         }
999 
getIncomingError(int result)1000         private static int getIncomingError(int result) {
1001             switch (result) {
1002                 case Activity.RESULT_OK:
1003                 case Intents.RESULT_SMS_HANDLED:
1004                     return INCOMING_SMS__ERROR__SMS_SUCCESS;
1005                 case Intents.RESULT_SMS_OUT_OF_MEMORY:
1006                     return INCOMING_SMS__ERROR__SMS_ERROR_NO_MEMORY;
1007                 case Intents.RESULT_SMS_UNSUPPORTED:
1008                     return INCOMING_SMS__ERROR__SMS_ERROR_NOT_SUPPORTED;
1009                 case Intents.RESULT_SMS_GENERIC_ERROR:
1010                 default:
1011                     return INCOMING_SMS__ERROR__SMS_ERROR_GENERIC;
1012             }
1013         }
1014 
getIncomingSmsErrorString(int result)1015         private static String getIncomingSmsErrorString(int result) {
1016             switch (result) {
1017                 case Activity.RESULT_OK:
1018                 case Intents.RESULT_SMS_HANDLED:
1019                     return "INCOMING_SMS__ERROR__SMS_SUCCESS";
1020                 case Intents.RESULT_SMS_OUT_OF_MEMORY:
1021                     return "INCOMING_SMS__ERROR__SMS_ERROR_NO_MEMORY";
1022                 case Intents.RESULT_SMS_UNSUPPORTED:
1023                     return "INCOMING_SMS__ERROR__SMS_ERROR_NOT_SUPPORTED";
1024                 case Intents.RESULT_SMS_GENERIC_ERROR:
1025                 default:
1026                     return "INCOMING_SMS__ERROR__SMS_ERROR_GENERIC";
1027             }
1028         }
1029 
1030         @Nullable
getServiceState()1031         private ServiceState getServiceState() {
1032             Phone phone = mPhone;
1033             if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS) {
1034                 phone = mPhone.getDefaultPhone();
1035             }
1036             ServiceStateTracker serviceStateTracker = phone.getServiceStateTracker();
1037             return serviceStateTracker != null ? serviceStateTracker.getServiceState() : null;
1038         }
1039 
1040         @Annotation.NetworkType
getRat(@nboundSmsHandler.SmsSource int smsSource)1041         private int getRat(@InboundSmsHandler.SmsSource int smsSource) {
1042             if (smsSource == SOURCE_INJECTED_FROM_UNKNOWN) {
1043                 return TelephonyManager.NETWORK_TYPE_UNKNOWN;
1044             }
1045             return getRat(smsSource == SOURCE_INJECTED_FROM_IMS);
1046         }
1047 
1048         @Annotation.NetworkType
getRat(boolean isOverIms)1049         private int getRat(boolean isOverIms) {
1050             if (isOverIms) {
1051                 if (mPhone.getImsRegistrationTech()
1052                         == ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN) {
1053                     return TelephonyManager.NETWORK_TYPE_IWLAN;
1054                 }
1055             }
1056             ServiceState serviceState = getServiceState();
1057             return serviceState != null
1058                     ? serviceState.getVoiceNetworkType()
1059                     : TelephonyManager.NETWORK_TYPE_UNKNOWN;
1060         }
1061 
getSmsFailureReasonString(int sendErrorCode)1062         private String getSmsFailureReasonString(int sendErrorCode) {
1063             switch (sendErrorCode) {
1064                 case SmsManager.RESULT_ERROR_NONE:
1065                     return "RESULT_ERROR_NONE";
1066                 case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
1067                     return "RESULT_ERROR_GENERIC_FAILURE";
1068                 case SmsManager.RESULT_ERROR_RADIO_OFF:
1069                     return "RESULT_ERROR_RADIO_OFF";
1070                 case SmsManager.RESULT_ERROR_NULL_PDU:
1071                     return "RESULT_ERROR_NULL_PDU";
1072                 case SmsManager.RESULT_ERROR_NO_SERVICE:
1073                     return "RESULT_ERROR_NO_SERVICE";
1074                 case SmsManager.RESULT_ERROR_LIMIT_EXCEEDED:
1075                     return "RESULT_ERROR_LIMIT_EXCEEDED";
1076                 case SmsManager.RESULT_ERROR_FDN_CHECK_FAILURE:
1077                     return "RESULT_ERROR_FDN_CHECK_FAILURE";
1078                 case SmsManager.RESULT_ERROR_SHORT_CODE_NOT_ALLOWED:
1079                     return "RESULT_ERROR_SHORT_CODE_NOT_ALLOWED";
1080                 case SmsManager.RESULT_ERROR_SHORT_CODE_NEVER_ALLOWED:
1081                     return "RESULT_ERROR_SHORT_CODE_NEVER_ALLOWED";
1082                 case SmsManager.RESULT_RADIO_NOT_AVAILABLE:
1083                     return "RESULT_RADIO_NOT_AVAILABLE";
1084                 case SmsManager.RESULT_NETWORK_REJECT:
1085                     return "RESULT_NETWORK_REJECT";
1086                 case SmsManager.RESULT_INVALID_ARGUMENTS:
1087                     return "RESULT_INVALID_ARGUMENTS";
1088                 case SmsManager.RESULT_INVALID_STATE:
1089                     return "RESULT_INVALID_STATE";
1090                 case SmsManager.RESULT_NO_MEMORY:
1091                     return "RESULT_NO_MEMORY";
1092                 case SmsManager.RESULT_INVALID_SMS_FORMAT:
1093                     return "RESULT_INVALID_SMS_FORMAT";
1094                 case SmsManager.RESULT_SYSTEM_ERROR:
1095                     return "RESULT_SYSTEM_ERROR";
1096                 case SmsManager.RESULT_MODEM_ERROR:
1097                     return "RESULT_MODEM_ERROR";
1098                 case SmsManager.RESULT_NETWORK_ERROR:
1099                     return "RESULT_NETWORK_ERROR";
1100                 case SmsManager.RESULT_INVALID_SMSC_ADDRESS:
1101                     return "RESULT_INVALID_SMSC_ADDRESS";
1102                 case SmsManager.RESULT_OPERATION_NOT_ALLOWED:
1103                     return "RESULT_OPERATION_NOT_ALLOWED";
1104                 case SmsManager.RESULT_INTERNAL_ERROR:
1105                     return "RESULT_INTERNAL_ERROR";
1106                 case SmsManager.RESULT_NO_RESOURCES:
1107                     return "RESULT_NO_RESOURCES";
1108                 case SmsManager.RESULT_CANCELLED:
1109                     return "RESULT_CANCELLED";
1110                 case SmsManager.RESULT_REQUEST_NOT_SUPPORTED:
1111                     return "RESULT_REQUEST_NOT_SUPPORTED";
1112                 case SmsManager.RESULT_NO_BLUETOOTH_SERVICE:
1113                     return "RESULT_NO_BLUETOOTH_SERVICE";
1114                 case SmsManager.RESULT_INVALID_BLUETOOTH_ADDRESS:
1115                     return "RESULT_INVALID_BLUETOOTH_ADDRESS";
1116                 case SmsManager.RESULT_BLUETOOTH_DISCONNECTED:
1117                     return "RESULT_BLUETOOTH_DISCONNECTED";
1118                 case SmsManager.RESULT_UNEXPECTED_EVENT_STOP_SENDING:
1119                     return "RESULT_UNEXPECTED_EVENT_STOP_SENDING";
1120                 case SmsManager.RESULT_SMS_BLOCKED_DURING_EMERGENCY:
1121                     return "RESULT_SMS_BLOCKED_DURING_EMERGENCY";
1122                 case SmsManager.RESULT_SMS_SEND_RETRY_FAILED:
1123                     return "RESULT_SMS_SEND_RETRY_FAILED";
1124                 case SmsManager.RESULT_REMOTE_EXCEPTION:
1125                     return "RESULT_REMOTE_EXCEPTION";
1126                 case SmsManager.RESULT_NO_DEFAULT_SMS_APP:
1127                     return "RESULT_NO_DEFAULT_SMS_APP";
1128                 case SmsManager.RESULT_USER_NOT_ALLOWED:
1129                     return "RESULT_USER_NOT_ALLOWED";
1130                 case SmsManager.RESULT_RIL_RADIO_NOT_AVAILABLE:
1131                     return "RESULT_RIL_RADIO_NOT_AVAILABLE";
1132                 case SmsManager.RESULT_RIL_SMS_SEND_FAIL_RETRY:
1133                     return "RESULT_RIL_SMS_SEND_FAIL_RETRY";
1134                 case SmsManager.RESULT_RIL_NETWORK_REJECT:
1135                     return "RESULT_RIL_NETWORK_REJECT";
1136                 case SmsManager.RESULT_RIL_INVALID_STATE:
1137                     return "RESULT_RIL_INVALID_STATE";
1138                 case SmsManager.RESULT_RIL_INVALID_ARGUMENTS:
1139                     return "RESULT_RIL_INVALID_ARGUMENTS";
1140                 case SmsManager.RESULT_RIL_NO_MEMORY:
1141                     return "RESULT_RIL_NO_MEMORY";
1142                 case SmsManager.RESULT_RIL_REQUEST_RATE_LIMITED:
1143                     return "RESULT_RIL_REQUEST_RATE_LIMITED";
1144                 case SmsManager.RESULT_RIL_INVALID_SMS_FORMAT:
1145                     return "RESULT_RIL_INVALID_SMS_FORMAT";
1146                 case SmsManager.RESULT_RIL_SYSTEM_ERR:
1147                     return "RESULT_RIL_SYSTEM_ERR";
1148                 case SmsManager.RESULT_RIL_ENCODING_ERR:
1149                     return "RESULT_RIL_ENCODING_ERR";
1150                 case SmsManager.RESULT_RIL_INVALID_SMSC_ADDRESS:
1151                     return "RESULT_RIL_INVALID_SMSC_ADDRESS";
1152                 case SmsManager.RESULT_RIL_MODEM_ERR:
1153                     return "RESULT_RIL_MODEM_ERR";
1154                 case SmsManager.RESULT_RIL_NETWORK_ERR:
1155                     return "RESULT_RIL_NETWORK_ERR";
1156                 case SmsManager.RESULT_RIL_INTERNAL_ERR:
1157                     return "RESULT_RIL_INTERNAL_ERR";
1158                 case SmsManager.RESULT_RIL_REQUEST_NOT_SUPPORTED:
1159                     return "RESULT_RIL_REQUEST_NOT_SUPPORTED";
1160                 case SmsManager.RESULT_RIL_INVALID_MODEM_STATE:
1161                     return "RESULT_RIL_INVALID_MODEM_STATE";
1162                 case SmsManager.RESULT_RIL_NETWORK_NOT_READY:
1163                     return "RESULT_RIL_NETWORK_NOT_READY";
1164                 case SmsManager.RESULT_RIL_OPERATION_NOT_ALLOWED:
1165                     return "RESULT_RIL_OPERATION_NOT_ALLOWED";
1166                 case SmsManager.RESULT_RIL_NO_RESOURCES:
1167                     return "RESULT_RIL_NO_RESOURCES";
1168                 case SmsManager.RESULT_RIL_CANCELLED:
1169                     return "RESULT_RIL_CANCELLED";
1170                 case SmsManager.RESULT_RIL_SIM_ABSENT:
1171                     return "RESULT_RIL_SIM_ABSENT";
1172                 case SmsManager.RESULT_RIL_SIMULTANEOUS_SMS_AND_CALL_NOT_ALLOWED:
1173                     return "RESULT_RIL_SIMULTANEOUS_SMS_AND_CALL_NOT_ALLOWED";
1174                 case SmsManager.RESULT_RIL_ACCESS_BARRED:
1175                     return "RESULT_RIL_ACCESS_BARRED";
1176                 case SmsManager.RESULT_RIL_BLOCKED_DUE_TO_CALL:
1177                     return "RESULT_RIL_BLOCKED_DUE_TO_CALL";
1178                 case SmsManager.RESULT_RIL_GENERIC_ERROR:
1179                     return "RESULT_RIL_GENERIC_ERROR";
1180                 case SmsManager.RESULT_RIL_INVALID_RESPONSE:
1181                     return "RESULT_RIL_INVALID_RESPONSE";
1182                 case SmsManager.RESULT_RIL_SIM_PIN2:
1183                     return "RESULT_RIL_SIM_PIN2";
1184                 case SmsManager.RESULT_RIL_SIM_PUK2:
1185                     return "RESULT_RIL_SIM_PUK2";
1186                 case SmsManager.RESULT_RIL_SUBSCRIPTION_NOT_AVAILABLE:
1187                     return "RESULT_RIL_SUBSCRIPTION_NOT_AVAILABLE";
1188                 case SmsManager.RESULT_RIL_SIM_ERROR:
1189                     return "RESULT_RIL_SIM_ERROR";
1190                 case SmsManager.RESULT_RIL_INVALID_SIM_STATE:
1191                     return "RESULT_RIL_INVALID_SIM_STATE";
1192                 case SmsManager.RESULT_RIL_NO_SMS_TO_ACK:
1193                     return "RESULT_RIL_NO_SMS_TO_ACK";
1194                 case SmsManager.RESULT_RIL_SIM_BUSY:
1195                     return "RESULT_RIL_SIM_BUSY";
1196                 case SmsManager.RESULT_RIL_SIM_FULL:
1197                     return "RESULT_RIL_SIM_FULL";
1198                 case SmsManager.RESULT_RIL_NO_SUBSCRIPTION:
1199                     return "RESULT_RIL_NO_SUBSCRIPTION";
1200                 case SmsManager.RESULT_RIL_NO_NETWORK_FOUND:
1201                     return "RESULT_RIL_NO_NETWORK_FOUND";
1202                 case SmsManager.RESULT_RIL_DEVICE_IN_USE:
1203                     return "RESULT_RIL_DEVICE_IN_USE";
1204                 case SmsManager.RESULT_RIL_ABORTED:
1205                     return "RESULT_RIL_ABORTED";
1206                 default:
1207                     return "NA";
1208             }
1209         }
1210     }
1211 }
1212