package com.android.internal.telephony; import com.android.ims.ImsConfig; import com.android.ims.ImsReasonInfo; import com.android.ims.internal.ImsCallSession; import com.android.internal.telephony.dataconnection.DataCallResponse; import com.android.internal.telephony.imsphone.ImsPhoneCall; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.net.ConnectivityMetricsLogger; import android.os.Bundle; import android.os.IBinder; import android.os.Parcel; import android.os.RemoteException; import android.telephony.ServiceState; import android.util.Log; import android.util.SparseArray; import java.util.ArrayList; import static com.android.internal.telephony.RILConstants.*; /** * Log telephony events * * @hide */ public class TelephonyEventLog extends ConnectivityMetricsLogger { private static String TAG = "TelephonyEventLog"; private static final boolean DBG = true; private static final boolean VDBG = false; // STOPSHIP if true public static final int TAG_SETTINGS = 1; public static final int TAG_SERVICE_STATE = 2; public static final int TAG_IMS_CONNECTION_STATE = 3; public static final int TAG_IMS_CAPABILITIES = 4; public static final int TAG_DATA_CALL_LIST = 5; public static final int TAG_PHONE_STATE = 8; public static final int TAG_RIL_REQUEST = 1001; public static final int TAG_RIL_RESPONSE = 1002; public static final int TAG_RIL_UNSOL_RESPONSE = 1003; public static final int TAG_RIL_TIMEOUT_RESPONSE = 1004; // IImsCallSession public static final int TAG_IMS_CALL_START = 2001; public static final int TAG_IMS_CALL_START_CONFERENCE = 2002; public static final int TAG_IMS_CALL_RECEIVE = 2003; public static final int TAG_IMS_CALL_ACCEPT = 2004; public static final int TAG_IMS_CALL_REJECT = 2005; public static final int TAG_IMS_CALL_TERMINATE = 2006; public static final int TAG_IMS_CALL_HOLD = 2007; public static final int TAG_IMS_CALL_RESUME = 2008; public static final int TAG_IMS_CALL_MERGE = 2009; public static final int TAG_IMS_CALL_UPDATE = 2010; // IImsCallSessionListener public static final int TAG_IMS_CALL_PROGRESSING = 2011; public static final int TAG_IMS_CALL_STARTED = 2012; public static final int TAG_IMS_CALL_START_FAILED = 2013; public static final int TAG_IMS_CALL_TERMINATED = 2014; public static final int TAG_IMS_CALL_HELD = 2015; public static final int TAG_IMS_CALL_HOLD_FAILED = 2016; public static final int TAG_IMS_CALL_HOLD_RECEIVED = 2017; public static final int TAG_IMS_CALL_RESUMED = 2018; public static final int TAG_IMS_CALL_RESUME_FAILED = 2019; public static final int TAG_IMS_CALL_RESUME_RECEIVED = 2020; public static final int TAG_IMS_CALL_UPDATED = 2021; public static final int TAG_IMS_CALL_UPDATE_FAILED = 2022; public static final int TAG_IMS_CALL_MERGED = 2023; public static final int TAG_IMS_CALL_MERGE_FAILED = 2024; public static final int TAG_IMS_CALL_HANDOVER = 2025; public static final int TAG_IMS_CALL_HANDOVER_FAILED = 2026; public static final int TAG_IMS_CALL_TTY_MODE_RECEIVED = 2027; public static final int TAG_IMS_CONFERENCE_PARTICIPANTS_STATE_CHANGED = 2028; public static final int TAG_IMS_MULTIPARTY_STATE_CHANGED = 2029; public static final int TAG_IMS_CALL_STATE = 2030; public static final int SETTING_AIRPLANE_MODE = 1; public static final int SETTING_CELL_DATA_ENABLED = 2; public static final int SETTING_DATA_ROAMING_ENABLED = 3; public static final int SETTING_PREFERRED_NETWORK_MODE = 4; public static final int SETTING_WIFI_ENABLED = 5; public static final int SETTING_VO_LTE_ENABLED = 6; public static final int SETTING_VO_WIFI_ENABLED = 7; public static final int SETTING_WFC_MODE = 8; public static final int SETTING_VI_LTE_ENABLED = 9; public static final int SETTING_VI_WIFI_ENABLED = 10; public static final int IMS_CONNECTION_STATE_CONNECTED = 1; public static final int IMS_CONNECTION_STATE_PROGRESSING = 2; public static final int IMS_CONNECTION_STATE_DISCONNECTED = 3; public static final int IMS_CONNECTION_STATE_RESUMED = 4; public static final int IMS_CONNECTION_STATE_SUSPENDED = 5; public static final String DATA_KEY_PHONE_ID = "phoneId"; public static final String DATA_KEY_PARAM1 = "param1"; public static final String DATA_KEY_PARAM2 = "param2"; public static final String DATA_KEY_REASONINFO_CODE = "code"; public static final String DATA_KEY_REASONINFO_EXTRA_CODE = "extra-code"; public static final String DATA_KEY_REASONINFO_EXTRA_MESSAGE = "extra-message"; public static final String DATA_KEY_VOLTE = "VoLTE"; public static final String DATA_KEY_VILTE = "ViLTE"; public static final String DATA_KEY_VOWIFI = "VoWiFi"; public static final String DATA_KEY_VIWIFI = "ViWiFi"; public static final String DATA_KEY_UTLTE = "UTLTE"; public static final String DATA_KEY_UTWIFI = "UTWiFi"; public static final String DATA_KEY_RAT = "rat"; public static final String DATA_KEY_DATA_PROFILE = "profile"; public static final String DATA_KEY_APN = "apn"; public static final String DATA_KEY_PROTOCOL = "protocol"; public static final String DATA_KEY_DATA_DEACTIVATE_REASON = "reason"; public static final String DATA_KEY_DATA_CALL_STATUSES = "statuses"; public static final String DATA_KEY_DATA_CALL_CIDS = "cids"; public static final String DATA_KEY_DATA_CALL_ACTIVES = "actives"; public static final String DATA_KEY_DATA_CALL_TYPES = "types"; public static final String DATA_KEY_DATA_CALL_IFNAMES = "ifnames"; public static final String DATA_KEY_CLIR_MODE = "clirMode"; public static final String DATA_KEY_RIL_CALL_RING_RESPONSE = "response"; public static final String DATA_KEY_RIL_HANGUP_GSM_INDEX = "gsmIndex"; public static final String DATA_KEY_RIL_ERROR = "error"; public static final String DATA_KEY_DATA_CALL_STATUS = "status"; public static final String DATA_KEY_DATA_CALL_RETRY = "retry"; public static final String DATA_KEY_DATA_CALL_CID = "cid"; public static final String DATA_KEY_DATA_CALL_ACTIVE = "active"; public static final String DATA_KEY_DATA_CALL_TYPE = "type"; public static final String DATA_KEY_DATA_CALL_IFNAME = "ifname"; public static final String DATA_KEY_SMS_MESSAGE_REF = "messageRef"; public static final String DATA_KEY_SMS_ACK_PDU = "ackPDU"; public static final String DATA_KEY_SMS_ERROR_CODE = "errorCode"; public static final String DATA_KEY_CALLEE = "callee"; public static final String DATA_KEY_PARTICIPANTS = "participants"; public static final String DATA_KEY_SRC_TECH = "src-tech"; public static final String DATA_KEY_TARGET_TECH = "target-tech"; public static final String SERVICE_STATE_VOICE_REG_STATE = "regSt"; public static final String SERVICE_STATE_DATA_REG_STATE = "dataRegSt"; public static final String SERVICE_STATE_VOICE_ROAMING_TYPE = "roamingType"; public static final String SERVICE_STATE_DATA_ROAMING_TYPE = "dataRoamingType"; public static final String SERVICE_STATE_VOICE_ALPHA_LONG = "alphaLong"; public static final String SERVICE_STATE_VOICE_ALPNA_SHORT = "alphaShort"; public static final String SERVICE_STATE_VOICE_NUMERIC = "operator"; public static final String SERVICE_STATE_DATA_ALPHA_LONG = "dataAlphaLong"; public static final String SERVICE_STATE_DATA_ALPNA_SHORT = "dataAlphaShort"; public static final String SERVICE_STATE_DATA_NUMERIC = "dataOperator"; public static final String SERVICE_STATE_VOICE_RAT = "rat"; public static final String SERVICE_STATE_DATA_RAT = "dataRat"; public static final String SERVICE_STATE_EMERGENCY_ONLY = "emergencyOnly"; int mPhoneId; public TelephonyEventLog(int phoneId) { super(); mPhoneId = phoneId; } private void writeEvent(int tag, Bundle data) { writeEvent(System.currentTimeMillis(), tag, -1, -1, data); } private void writeEvent(int tag, int param1, int param2) { writeEvent(System.currentTimeMillis(), tag, param1, param2, null); } private void writeEvent(int tag, int param1, int param2, Bundle data) { writeEvent(System.currentTimeMillis(), tag, param1, param2, data); } private void writeEvent(long timestamp, int tag, int param1, int param2, Bundle data) { Bundle b = data; if (b == null) { b = new Bundle(); } b.putInt(DATA_KEY_PHONE_ID, mPhoneId); b.putInt(DATA_KEY_PARAM1, param1); b.putInt(DATA_KEY_PARAM2, param2); logEvent(timestamp, ConnectivityMetricsLogger.COMPONENT_TAG_TELEPHONY, tag, b); } private int mVoiceRegState = -1; private int mDataRegState = -1; private int mVoiceRoamingType = -1; private int mDataRoamingType = -1; private String mVoiceOperatorAlphaShort; private String mVoiceOperatorNumeric; private String mDataOperatorAlphaShort; private String mDataOperatorNumeric; private int mRilVoiceRadioTechnology = -1; private int mRilDataRadioTechnology = -1; private boolean mEmergencyOnly = false; public static boolean equals(Object a, Object b) { return (a == null ? b == null : a.equals(b)); } public void writeServiceStateChanged(ServiceState serviceState) { Bundle b = new Bundle(); boolean changed = false; if (mVoiceRegState != serviceState.getVoiceRegState()) { mVoiceRegState = serviceState.getVoiceRegState(); b.putInt(SERVICE_STATE_VOICE_REG_STATE, mVoiceRegState); changed = true; } if (mDataRegState != serviceState.getDataRegState()) { mDataRegState = serviceState.getDataRegState(); b.putInt(SERVICE_STATE_DATA_REG_STATE, mDataRegState); changed = true; } if (mVoiceRoamingType != serviceState.getVoiceRoamingType()) { mVoiceRoamingType = serviceState.getVoiceRoamingType(); b.putInt(SERVICE_STATE_VOICE_ROAMING_TYPE, mVoiceRoamingType); changed = true; } if (mDataRoamingType != serviceState.getDataRoamingType()) { mDataRoamingType = serviceState.getDataRoamingType(); b.putInt(SERVICE_STATE_DATA_ROAMING_TYPE, mDataRoamingType); changed = true; } if (!equals(mVoiceOperatorAlphaShort, serviceState.getVoiceOperatorAlphaShort()) || !equals(mVoiceOperatorNumeric, serviceState.getVoiceOperatorNumeric())) { // TODO: Evaluate if we need to send AlphaLong. AlphaShort+Numeric might be enough. //b.putString(SERVICE_STATE_VOICE_ALPHA_LONG, serviceState.getVoiceOperatorAlphaLong()); mVoiceOperatorAlphaShort = serviceState.getVoiceOperatorAlphaShort(); mVoiceOperatorNumeric = serviceState.getVoiceOperatorNumeric(); b.putString(SERVICE_STATE_VOICE_ALPNA_SHORT, mVoiceOperatorAlphaShort); b.putString(SERVICE_STATE_VOICE_NUMERIC, mVoiceOperatorNumeric); changed = true; } if (!equals(mDataOperatorAlphaShort, serviceState.getDataOperatorAlphaShort()) || !equals(mDataOperatorNumeric, serviceState.getDataOperatorNumeric())) { // TODO: Evaluate if we need to send AlphaLong. AlphaShort+Numeric might be enough. //b.putString(SERVICE_STATE_DATA_ALPHA_LONG, serviceState.getDataOperatorAlphaLong()); mDataOperatorAlphaShort = serviceState.getDataOperatorAlphaShort(); mDataOperatorNumeric = serviceState.getDataOperatorNumeric(); b.putString(SERVICE_STATE_DATA_ALPNA_SHORT, mDataOperatorAlphaShort); b.putString(SERVICE_STATE_DATA_NUMERIC, mDataOperatorNumeric); changed = true; } if (mRilVoiceRadioTechnology != serviceState.getRilVoiceRadioTechnology()) { mRilVoiceRadioTechnology = serviceState.getRilVoiceRadioTechnology(); b.putInt(SERVICE_STATE_VOICE_RAT, mRilVoiceRadioTechnology); changed = true; } if (mRilDataRadioTechnology != serviceState.getRilDataRadioTechnology()) { mRilDataRadioTechnology = serviceState.getRilDataRadioTechnology(); b.putInt(SERVICE_STATE_DATA_RAT, mRilDataRadioTechnology); changed = true; } if (mEmergencyOnly != serviceState.isEmergencyOnly()) { mEmergencyOnly = serviceState.isEmergencyOnly(); b.putBoolean(SERVICE_STATE_EMERGENCY_ONLY, mEmergencyOnly); changed = true; } if (changed) { writeEvent(TAG_SERVICE_STATE, b); } } public void writeSetAirplaneMode(boolean enabled) { writeEvent(TAG_SETTINGS, SETTING_AIRPLANE_MODE, enabled ? 1 : 0); } public void writeSetCellDataEnabled(boolean enabled) { writeEvent(TAG_SETTINGS, SETTING_CELL_DATA_ENABLED, enabled ? 1 : 0); } public void writeSetDataRoamingEnabled(boolean enabled) { writeEvent(TAG_SETTINGS, SETTING_DATA_ROAMING_ENABLED, enabled ? 1 : 0); } public void writeSetPreferredNetworkType(int mode) { writeEvent(TAG_SETTINGS, SETTING_PREFERRED_NETWORK_MODE, mode); } public void writeSetWifiEnabled(boolean enabled) { writeEvent(TAG_SETTINGS, SETTING_WIFI_ENABLED, enabled ? 1 : 0); } public void writeSetWfcMode(int mode) { writeEvent(TAG_SETTINGS, SETTING_WFC_MODE, mode); } public void writeImsSetFeatureValue(int feature, int network, int value, int status) { switch (feature) { case ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE: writeEvent(TAG_SETTINGS, SETTING_VO_LTE_ENABLED, value); break; case ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_WIFI: writeEvent(TAG_SETTINGS, SETTING_VO_WIFI_ENABLED, value); break; case ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE: writeEvent(TAG_SETTINGS, SETTING_VI_LTE_ENABLED, value); break; case ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_WIFI: writeEvent(TAG_SETTINGS, SETTING_VI_WIFI_ENABLED, value); break; } } public void writeOnImsConnectionState(int state, ImsReasonInfo reasonInfo) { writeEvent(TAG_IMS_CONNECTION_STATE, state, -1, imsReasonInfoToBundle(reasonInfo)); } private final boolean[] mImsCapabilities = {false, false, false, false, false, false}; public void writeOnImsCapabilities(boolean[] capabilities) { boolean changed = false; for (int i = 0; i < capabilities.length; i++) { if (mImsCapabilities[i] != capabilities[i]) { mImsCapabilities[i] = capabilities[i]; changed = true; } } if (changed) { Bundle b = new Bundle(); b.putBoolean(DATA_KEY_VOLTE, capabilities[0]); b.putBoolean(DATA_KEY_VILTE, capabilities[1]); b.putBoolean(DATA_KEY_VOWIFI, capabilities[2]); b.putBoolean(DATA_KEY_VIWIFI, capabilities[3]); b.putBoolean(DATA_KEY_UTLTE, capabilities[4]); b.putBoolean(DATA_KEY_UTWIFI, capabilities[5]); writeEvent(TAG_IMS_CAPABILITIES, b); } } public void writeRilSetupDataCall(int rilSerial, int radioTechnology, int profile, String apn, String user, String password, int authType, String protocol) { Bundle b = new Bundle(); b.putInt(DATA_KEY_RAT, radioTechnology); b.putInt(DATA_KEY_DATA_PROFILE, profile); b.putString(DATA_KEY_APN, apn); b.putString(DATA_KEY_PROTOCOL, protocol); writeEvent(TAG_RIL_REQUEST, RIL_REQUEST_SETUP_DATA_CALL, rilSerial, b); } public void writeRilDeactivateDataCall(int rilSerial, int cid, int reason) { Bundle b = new Bundle(); b.putInt(DATA_KEY_DATA_CALL_CID, cid); b.putInt(DATA_KEY_DATA_DEACTIVATE_REASON, reason); writeEvent(TAG_RIL_REQUEST, RIL_REQUEST_DEACTIVATE_DATA_CALL, rilSerial, b); } public void writeRilDataCallList(ArrayList dcsList) { Bundle b = new Bundle(); int[] statuses = new int[dcsList.size()]; int[] cids = new int[dcsList.size()]; int[] actives = new int[dcsList.size()]; String[] types = new String[dcsList.size()]; String[] ifnames = new String[dcsList.size()]; for (int i = 0; i < dcsList.size(); i++) { DataCallResponse dcs = dcsList.get(i); statuses[i] = dcs.status; cids[i] = dcs.cid; actives[i] = dcs.active; types[i] = dcs.type; ifnames[i] = dcs.ifname; } b.putIntArray(DATA_KEY_DATA_CALL_STATUSES, statuses); b.putIntArray(DATA_KEY_DATA_CALL_CIDS, cids); b.putIntArray(DATA_KEY_DATA_CALL_ACTIVES, actives); b.putStringArray(DATA_KEY_DATA_CALL_TYPES, types); b.putStringArray(DATA_KEY_DATA_CALL_IFNAMES, ifnames); writeEvent(TAG_DATA_CALL_LIST, -1, -1, b); } public void writeRilDial(int rilSerial, int clirMode, UUSInfo uusInfo) { Bundle b = new Bundle(); b.putInt(DATA_KEY_CLIR_MODE, clirMode); writeEvent(TAG_RIL_REQUEST, RIL_REQUEST_DIAL, rilSerial, b); } public void writeRilCallRing(char[] response) { Bundle b = new Bundle(); b.putCharArray(DATA_KEY_RIL_CALL_RING_RESPONSE, response); writeEvent(TAG_RIL_UNSOL_RESPONSE, RIL_UNSOL_CALL_RING, -1, b); } public void writeRilHangup(int rilSerial, int req, int gsmIndex) { Bundle b = new Bundle(); b.putInt(DATA_KEY_RIL_HANGUP_GSM_INDEX, gsmIndex); writeEvent(TAG_RIL_REQUEST, req, rilSerial, b); } public void writeRilAnswer(int rilSerial) { writeEvent(TAG_RIL_REQUEST, RIL_REQUEST_ANSWER, rilSerial, null); } public void writeRilSrvcc(int rilSrvccState) { writeEvent(TAG_RIL_UNSOL_RESPONSE, RIL_UNSOL_SRVCC_STATE_NOTIFY, rilSrvccState, null); } public void writeRilSendSms(int rilSerial, int req) { writeEvent(TAG_RIL_REQUEST, req, rilSerial, null); } public void writeRilNewSms(int response) { writeEvent(TAG_RIL_UNSOL_RESPONSE, response, -1, null); } public void writeOnRilSolicitedResponse(int rilSerial, int rilError, int rilRequest, Object ret) { Bundle b = new Bundle(); if (rilError != 0) b.putInt(DATA_KEY_RIL_ERROR, rilError); switch (rilRequest) { case RIL_REQUEST_SETUP_DATA_CALL: DataCallResponse dataCall = (DataCallResponse)ret; b.putInt(DATA_KEY_DATA_CALL_STATUS, dataCall.status); b.putInt(DATA_KEY_DATA_CALL_RETRY, dataCall.suggestedRetryTime); b.putInt(DATA_KEY_DATA_CALL_CID, dataCall.cid); b.putInt(DATA_KEY_DATA_CALL_ACTIVE, dataCall.active); b.putString(DATA_KEY_DATA_CALL_TYPE, dataCall.type); b.putString(DATA_KEY_DATA_CALL_IFNAME, dataCall.ifname); writeEvent(TAG_RIL_RESPONSE, rilRequest, rilSerial, b); break; case RIL_REQUEST_DEACTIVATE_DATA_CALL: case RIL_REQUEST_HANGUP: case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: case RIL_REQUEST_DIAL: case RIL_REQUEST_ANSWER: writeEvent(TAG_RIL_RESPONSE, rilRequest, rilSerial, b); break; case RIL_REQUEST_SEND_SMS: case RIL_REQUEST_SEND_SMS_EXPECT_MORE: case RIL_REQUEST_CDMA_SEND_SMS: case RIL_REQUEST_IMS_SEND_SMS: SmsResponse smsResponse = (SmsResponse)ret; b.putInt(DATA_KEY_SMS_MESSAGE_REF, smsResponse.mMessageRef); b.putString(DATA_KEY_SMS_ACK_PDU, smsResponse.mAckPdu); b.putInt(DATA_KEY_SMS_ERROR_CODE, smsResponse.mErrorCode); writeEvent(TAG_RIL_RESPONSE, rilRequest, rilSerial, b); break; } } public void writeOnRilTimeoutResponse(int rilSerial, int rilRequest) { writeEvent(TAG_RIL_TIMEOUT_RESPONSE, rilRequest, rilSerial, null); } public void writePhoneState(PhoneConstants.State phoneState) { int state; switch (phoneState) { case IDLE: state = 0; break; case RINGING: state = 1; break; case OFFHOOK: state = 2; break; default: state = -1; break; } writeEvent(TAG_PHONE_STATE, state, -1); } /** * Initial state * @param session * @param callState */ public void writeImsCallState(ImsCallSession session, ImsPhoneCall.State callState) { int state; switch (callState) { case IDLE: state = 0; break; case ACTIVE: state = 1; break; case HOLDING: state = 2; break; case DIALING: state = 3; break; case ALERTING: state = 4; break; case INCOMING: state = 5; break; case WAITING: state = 6; break; case DISCONNECTED: state = 7; break; case DISCONNECTING: state = 8; break; default: state = -1; break; } writeEvent(TAG_IMS_CALL_STATE, getCallId(session), state); } private void writeImsCallEvent(int tag, ImsCallSession session) { writeEvent(tag, getCallId(session), -1); } private void writeImsCallEvent(int tag, ImsCallSession session, ImsReasonInfo reasonInfo) { writeEvent(tag, getCallId(session), -1,imsReasonInfoToBundle(reasonInfo)); } private Bundle imsReasonInfoToBundle(ImsReasonInfo reasonInfo) { if (reasonInfo != null) { Bundle b = new Bundle(); b.putInt(DATA_KEY_REASONINFO_CODE, reasonInfo.mCode); b.putInt(DATA_KEY_REASONINFO_EXTRA_CODE, reasonInfo.mExtraCode); b.putString(DATA_KEY_REASONINFO_EXTRA_MESSAGE, reasonInfo.mExtraMessage); return b; } return null; } public void writeOnImsCallStart(ImsCallSession session, String callee) { Bundle b = new Bundle(); b.putString(DATA_KEY_CALLEE, callee); writeEvent(TAG_IMS_CALL_START, getCallId(session), -1, b); } public void writeOnImsCallStartConference(ImsCallSession session, String[] participants) { Bundle b = new Bundle(); b.putStringArray(DATA_KEY_PARTICIPANTS, participants); writeEvent(TAG_IMS_CALL_START_CONFERENCE, getCallId(session), -1, b); } public void writeOnImsCallReceive(ImsCallSession session) { writeImsCallEvent(TAG_IMS_CALL_RECEIVE, session); } public void writeOnImsCallAccept(ImsCallSession session) { writeImsCallEvent(TAG_IMS_CALL_ACCEPT, session); } public void writeOnImsCallReject(ImsCallSession session) { writeImsCallEvent(TAG_IMS_CALL_REJECT, session); } public void writeOnImsCallTerminate(ImsCallSession session) { writeImsCallEvent(TAG_IMS_CALL_TERMINATE, session); } public void writeOnImsCallHold(ImsCallSession session) { writeImsCallEvent(TAG_IMS_CALL_HOLD, session); } public void writeOnImsCallResume(ImsCallSession session) { writeImsCallEvent(TAG_IMS_CALL_RESUME, session); } public void writeOnImsCallProgressing(ImsCallSession session) { writeImsCallEvent(TAG_IMS_CALL_PROGRESSING, session); } public void writeOnImsCallStarted(ImsCallSession session) { writeImsCallEvent(TAG_IMS_CALL_STARTED, session); } public void writeOnImsCallStartFailed(ImsCallSession session, ImsReasonInfo reasonInfo) { writeImsCallEvent(TAG_IMS_CALL_START_FAILED, session, reasonInfo); } public void writeOnImsCallTerminated(ImsCallSession session, ImsReasonInfo reasonInfo) { writeImsCallEvent(TAG_IMS_CALL_TERMINATED, session, reasonInfo); } public void writeOnImsCallHeld(ImsCallSession session) { writeImsCallEvent(TAG_IMS_CALL_HELD, session); } public void writeOnImsCallHoldReceived(ImsCallSession session) { writeImsCallEvent(TAG_IMS_CALL_HOLD_RECEIVED, session); } public void writeOnImsCallHoldFailed(ImsCallSession session, ImsReasonInfo reasonInfo) { writeImsCallEvent(TAG_IMS_CALL_HOLD_FAILED, session, reasonInfo); } public void writeOnImsCallResumed(ImsCallSession session) { writeImsCallEvent(TAG_IMS_CALL_RESUMED, session); } public void writeOnImsCallResumeReceived(ImsCallSession session) { writeImsCallEvent(TAG_IMS_CALL_RESUME_RECEIVED, session); } public void writeOnImsCallResumeFailed(ImsCallSession session, ImsReasonInfo reasonInfo) { writeImsCallEvent(TAG_IMS_CALL_RESUME_FAILED, session, reasonInfo); } public void writeOnImsCallHandover(ImsCallSession session, int srcAccessTech, int targetAccessTech, ImsReasonInfo reasonInfo) { Bundle b = imsHandoverToBundle(srcAccessTech, targetAccessTech, reasonInfo); writeEvent(TAG_IMS_CALL_HANDOVER, getCallId(session), -1, b); } public void writeOnImsCallHandoverFailed(ImsCallSession session, int srcAccessTech, int targetAccessTech, ImsReasonInfo reasonInfo) { Bundle b = imsHandoverToBundle(srcAccessTech, targetAccessTech, reasonInfo); writeEvent(TAG_IMS_CALL_HANDOVER_FAILED, getCallId(session), -1, b); } /** * Extracts the call ID from an ImsSession. * * @param session The session. * @return The call ID for the session, or -1 if none was found. */ private int getCallId(ImsCallSession session) { if (session == null) { return -1; } try { return Integer.parseInt(session.getCallId()); } catch (NumberFormatException nfe) { return -1; } } private Bundle imsHandoverToBundle(int srcAccessTech, int targetAccessTech, ImsReasonInfo reasonInfo) { Bundle b = new Bundle(); b.putInt(DATA_KEY_SRC_TECH, srcAccessTech); b.putInt(DATA_KEY_TARGET_TECH, targetAccessTech); b.putInt(DATA_KEY_REASONINFO_CODE, reasonInfo.mCode); b.putInt(DATA_KEY_REASONINFO_EXTRA_CODE, reasonInfo.mExtraCode); b.putString(DATA_KEY_REASONINFO_EXTRA_MESSAGE, reasonInfo.mExtraMessage); return b; } }