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