1 package com.android.internal.telephony; 2 3 import com.android.ims.ImsConfig; 4 import com.android.ims.ImsReasonInfo; 5 import com.android.ims.internal.ImsCallSession; 6 import com.android.internal.telephony.dataconnection.DataCallResponse; 7 import com.android.internal.telephony.imsphone.ImsPhoneCall; 8 9 import android.net.ConnectivityMetricsLogger; 10 import android.os.Bundle; 11 import android.telephony.ServiceState; 12 13 import java.util.ArrayList; 14 import java.util.Objects; 15 16 import static com.android.internal.telephony.RILConstants.*; 17 18 /** 19 * Log telephony events 20 * 21 * @hide 22 */ 23 public class TelephonyEventLog extends ConnectivityMetricsLogger { 24 private static String TAG = "TelephonyEventLog"; 25 private static final boolean DBG = true; 26 private static final boolean VDBG = false; // STOPSHIP if true 27 28 public static final int TAG_SETTINGS = 1; 29 public static final int TAG_SERVICE_STATE = 2; 30 public static final int TAG_IMS_CONNECTION_STATE = 3; 31 public static final int TAG_IMS_CAPABILITIES = 4; 32 33 public static final int TAG_DATA_CALL_LIST = 5; 34 35 public static final int TAG_PHONE_STATE = 8; 36 37 public static final int TAG_RIL_REQUEST = 1001; 38 public static final int TAG_RIL_RESPONSE = 1002; 39 public static final int TAG_RIL_UNSOL_RESPONSE = 1003; 40 public static final int TAG_RIL_TIMEOUT_RESPONSE = 1004; 41 42 // IImsCallSession 43 public static final int TAG_IMS_CALL_START = 2001; 44 public static final int TAG_IMS_CALL_START_CONFERENCE = 2002; 45 public static final int TAG_IMS_CALL_RECEIVE = 2003; 46 public static final int TAG_IMS_CALL_ACCEPT = 2004; 47 public static final int TAG_IMS_CALL_REJECT = 2005; 48 public static final int TAG_IMS_CALL_TERMINATE = 2006; 49 public static final int TAG_IMS_CALL_HOLD = 2007; 50 public static final int TAG_IMS_CALL_RESUME = 2008; 51 public static final int TAG_IMS_CALL_MERGE = 2009; 52 public static final int TAG_IMS_CALL_UPDATE = 2010; 53 54 // IImsCallSessionListener 55 public static final int TAG_IMS_CALL_PROGRESSING = 2011; 56 public static final int TAG_IMS_CALL_STARTED = 2012; 57 public static final int TAG_IMS_CALL_START_FAILED = 2013; 58 public static final int TAG_IMS_CALL_TERMINATED = 2014; 59 public static final int TAG_IMS_CALL_HELD = 2015; 60 public static final int TAG_IMS_CALL_HOLD_FAILED = 2016; 61 public static final int TAG_IMS_CALL_HOLD_RECEIVED = 2017; 62 public static final int TAG_IMS_CALL_RESUMED = 2018; 63 public static final int TAG_IMS_CALL_RESUME_FAILED = 2019; 64 public static final int TAG_IMS_CALL_RESUME_RECEIVED = 2020; 65 public static final int TAG_IMS_CALL_UPDATED = 2021; 66 public static final int TAG_IMS_CALL_UPDATE_FAILED = 2022; 67 public static final int TAG_IMS_CALL_MERGED = 2023; 68 public static final int TAG_IMS_CALL_MERGE_FAILED = 2024; 69 public static final int TAG_IMS_CALL_HANDOVER = 2025; 70 public static final int TAG_IMS_CALL_HANDOVER_FAILED = 2026; 71 72 public static final int TAG_IMS_CALL_TTY_MODE_RECEIVED = 2027; 73 74 public static final int TAG_IMS_CONFERENCE_PARTICIPANTS_STATE_CHANGED = 2028; 75 public static final int TAG_IMS_MULTIPARTY_STATE_CHANGED = 2029; 76 77 public static final int TAG_IMS_CALL_STATE = 2030; 78 79 public static final int SETTING_AIRPLANE_MODE = 1; 80 public static final int SETTING_CELL_DATA_ENABLED = 2; 81 public static final int SETTING_DATA_ROAMING_ENABLED = 3; 82 public static final int SETTING_PREFERRED_NETWORK_MODE = 4; 83 public static final int SETTING_WIFI_ENABLED = 5; 84 public static final int SETTING_VO_LTE_ENABLED = 6; 85 public static final int SETTING_VO_WIFI_ENABLED = 7; 86 public static final int SETTING_WFC_MODE = 8; 87 public static final int SETTING_VI_LTE_ENABLED = 9; 88 public static final int SETTING_VI_WIFI_ENABLED = 10; 89 90 public static final int IMS_CONNECTION_STATE_CONNECTED = 1; 91 public static final int IMS_CONNECTION_STATE_PROGRESSING = 2; 92 public static final int IMS_CONNECTION_STATE_DISCONNECTED = 3; 93 public static final int IMS_CONNECTION_STATE_RESUMED = 4; 94 public static final int IMS_CONNECTION_STATE_SUSPENDED = 5; 95 96 public static final String DATA_KEY_PHONE_ID = "phoneId"; 97 public static final String DATA_KEY_PARAM1 = "param1"; 98 public static final String DATA_KEY_PARAM2 = "param2"; 99 100 public static final String DATA_KEY_REASONINFO_CODE = "code"; 101 public static final String DATA_KEY_REASONINFO_EXTRA_CODE = "extra-code"; 102 public static final String DATA_KEY_REASONINFO_EXTRA_MESSAGE = "extra-message"; 103 public static final String DATA_KEY_VOLTE = "VoLTE"; 104 public static final String DATA_KEY_VILTE = "ViLTE"; 105 public static final String DATA_KEY_VOWIFI = "VoWiFi"; 106 public static final String DATA_KEY_VIWIFI = "ViWiFi"; 107 public static final String DATA_KEY_UTLTE = "UTLTE"; 108 public static final String DATA_KEY_UTWIFI = "UTWiFi"; 109 public static final String DATA_KEY_RAT = "rat"; 110 public static final String DATA_KEY_DATA_PROFILE = "profile"; 111 public static final String DATA_KEY_APN = "apn"; 112 public static final String DATA_KEY_PROTOCOL = "protocol"; 113 public static final String DATA_KEY_DATA_DEACTIVATE_REASON = "reason"; 114 public static final String DATA_KEY_DATA_CALL_STATUSES = "statuses"; 115 public static final String DATA_KEY_DATA_CALL_CIDS = "cids"; 116 public static final String DATA_KEY_DATA_CALL_ACTIVES = "actives"; 117 public static final String DATA_KEY_DATA_CALL_TYPES = "types"; 118 public static final String DATA_KEY_DATA_CALL_IFNAMES = "ifnames"; 119 public static final String DATA_KEY_CLIR_MODE = "clirMode"; 120 public static final String DATA_KEY_RIL_CALL_RING_RESPONSE = "response"; 121 public static final String DATA_KEY_RIL_HANGUP_GSM_INDEX = "gsmIndex"; 122 public static final String DATA_KEY_RIL_ERROR = "error"; 123 public static final String DATA_KEY_DATA_CALL_STATUS = "status"; 124 public static final String DATA_KEY_DATA_CALL_RETRY = "retry"; 125 public static final String DATA_KEY_DATA_CALL_CID = "cid"; 126 public static final String DATA_KEY_DATA_CALL_ACTIVE = "active"; 127 public static final String DATA_KEY_DATA_CALL_TYPE = "type"; 128 public static final String DATA_KEY_DATA_CALL_IFNAME = "ifname"; 129 public static final String DATA_KEY_SMS_MESSAGE_REF = "messageRef"; 130 public static final String DATA_KEY_SMS_ACK_PDU = "ackPDU"; 131 public static final String DATA_KEY_SMS_ERROR_CODE = "errorCode"; 132 public static final String DATA_KEY_SRC_TECH = "src-tech"; 133 public static final String DATA_KEY_TARGET_TECH = "target-tech"; 134 135 public static final String SERVICE_STATE_VOICE_REG_STATE = "regSt"; 136 public static final String SERVICE_STATE_DATA_REG_STATE = "dataRegSt"; 137 public static final String SERVICE_STATE_VOICE_ROAMING_TYPE = "roamingType"; 138 public static final String SERVICE_STATE_DATA_ROAMING_TYPE = "dataRoamingType"; 139 public static final String SERVICE_STATE_VOICE_ALPHA_LONG = "alphaLong"; 140 public static final String SERVICE_STATE_VOICE_ALPHA_SHORT = "alphaShort"; 141 public static final String SERVICE_STATE_VOICE_NUMERIC = "operator"; 142 public static final String SERVICE_STATE_DATA_ALPHA_LONG = "dataAlphaLong"; 143 public static final String SERVICE_STATE_DATA_ALPHA_SHORT = "dataAlphaShort"; 144 public static final String SERVICE_STATE_DATA_NUMERIC = "dataOperator"; 145 public static final String SERVICE_STATE_VOICE_RAT = "rat"; 146 public static final String SERVICE_STATE_DATA_RAT = "dataRat"; 147 public static final String SERVICE_STATE_EMERGENCY_ONLY = "emergencyOnly"; 148 149 int mPhoneId; 150 TelephonyEventLog(int phoneId)151 public TelephonyEventLog(int phoneId) { 152 super(); 153 154 mPhoneId = phoneId; 155 } 156 writeEvent(int tag, Bundle data)157 private void writeEvent(int tag, Bundle data) { 158 writeEvent(System.currentTimeMillis(), tag, -1, -1, data); 159 } 160 writeEvent(int tag, int param1, int param2)161 private void writeEvent(int tag, int param1, int param2) { 162 writeEvent(System.currentTimeMillis(), tag, param1, param2, null); 163 } 164 writeEvent(int tag, int param1, int param2, Bundle data)165 private void writeEvent(int tag, int param1, int param2, Bundle data) { 166 writeEvent(System.currentTimeMillis(), tag, param1, param2, data); 167 } 168 writeEvent(long timestamp, int tag, int param1, int param2, Bundle data)169 private void writeEvent(long timestamp, int tag, int param1, int param2, Bundle data) { 170 Bundle b = data; 171 if (b == null) { 172 b = new Bundle(); 173 } 174 b.putInt(DATA_KEY_PHONE_ID, mPhoneId); 175 b.putInt(DATA_KEY_PARAM1, param1); 176 b.putInt(DATA_KEY_PARAM2, param2); 177 178 logEvent(timestamp, ConnectivityMetricsLogger.COMPONENT_TAG_TELEPHONY, tag, b); 179 } 180 181 private int mVoiceRegState = -1; 182 private int mDataRegState = -1; 183 private int mVoiceRoamingType = -1; 184 private int mDataRoamingType = -1; 185 private String mVoiceOperatorAlphaShort; 186 private String mVoiceOperatorNumeric; 187 private String mDataOperatorAlphaShort; 188 private String mDataOperatorNumeric; 189 private int mRilVoiceRadioTechnology = -1; 190 private int mRilDataRadioTechnology = -1; 191 private boolean mEmergencyOnly = false; 192 private Bundle mLastServiceStateBundle = null; 193 equals(Object a, Object b)194 public static boolean equals(Object a, Object b) { 195 return (a == null ? b == null : a.equals(b)); 196 } 197 areBundlesEqual(Bundle first, Bundle second)198 private static boolean areBundlesEqual(Bundle first, Bundle second) { 199 if (first == null || second == null) { 200 return first == second; 201 } 202 203 if (first.size() != second.size()) { 204 return false; 205 } 206 207 for(String key : first.keySet()) { 208 if (key != null) { 209 final Object firstValue = first.get(key); 210 final Object secondValue = second.get(key); 211 if (!Objects.equals(firstValue, secondValue)) { 212 return false; 213 } 214 } 215 } 216 return true; 217 } 218 writeServiceStateChanged(ServiceState serviceState)219 public void writeServiceStateChanged(ServiceState serviceState) { 220 Bundle b = new Bundle(); 221 222 mVoiceRegState = serviceState.getVoiceRegState(); 223 b.putInt(SERVICE_STATE_VOICE_REG_STATE, mVoiceRegState); 224 225 mDataRegState = serviceState.getDataRegState(); 226 b.putInt(SERVICE_STATE_DATA_REG_STATE, mDataRegState); 227 228 mVoiceRoamingType = serviceState.getVoiceRoamingType(); 229 b.putInt(SERVICE_STATE_VOICE_ROAMING_TYPE, mVoiceRoamingType); 230 231 mDataRoamingType = serviceState.getDataRoamingType(); 232 b.putInt(SERVICE_STATE_DATA_ROAMING_TYPE, mDataRoamingType); 233 234 if (serviceState.getVoiceOperatorAlphaShort() != null) { 235 mVoiceOperatorAlphaShort = serviceState.getVoiceOperatorAlphaShort(); 236 b.putString(SERVICE_STATE_VOICE_ALPHA_SHORT, mVoiceOperatorAlphaShort); 237 } 238 239 if (serviceState.getVoiceOperatorNumeric() != null) { 240 mVoiceOperatorNumeric = serviceState.getVoiceOperatorNumeric(); 241 b.putString(SERVICE_STATE_VOICE_NUMERIC, mVoiceOperatorNumeric); 242 } 243 244 if (serviceState.getDataOperatorAlphaShort() != null) { 245 mDataOperatorAlphaShort = serviceState.getDataOperatorAlphaShort(); 246 b.putString(SERVICE_STATE_DATA_ALPHA_SHORT, mDataOperatorAlphaShort); 247 } 248 249 if (serviceState.getDataOperatorNumeric() != null) { 250 mDataOperatorNumeric = serviceState.getDataOperatorNumeric(); 251 b.putString(SERVICE_STATE_DATA_NUMERIC, mDataOperatorNumeric); 252 } 253 254 mRilVoiceRadioTechnology = serviceState.getRilVoiceRadioTechnology(); 255 b.putInt(SERVICE_STATE_VOICE_RAT, mRilVoiceRadioTechnology); 256 257 mRilDataRadioTechnology = serviceState.getRilDataRadioTechnology(); 258 b.putInt(SERVICE_STATE_DATA_RAT, mRilDataRadioTechnology); 259 260 mEmergencyOnly = serviceState.isEmergencyOnly(); 261 b.putBoolean(SERVICE_STATE_EMERGENCY_ONLY, mEmergencyOnly); 262 263 // Only write the service state changed event if there is any field changed. 264 if (!areBundlesEqual(b, mLastServiceStateBundle)) { 265 mLastServiceStateBundle = b; 266 writeEvent(TAG_SERVICE_STATE, b); 267 } 268 } 269 writeSetAirplaneMode(boolean enabled)270 public void writeSetAirplaneMode(boolean enabled) { 271 writeEvent(TAG_SETTINGS, SETTING_AIRPLANE_MODE, enabled ? 1 : 0); 272 } 273 writeSetCellDataEnabled(boolean enabled)274 public void writeSetCellDataEnabled(boolean enabled) { 275 writeEvent(TAG_SETTINGS, SETTING_CELL_DATA_ENABLED, enabled ? 1 : 0); 276 } 277 writeSetDataRoamingEnabled(boolean enabled)278 public void writeSetDataRoamingEnabled(boolean enabled) { 279 writeEvent(TAG_SETTINGS, SETTING_DATA_ROAMING_ENABLED, enabled ? 1 : 0); 280 } 281 writeSetPreferredNetworkType(int mode)282 public void writeSetPreferredNetworkType(int mode) { 283 writeEvent(TAG_SETTINGS, SETTING_PREFERRED_NETWORK_MODE, mode); 284 } 285 writeSetWifiEnabled(boolean enabled)286 public void writeSetWifiEnabled(boolean enabled) { 287 writeEvent(TAG_SETTINGS, SETTING_WIFI_ENABLED, enabled ? 1 : 0); 288 } 289 writeSetWfcMode(int mode)290 public void writeSetWfcMode(int mode) { 291 writeEvent(TAG_SETTINGS, SETTING_WFC_MODE, mode); 292 } 293 writeImsSetFeatureValue(int feature, int network, int value, int status)294 public void writeImsSetFeatureValue(int feature, int network, int value, int status) { 295 switch (feature) { 296 case ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE: 297 writeEvent(TAG_SETTINGS, SETTING_VO_LTE_ENABLED, value); 298 break; 299 case ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_WIFI: 300 writeEvent(TAG_SETTINGS, SETTING_VO_WIFI_ENABLED, value); 301 break; 302 case ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE: 303 writeEvent(TAG_SETTINGS, SETTING_VI_LTE_ENABLED, value); 304 break; 305 case ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_WIFI: 306 writeEvent(TAG_SETTINGS, SETTING_VI_WIFI_ENABLED, value); 307 break; 308 } 309 } 310 writeOnImsConnectionState(int state, ImsReasonInfo reasonInfo)311 public void writeOnImsConnectionState(int state, ImsReasonInfo reasonInfo) { 312 writeEvent(TAG_IMS_CONNECTION_STATE, state, -1, imsReasonInfoToBundle(reasonInfo)); 313 } 314 315 private final boolean[] mImsCapabilities = {false, false, false, false, false, false}; 316 writeOnImsCapabilities(boolean[] capabilities)317 public void writeOnImsCapabilities(boolean[] capabilities) { 318 boolean changed = false; 319 for (int i = 0; i < capabilities.length; i++) { 320 if (mImsCapabilities[i] != capabilities[i]) { 321 mImsCapabilities[i] = capabilities[i]; 322 changed = true; 323 } 324 } 325 326 if (changed) { 327 Bundle b = new Bundle(); 328 b.putBoolean(DATA_KEY_VOLTE, capabilities[0]); 329 b.putBoolean(DATA_KEY_VILTE, capabilities[1]); 330 b.putBoolean(DATA_KEY_VOWIFI, capabilities[2]); 331 b.putBoolean(DATA_KEY_VIWIFI, capabilities[3]); 332 b.putBoolean(DATA_KEY_UTLTE, capabilities[4]); 333 b.putBoolean(DATA_KEY_UTWIFI, capabilities[5]); 334 writeEvent(TAG_IMS_CAPABILITIES, b); 335 } 336 } 337 writeRilSetupDataCall(int rilSerial, int radioTechnology, int profile, String apn, String user, String password, int authType, String protocol)338 public void writeRilSetupDataCall(int rilSerial, 339 int radioTechnology, int profile, String apn, 340 String user, String password, int authType, String protocol) { 341 Bundle b = new Bundle(); 342 b.putInt(DATA_KEY_RAT, radioTechnology); 343 b.putInt(DATA_KEY_DATA_PROFILE, profile); 344 b.putString(DATA_KEY_APN, apn); 345 b.putString(DATA_KEY_PROTOCOL, protocol); 346 writeEvent(TAG_RIL_REQUEST, RIL_REQUEST_SETUP_DATA_CALL, rilSerial, b); 347 } 348 writeRilDeactivateDataCall(int rilSerial, int cid, int reason)349 public void writeRilDeactivateDataCall(int rilSerial, 350 int cid, int reason) { 351 Bundle b = new Bundle(); 352 b.putInt(DATA_KEY_DATA_CALL_CID, cid); 353 b.putInt(DATA_KEY_DATA_DEACTIVATE_REASON, reason); 354 writeEvent(TAG_RIL_REQUEST, RIL_REQUEST_DEACTIVATE_DATA_CALL, rilSerial, b); 355 } 356 writeRilDataCallList(ArrayList<DataCallResponse> dcsList)357 public void writeRilDataCallList(ArrayList<DataCallResponse> dcsList) { 358 Bundle b = new Bundle(); 359 int[] statuses = new int[dcsList.size()]; 360 int[] cids = new int[dcsList.size()]; 361 int[] actives = new int[dcsList.size()]; 362 String[] types = new String[dcsList.size()]; 363 String[] ifnames = new String[dcsList.size()]; 364 for (int i = 0; i < dcsList.size(); i++) { 365 DataCallResponse dcs = dcsList.get(i); 366 statuses[i] = dcs.status; 367 cids[i] = dcs.cid; 368 actives[i] = dcs.active; 369 types[i] = dcs.type; 370 ifnames[i] = dcs.ifname; 371 } 372 b.putIntArray(DATA_KEY_DATA_CALL_STATUSES, statuses); 373 b.putIntArray(DATA_KEY_DATA_CALL_CIDS, cids); 374 b.putIntArray(DATA_KEY_DATA_CALL_ACTIVES, actives); 375 b.putStringArray(DATA_KEY_DATA_CALL_TYPES, types); 376 b.putStringArray(DATA_KEY_DATA_CALL_IFNAMES, ifnames); 377 writeEvent(TAG_DATA_CALL_LIST, -1, -1, b); 378 } 379 writeRilDial(int rilSerial, int clirMode, UUSInfo uusInfo)380 public void writeRilDial(int rilSerial, 381 int clirMode, UUSInfo uusInfo) { 382 Bundle b = new Bundle(); 383 b.putInt(DATA_KEY_CLIR_MODE, clirMode); 384 writeEvent(TAG_RIL_REQUEST, RIL_REQUEST_DIAL, rilSerial, b); 385 } 386 writeRilCallRing(char[] response)387 public void writeRilCallRing(char[] response) { 388 Bundle b = new Bundle(); 389 b.putCharArray(DATA_KEY_RIL_CALL_RING_RESPONSE, response); 390 writeEvent(TAG_RIL_UNSOL_RESPONSE, RIL_UNSOL_CALL_RING, -1, b); 391 } 392 writeRilHangup(int rilSerial, int req, int gsmIndex)393 public void writeRilHangup(int rilSerial, int req, 394 int gsmIndex) { 395 Bundle b = new Bundle(); 396 b.putInt(DATA_KEY_RIL_HANGUP_GSM_INDEX, gsmIndex); 397 writeEvent(TAG_RIL_REQUEST, req, rilSerial, b); 398 } 399 writeRilAnswer(int rilSerial)400 public void writeRilAnswer(int rilSerial) { 401 writeEvent(TAG_RIL_REQUEST, RIL_REQUEST_ANSWER, rilSerial, null); 402 } 403 writeRilSrvcc(int rilSrvccState)404 public void writeRilSrvcc(int rilSrvccState) { 405 writeEvent(TAG_RIL_UNSOL_RESPONSE, RIL_UNSOL_SRVCC_STATE_NOTIFY, rilSrvccState, null); 406 } 407 writeRilSendSms(int rilSerial, int req)408 public void writeRilSendSms(int rilSerial, int req) { 409 writeEvent(TAG_RIL_REQUEST, req, rilSerial, null); 410 } 411 writeRilNewSms(int response)412 public void writeRilNewSms(int response) { 413 writeEvent(TAG_RIL_UNSOL_RESPONSE, response, -1, null); 414 } 415 writeOnRilSolicitedResponse(int rilSerial, int rilError, int rilRequest, Object ret)416 public void writeOnRilSolicitedResponse(int rilSerial, int rilError, int rilRequest, 417 Object ret) { 418 Bundle b = new Bundle(); 419 if (rilError != 0) b.putInt(DATA_KEY_RIL_ERROR, rilError); 420 switch (rilRequest) { 421 case RIL_REQUEST_SETUP_DATA_CALL: 422 DataCallResponse dataCall = (DataCallResponse)ret; 423 b.putInt(DATA_KEY_DATA_CALL_STATUS, dataCall.status); 424 b.putInt(DATA_KEY_DATA_CALL_RETRY, dataCall.suggestedRetryTime); 425 b.putInt(DATA_KEY_DATA_CALL_CID, dataCall.cid); 426 b.putInt(DATA_KEY_DATA_CALL_ACTIVE, dataCall.active); 427 b.putString(DATA_KEY_DATA_CALL_TYPE, dataCall.type); 428 b.putString(DATA_KEY_DATA_CALL_IFNAME, dataCall.ifname); 429 writeEvent(TAG_RIL_RESPONSE, rilRequest, rilSerial, b); 430 break; 431 432 case RIL_REQUEST_DEACTIVATE_DATA_CALL: 433 case RIL_REQUEST_HANGUP: 434 case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: 435 case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: 436 case RIL_REQUEST_DIAL: 437 case RIL_REQUEST_ANSWER: 438 writeEvent(TAG_RIL_RESPONSE, rilRequest, rilSerial, b); 439 break; 440 441 case RIL_REQUEST_SEND_SMS: 442 case RIL_REQUEST_SEND_SMS_EXPECT_MORE: 443 case RIL_REQUEST_CDMA_SEND_SMS: 444 case RIL_REQUEST_IMS_SEND_SMS: 445 SmsResponse smsResponse = (SmsResponse)ret; 446 b.putInt(DATA_KEY_SMS_MESSAGE_REF, smsResponse.mMessageRef); 447 b.putString(DATA_KEY_SMS_ACK_PDU, smsResponse.mAckPdu); 448 b.putInt(DATA_KEY_SMS_ERROR_CODE, smsResponse.mErrorCode); 449 writeEvent(TAG_RIL_RESPONSE, rilRequest, rilSerial, b); 450 break; 451 } 452 } 453 writeOnRilTimeoutResponse(int rilSerial, int rilRequest)454 public void writeOnRilTimeoutResponse(int rilSerial, int rilRequest) { 455 writeEvent(TAG_RIL_TIMEOUT_RESPONSE, rilRequest, rilSerial, null); 456 } 457 writePhoneState(PhoneConstants.State phoneState)458 public void writePhoneState(PhoneConstants.State phoneState) { 459 int state; 460 switch (phoneState) { 461 case IDLE: state = 0; break; 462 case RINGING: state = 1; break; 463 case OFFHOOK: state = 2; break; 464 default: state = -1; break; 465 } 466 writeEvent(TAG_PHONE_STATE, state, -1); 467 } 468 469 /** 470 * Initial state 471 * @param session 472 * @param callState 473 */ writeImsCallState(ImsCallSession session, ImsPhoneCall.State callState)474 public void writeImsCallState(ImsCallSession session, ImsPhoneCall.State callState) { 475 int state; 476 switch (callState) { 477 case IDLE: state = 0; break; 478 case ACTIVE: state = 1; break; 479 case HOLDING: state = 2; break; 480 case DIALING: state = 3; break; 481 case ALERTING: state = 4; break; 482 case INCOMING: state = 5; break; 483 case WAITING: state = 6; break; 484 case DISCONNECTED: state = 7; break; 485 case DISCONNECTING: state = 8; break; 486 default: state = -1; break; 487 } 488 writeEvent(TAG_IMS_CALL_STATE, getCallId(session), state); 489 } 490 writeImsCallEvent(int tag, ImsCallSession session)491 private void writeImsCallEvent(int tag, ImsCallSession session) { 492 writeEvent(tag, getCallId(session), -1); 493 } 494 writeImsCallEvent(int tag, ImsCallSession session, ImsReasonInfo reasonInfo)495 private void writeImsCallEvent(int tag, ImsCallSession session, ImsReasonInfo reasonInfo) { 496 writeEvent(tag, getCallId(session), -1,imsReasonInfoToBundle(reasonInfo)); 497 } 498 imsReasonInfoToBundle(ImsReasonInfo reasonInfo)499 private Bundle imsReasonInfoToBundle(ImsReasonInfo reasonInfo) { 500 if (reasonInfo != null) { 501 Bundle b = new Bundle(); 502 b.putInt(DATA_KEY_REASONINFO_CODE, reasonInfo.mCode); 503 b.putInt(DATA_KEY_REASONINFO_EXTRA_CODE, reasonInfo.mExtraCode); 504 b.putString(DATA_KEY_REASONINFO_EXTRA_MESSAGE, reasonInfo.mExtraMessage); 505 return b; 506 } 507 return null; 508 } 509 writeOnImsCallStart(ImsCallSession session)510 public void writeOnImsCallStart(ImsCallSession session) { 511 writeEvent(TAG_IMS_CALL_START, getCallId(session), -1, null); 512 } 513 writeOnImsCallStartConference(ImsCallSession session)514 public void writeOnImsCallStartConference(ImsCallSession session) { 515 writeEvent(TAG_IMS_CALL_START_CONFERENCE, getCallId(session), -1, null); 516 } 517 writeOnImsCallReceive(ImsCallSession session)518 public void writeOnImsCallReceive(ImsCallSession session) { 519 writeImsCallEvent(TAG_IMS_CALL_RECEIVE, session); 520 } 521 writeOnImsCallAccept(ImsCallSession session)522 public void writeOnImsCallAccept(ImsCallSession session) { 523 writeImsCallEvent(TAG_IMS_CALL_ACCEPT, session); 524 } 525 writeOnImsCallReject(ImsCallSession session)526 public void writeOnImsCallReject(ImsCallSession session) { 527 writeImsCallEvent(TAG_IMS_CALL_REJECT, session); 528 } 529 writeOnImsCallTerminate(ImsCallSession session)530 public void writeOnImsCallTerminate(ImsCallSession session) { 531 writeImsCallEvent(TAG_IMS_CALL_TERMINATE, session); 532 } 533 writeOnImsCallHold(ImsCallSession session)534 public void writeOnImsCallHold(ImsCallSession session) { 535 writeImsCallEvent(TAG_IMS_CALL_HOLD, session); 536 } 537 writeOnImsCallResume(ImsCallSession session)538 public void writeOnImsCallResume(ImsCallSession session) { 539 writeImsCallEvent(TAG_IMS_CALL_RESUME, session); 540 } 541 writeOnImsCallProgressing(ImsCallSession session)542 public void writeOnImsCallProgressing(ImsCallSession session) { 543 writeImsCallEvent(TAG_IMS_CALL_PROGRESSING, session); 544 } 545 writeOnImsCallStarted(ImsCallSession session)546 public void writeOnImsCallStarted(ImsCallSession session) { 547 writeImsCallEvent(TAG_IMS_CALL_STARTED, session); 548 } 549 writeOnImsCallStartFailed(ImsCallSession session, ImsReasonInfo reasonInfo)550 public void writeOnImsCallStartFailed(ImsCallSession session, ImsReasonInfo reasonInfo) { 551 writeImsCallEvent(TAG_IMS_CALL_START_FAILED, session, reasonInfo); 552 } 553 writeOnImsCallTerminated(ImsCallSession session, ImsReasonInfo reasonInfo)554 public void writeOnImsCallTerminated(ImsCallSession session, ImsReasonInfo reasonInfo) { 555 writeImsCallEvent(TAG_IMS_CALL_TERMINATED, session, reasonInfo); 556 } 557 writeOnImsCallHeld(ImsCallSession session)558 public void writeOnImsCallHeld(ImsCallSession session) { 559 writeImsCallEvent(TAG_IMS_CALL_HELD, session); 560 } 561 writeOnImsCallHoldReceived(ImsCallSession session)562 public void writeOnImsCallHoldReceived(ImsCallSession session) { 563 writeImsCallEvent(TAG_IMS_CALL_HOLD_RECEIVED, session); 564 } 565 writeOnImsCallHoldFailed(ImsCallSession session, ImsReasonInfo reasonInfo)566 public void writeOnImsCallHoldFailed(ImsCallSession session, ImsReasonInfo reasonInfo) { 567 writeImsCallEvent(TAG_IMS_CALL_HOLD_FAILED, session, reasonInfo); 568 } 569 writeOnImsCallResumed(ImsCallSession session)570 public void writeOnImsCallResumed(ImsCallSession session) { 571 writeImsCallEvent(TAG_IMS_CALL_RESUMED, session); 572 } 573 writeOnImsCallResumeReceived(ImsCallSession session)574 public void writeOnImsCallResumeReceived(ImsCallSession session) { 575 writeImsCallEvent(TAG_IMS_CALL_RESUME_RECEIVED, session); 576 } 577 writeOnImsCallResumeFailed(ImsCallSession session, ImsReasonInfo reasonInfo)578 public void writeOnImsCallResumeFailed(ImsCallSession session, ImsReasonInfo reasonInfo) { 579 writeImsCallEvent(TAG_IMS_CALL_RESUME_FAILED, session, reasonInfo); 580 } 581 writeOnImsCallHandover(ImsCallSession session, int srcAccessTech, int targetAccessTech, ImsReasonInfo reasonInfo)582 public void writeOnImsCallHandover(ImsCallSession session, 583 int srcAccessTech, int targetAccessTech, ImsReasonInfo reasonInfo) { 584 Bundle b = imsHandoverToBundle(srcAccessTech, targetAccessTech, reasonInfo); 585 writeEvent(TAG_IMS_CALL_HANDOVER, getCallId(session), -1, b); 586 } 587 writeOnImsCallHandoverFailed(ImsCallSession session, int srcAccessTech, int targetAccessTech, ImsReasonInfo reasonInfo)588 public void writeOnImsCallHandoverFailed(ImsCallSession session, 589 int srcAccessTech, int targetAccessTech, ImsReasonInfo reasonInfo) { 590 Bundle b = imsHandoverToBundle(srcAccessTech, targetAccessTech, reasonInfo); 591 writeEvent(TAG_IMS_CALL_HANDOVER_FAILED, getCallId(session), -1, b); 592 } 593 594 /** 595 * Extracts the call ID from an ImsSession. 596 * 597 * @param session The session. 598 * @return The call ID for the session, or -1 if none was found. 599 */ getCallId(ImsCallSession session)600 private int getCallId(ImsCallSession session) { 601 if (session == null) { 602 return -1; 603 } 604 605 try { 606 return Integer.parseInt(session.getCallId()); 607 } catch (NumberFormatException nfe) { 608 return -1; 609 } 610 } 611 imsHandoverToBundle(int srcAccessTech, int targetAccessTech, ImsReasonInfo reasonInfo)612 private Bundle imsHandoverToBundle(int srcAccessTech, int targetAccessTech, 613 ImsReasonInfo reasonInfo) { 614 Bundle b = new Bundle(); 615 b.putInt(DATA_KEY_SRC_TECH, srcAccessTech); 616 b.putInt(DATA_KEY_TARGET_TECH, targetAccessTech); 617 b.putInt(DATA_KEY_REASONINFO_CODE, reasonInfo.mCode); 618 b.putInt(DATA_KEY_REASONINFO_EXTRA_CODE, reasonInfo.mExtraCode); 619 b.putString(DATA_KEY_REASONINFO_EXTRA_MESSAGE, reasonInfo.mExtraMessage); 620 return b; 621 } 622 } 623