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