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