blob: cc534f101841ab44fb7675d076d27b5d17b0eb23 [file] [log] [blame]
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<DataCallResponse> 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;
}
}