• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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