Collect telephony events in TelephonyDebugService
Implement ITelephonyDebug Binder interface to receive events from TelephonyEventLog.
Dump events in JSON or CSV format.
Change-Id: Ie0dc4f25611f357b9f0c373a738df332d765e6ca
diff --git a/src/com/android/phone/TelephonyDebugService.java b/src/com/android/phone/TelephonyDebugService.java
index fdfe8f5..04ebec2 100644
--- a/src/com/android/phone/TelephonyDebugService.java
+++ b/src/com/android/phone/TelephonyDebugService.java
@@ -17,24 +17,82 @@
package com.android.phone;
import com.android.internal.telephony.DebugService;
+import com.android.internal.telephony.ITelephonyDebug;
+import com.android.internal.telephony.TelephonyEventLog;
+
import android.app.Service;
import android.content.Intent;
+import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Formatter;
+import java.util.List;
+import java.util.Locale;
+
+import static com.android.internal.telephony.RILConstants.*;
/**
* A debug service for telephony.
*/
public class TelephonyDebugService extends Service {
private static String TAG = "TelephonyDebugService";
+ private static final boolean DBG = true;
+ private static final boolean VDBG = true;
private DebugService mDebugService = new DebugService();
+ public static final String JSON_KEY_TAG = "tag";
+ public static final String JSON_KEY_REG_STATE = "reg-state";
+ public static final String JSON_KEY_DATA_REG_STATE = "data-reg-state";
+ public static final String JSON_KEY_ROAMING_TYPE = "roaming-type";
+ public static final String JSON_KEY_DATA_ROAMING_TYPE = "data-roaming-type";
+ public static final String JSON_KEY_OPERATOR_ALPHA_LONG = "operator-alpha-long";
+ public static final String JSON_KEY_OPERATOR_ALPHA_SHORT = "operator-alpha-short";
+ public static final String JSON_KEY_OPERATOR_NUMERIC = "operator-numeric";
+ public static final String JSON_KEY_DATA_OPERATOR_ALPHA_LONG = "data-operator-alpha-long";
+ public static final String JSON_KEY_DATA_OPERATOR_ALPHA_SHORT = "data-operator-alpha-short";
+ public static final String JSON_KEY_DATA_OPERATOR_NUMERIC = "data-operator-numeric";
+ public static final String JSON_KEY_RAT = "rat";
+ public static final String JSON_KEY_DATA_RAT = "data-rat";
+ public static final String JSON_KEY_STATE = "state";
+ public static final String JSON_KEY_REASON_INFO = "reason_info";
+ public static final String JSON_KEY_REASON_INFO_CODE = "code";
+ public static final String JSON_KEY_REASON_INFO_EXTRA_CODE = "extra_code";
+ public static final String JSON_KEY_REASON_INFO_EXTRA_MESSAGE = "extra_message";
+ public static final String JSON_KEY_VOLTE = "VoLTE";
+ public static final String JSON_KEY_VILTE = "ViLTE";
+ public static final String JSON_KEY_VOWIFI = "VoWiFi";
+ public static final String JSON_KEY_VIWIFI = "ViWiFi";
+ public static final String JSON_KEY_UTLTE = "UTLTE";
+ public static final String JSON_KEY_UTWIFI = "UTWiFi";
+ public static final String JSON_KEY_DATA_CALLS = "data-calls";
+ public static final String JSON_KEY_STATUS = "status";
+ public static final String JSON_KEY_CID = "cid";
+ public static final String JSON_KEY_ACTIVE = "active";
+ public static final String JSON_KEY_TYPE = "type";
+ public static final String JSON_KEY_IFNAME = "ifname";
+ public static final String JSON_KEY_SERIAL = "serial";
+ public static final String JSON_KEY_PROFILE = "profile";
+ public static final String JSON_KEY_APN = "apn";
+ public static final String JSON_KEY_PROTOCOL = "protocol";
+ public static final String JSON_KEY_REASON = "reason";
+ public static final String JSON_KEY_CLIR_MODE = "clirMode";
+ public static final String JSON_KEY_EVT = "evt";
+ public static final String JSON_KEY_GSM_INDEX = "gsmIndex";
+ public static final String JSON_KEY_RETRY = "retry";
+ public static final String JSON_KEY_SMS_MESSAGE_REF = "messageRef";
+ public static final String JSON_KEY_SMS_ERROR_CODE = "errorCode";
+ public static final String JSON_KEY_RIL_ERROR = "error";
+ public static final String JSON_KEY_CALL_ID = "call-id";
+ public static final String JSON_KEY_SRC_TECH = "src-tech";
+ public static final String JSON_KEY_TARGET_TECH = "target-tech";
+
/** Constructor */
public TelephonyDebugService() {
- Log.d(TAG, "TelephonyDebugService()");
+ if (DBG) Log.d(TAG, "TelephonyDebugService()");
}
/**
@@ -42,12 +100,497 @@
*/
@Override
public IBinder onBind(Intent intent) {
- return null;
+ if (DBG) Log.d(TAG, "onBind()");
+ return mBinder;
}
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- mDebugService.dump(fd, pw, args);
+ boolean dumpEvents = false;
+ if (args != null) {
+ for (String arg : args) {
+ if ("--events".equals(arg)) {
+ dumpEvents = true;
+ } else if ("--reset-events".equals(arg)) {
+ synchronized (mEvents) {
+ mEvents.clear();
+ }
+ pw.println("TelephonyDebugService reset.");
+ return;
+ } else if ("-h".equals(arg)) {
+ dumpHelp(pw);
+ return;
+ } else {
+ pw.println("Unknown option: " + arg);
+ dumpHelp(pw);
+ return;
+ }
+ }
+ }
+
+ if (dumpEvents) {
+ synchronized (mEvents) {
+ pw.println("{\"version\": \"1.0\"," +
+ "\"events\": [");
+ for (Event e : mEvents) {
+ pw.println(e.toJson());
+ }
+ pw.println("]}");
+ }
+ } else {
+ mDebugService.dump(fd, pw, args);
+ }
}
+
+ private static void dumpHelp(PrintWriter pw) {
+ pw.println("TelephonyDebugService dump options:");
+ pw.println(" [--events] [--reset-events] [-h]");
+ pw.println(" --events: dump events in JSON format.");
+ pw.println(" --reset-events: reset the stats, clearing all current data.");
+ pw.println(" -h: print this help text.");
+ }
+
+ class Event {
+
+ public static final String JSON_TAG_SETTINGS = "SETTINGS";
+ public static final String JSON_TAG_SERVICE_STATE = "SERVICE_STATE";
+ public static final String JSON_TAG_IMS_CONNECTION_STATE = "IMS_CONNECTION_STATE";
+ public static final String JSON_TAG_IMS_CAPABILITIES = "IMS_CAPABILITIES";
+ public static final String JSON_TAG_DATA_CALL_LIST = "DATA_CALL_LIST";
+ public static final String JSON_TAG_RIL_REQUEST_SETUP_DATA_CALL
+ = "RIL_REQUEST_SETUP_DATA_CALL";
+ public static final String JSON_TAG_RIL_REQUEST_DEACTIVATE_DATA_CALL
+ = "RIL_REQUEST_DEACTIVATE_DATA_CALL";
+ public static final String JSON_TAG_RIL_REQUEST_DIAL = "RIL_REQUEST_DIAL";
+ public static final String JSON_TAG_RIL_REQUEST_HANGUP = "RIL_REQUEST_HANGUP";
+ public static final String JSON_TAG_RIL_REQUEST_ANSWER = "RIL_REQUEST_ANSWER";
+ public static final String JSON_TAG_RIL_REQUEST_SEND_SMS = "RIL_REQUEST_SEND_SMS";
+ public static final String JSON_TAG_RIL_RESPONSE_SETUP_DATA_CALL
+ = "RIL_RESPONSE_SETUP_DATA_CALL";
+ public static final String JSON_TAG_RIL_UNSOL_CALL_RING = "RIL_UNSOL_CALL_RING";
+ public static final String JSON_TAG_RIL_UNSOL_SRVCC_STATE_NOTIFY
+ = "RIL_UNSOL_SRVCC_STATE_NOTIFY";
+ public static final String JSON_TAG_RIL_UNSOL_RESPONSE_NEW_SMS
+ = "RIL_UNSOL_RESPONSE_NEW_SMS";
+ public static final String JSON_TAG_RIL_UNSOL_RESPONSE_CDMA_NEW_SMS
+ = "RIL_UNSOL_RESPONSE_CDMA_NEW_SMS";
+ public static final String JSON_TAG_IMS_CALL = "IMS_CALL";
+ public static final String JSON_TAG_IMS_CALL_HANDOVER = "IMS_CALL_HANDOVER";
+ public static final String JSON_TAG_IMS_CALL_STATE = "IMS_CALL_STATE";
+ public static final String JSON_TAG_PHONE_STATE = "PHONE_STATE";
+ public static final String JSON_TAG_SMS = "SMS";
+
+ public long timestamp;
+ public int phoneId;
+ public int tag;
+ public int param1;
+ public int param2;
+ public Bundle data;
+
+ public Event(long timestamp, int phoneId, int tag, int param1, int param2, Bundle data) {
+ this.timestamp = timestamp;
+ this.phoneId = phoneId;
+ this.tag = tag;
+ this.param1 = param1;
+ this.param2 = param2;
+ this.data = data;
+ }
+
+ public String imsCallEventToString(int evt) {
+ switch (evt) {
+ case TelephonyEventLog.TAG_IMS_CALL_START: return "START";
+ case TelephonyEventLog.TAG_IMS_CALL_START_CONFERENCE: return "START_CONFERENCE";
+ case TelephonyEventLog.TAG_IMS_CALL_RECEIVE: return "RECEIVE";
+ case TelephonyEventLog.TAG_IMS_CALL_ACCEPT: return "ACCEPT";
+ case TelephonyEventLog.TAG_IMS_CALL_REJECT: return "REJECT";
+ case TelephonyEventLog.TAG_IMS_CALL_TERMINATE: return "TERMINATE";
+ case TelephonyEventLog.TAG_IMS_CALL_HOLD: return "HOLD";
+ case TelephonyEventLog.TAG_IMS_CALL_RESUME: return "RESUME";
+ case TelephonyEventLog.TAG_IMS_CALL_MERGE: return "MERGE";
+ case TelephonyEventLog.TAG_IMS_CALL_UPDATE: return "UPDATE";
+ case TelephonyEventLog.TAG_IMS_CALL_PROGRESSING: return "PROGRESSING";
+ case TelephonyEventLog.TAG_IMS_CALL_STARTED: return "STARTED";
+ case TelephonyEventLog.TAG_IMS_CALL_START_FAILED: return "START_FAILED";
+ case TelephonyEventLog.TAG_IMS_CALL_TERMINATED: return "TERMINATED";
+ case TelephonyEventLog.TAG_IMS_CALL_HELD: return "HELD";
+ case TelephonyEventLog.TAG_IMS_CALL_HOLD_FAILED: return "HOLD_FAILED";
+ case TelephonyEventLog.TAG_IMS_CALL_HOLD_RECEIVED: return "HOLD_RECEIVED";
+ case TelephonyEventLog.TAG_IMS_CALL_RESUMED: return "RESUMED";
+ case TelephonyEventLog.TAG_IMS_CALL_RESUME_FAILED: return "RESUME_FAILED";
+ case TelephonyEventLog.TAG_IMS_CALL_RESUME_RECEIVED: return "RESUME_RECEIVED";
+ case TelephonyEventLog.TAG_IMS_CALL_UPDATED: return "UPDATED";
+ case TelephonyEventLog.TAG_IMS_CALL_UPDATE_FAILED: return "UPDATE_FAILED";
+ case TelephonyEventLog.TAG_IMS_CALL_MERGED: return "MERGED";
+ case TelephonyEventLog.TAG_IMS_CALL_MERGE_FAILED: return "MERGE_FAILED";
+ case TelephonyEventLog.TAG_IMS_CALL_HANDOVER: return "HANDOVER";
+ case TelephonyEventLog.TAG_IMS_CALL_HANDOVER_FAILED: return "HANDOVER_FAILED";
+ case TelephonyEventLog.TAG_IMS_CALL_TTY_MODE_RECEIVED: return "TTY_MODE_RECEIVED";
+ case TelephonyEventLog.TAG_IMS_CONFERENCE_PARTICIPANTS_STATE_CHANGED:
+ return "CONFERENCE_PARTICIPANTS_STATE_CHANGED";
+ case TelephonyEventLog.TAG_IMS_MULTIPARTY_STATE_CHANGED:
+ return "MULTIPARTY_STATE_CHANGED";
+ case TelephonyEventLog.TAG_IMS_CALL_STATE: return "STATE";
+ }
+ return "UNKNOWN("+evt+")";
+ }
+
+ public String rilResponseToString(int evt) {
+ switch (evt) {
+ case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "RIL_RESPONSE_DEACTIVATE_DATA_CALL";
+ case RIL_REQUEST_HANGUP: return "RIL_RESPONSE_HANGUP";
+ case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "RIL_RESPONSE_HANGUP_WAITING_OR_BACKGROUND";
+ case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "RIL_RESPONSE_HANGUP_FOREGROUND_RESUME_BACKGROUND";
+ case RIL_REQUEST_DIAL: return "RIL_RESPONSE_DIAL";
+ case RIL_REQUEST_ANSWER: return "RIL_RESPONSE_ANSWER";
+ case RIL_REQUEST_SEND_SMS: return "RIL_RESPONSE_SEND_SMS";
+ case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "RIL_RESPONSE_SEND_SMS_EXPECT_MORE";
+ case RIL_REQUEST_CDMA_SEND_SMS: return "RIL_RESPONSE_CDMA_SEND_SMS";
+ case RIL_REQUEST_IMS_SEND_SMS: return "RIL_RESPONSE_IMS_SEND_SMS";
+ }
+ return "UNKNOWN("+evt+")";
+ }
+
+ public String toString() {
+ return String.format("%d,%d,%d,%d,%d,%s",
+ timestamp, phoneId, tag, param1, param2, data);
+ }
+
+ public String toJson() {
+ StringBuilder sb = new StringBuilder();
+ Formatter formatter = new Formatter(sb, Locale.US);
+ formatter.format("{\"ts\":%d, \"phone\":%d", timestamp, phoneId);
+ switch (tag) {
+ case TelephonyEventLog.TAG_SETTINGS:
+ formatter.format(", \"%s\":\"%s\"", JSON_KEY_TAG, JSON_TAG_SETTINGS);
+ break;
+
+ case TelephonyEventLog.TAG_SERVICE_STATE:
+ serviceStateToJson(formatter);
+ break;
+
+ case TelephonyEventLog.TAG_IMS_CONNECTION_STATE:
+ imsConnectionStateToJson(formatter);
+ break;
+
+ case TelephonyEventLog.TAG_IMS_CAPABILITIES:
+ imsCapabilitiesToJson(formatter);
+ break;
+
+ case TelephonyEventLog.TAG_DATA_CALL_LIST:
+ dataCallListToJson(sb, formatter);
+ break;
+
+ case TelephonyEventLog.TAG_RIL_REQUEST:
+ rilRequestToJson(formatter);
+ break;
+
+ case TelephonyEventLog.TAG_RIL_RESPONSE:
+ rilResponseToJson(formatter);
+ break;
+
+ case TelephonyEventLog.TAG_RIL_UNSOL_RESPONSE:
+ unsolRilResponseToJson(formatter);
+ break;
+
+ case TelephonyEventLog.TAG_IMS_CALL_START:
+ case TelephonyEventLog.TAG_IMS_CALL_START_CONFERENCE:
+ case TelephonyEventLog.TAG_IMS_CALL_RECEIVE:
+ case TelephonyEventLog.TAG_IMS_CALL_ACCEPT:
+ case TelephonyEventLog.TAG_IMS_CALL_REJECT:
+ case TelephonyEventLog.TAG_IMS_CALL_TERMINATE:
+ case TelephonyEventLog.TAG_IMS_CALL_HOLD:
+ case TelephonyEventLog.TAG_IMS_CALL_RESUME:
+ case TelephonyEventLog.TAG_IMS_CALL_PROGRESSING:
+ case TelephonyEventLog.TAG_IMS_CALL_STARTED:
+ case TelephonyEventLog.TAG_IMS_CALL_START_FAILED:
+ case TelephonyEventLog.TAG_IMS_CALL_TERMINATED:
+ case TelephonyEventLog.TAG_IMS_CALL_HELD:
+ case TelephonyEventLog.TAG_IMS_CALL_HOLD_RECEIVED:
+ case TelephonyEventLog.TAG_IMS_CALL_HOLD_FAILED:
+ case TelephonyEventLog.TAG_IMS_CALL_RESUMED:
+ case TelephonyEventLog.TAG_IMS_CALL_RESUME_RECEIVED:
+ case TelephonyEventLog.TAG_IMS_CALL_RESUME_FAILED:
+ imsCallEventToJson(formatter);
+ break;
+
+ case TelephonyEventLog.TAG_IMS_CALL_HANDOVER:
+ case TelephonyEventLog.TAG_IMS_CALL_HANDOVER_FAILED:
+ imsHandoverToJson(formatter);
+ break;
+
+ case TelephonyEventLog.TAG_IMS_CALL_STATE:
+ imsCallStateToJson(formatter);
+ break;
+
+ case TelephonyEventLog.TAG_PHONE_STATE:
+ phoneStateToJson(formatter);
+ break;
+
+ case TelephonyEventLog.TAG_SMS:
+ formatter.format(", \"%s\":\"%s\"", JSON_KEY_TAG, JSON_TAG_SMS);
+ break;
+
+ default:
+ formatter.format(", \"%s\":\"UNKNOWN(%d)\"", JSON_KEY_TAG, tag);
+ break;
+ }
+ sb.append("},");
+ return sb.toString();
+ }
+
+ private void serviceStateToJson(Formatter formatter) {
+ formatter.format(", \"%s\":\"%s\""
+ + ",\"%s\":%d,\"%s\":%d,\"%s\":%d,\"%s\":%d"
+ + ",\"%s\":\"%s\",\"%s\":\"%s\",\"%s\":\"%s\""
+ + ",\"%s\":\"%s\",\"%s\":\"%s\",\"%s\":\"%s\""
+ + ",\"%s\":%d,\"%s\":%d",
+ JSON_KEY_TAG, JSON_TAG_SERVICE_STATE,
+ JSON_KEY_REG_STATE, data.getInt("voiceRegState"),
+ JSON_KEY_DATA_REG_STATE, data.getInt("dataRegState"),
+ JSON_KEY_ROAMING_TYPE, data.getInt("voiceRoamingType"),
+ JSON_KEY_DATA_ROAMING_TYPE, data.getInt("dataRoamingType"),
+ JSON_KEY_OPERATOR_ALPHA_LONG, data.getString("operator-alpha-long"),
+ JSON_KEY_OPERATOR_ALPHA_SHORT, data.getString("operator-alpha-short"),
+ JSON_KEY_OPERATOR_NUMERIC, data.getString("operator-numeric"),
+ JSON_KEY_DATA_OPERATOR_ALPHA_LONG, data.getString("data-operator-alpha-long"),
+ JSON_KEY_DATA_OPERATOR_ALPHA_SHORT, data.getString("data-operator-alpha-short"),
+ JSON_KEY_DATA_OPERATOR_NUMERIC, data.getString("data-operator-numeric"),
+ JSON_KEY_RAT, data.getInt("radioTechnology"),
+ JSON_KEY_DATA_RAT, data.getInt("dataRadioTechnology"));
+ }
+
+ private void imsConnectionStateToJson(Formatter formatter) {
+ if (data == null) {
+ formatter.format(", \"%s\":\"%s\", \"%s\":%d",
+ JSON_KEY_TAG, JSON_TAG_IMS_CONNECTION_STATE, JSON_KEY_STATE, param1);
+ } else {
+ formatter.format(", \"%s\":\"%s\""
+ + ", \"%s\":%d"
+ + ", \"%s\":{\"%s\":%d,\"%s\":%d,\"%s\":%s}",
+ JSON_KEY_TAG, JSON_TAG_IMS_CONNECTION_STATE,
+ JSON_KEY_STATE, param1,
+ JSON_KEY_REASON_INFO,
+ JSON_KEY_REASON_INFO_CODE, data.getInt(
+ TelephonyEventLog.DATA_KEY_REASONINFO_CODE),
+ JSON_KEY_REASON_INFO_EXTRA_CODE, data.getInt(
+ TelephonyEventLog.DATA_KEY_REASONINFO_EXTRA_CODE),
+ JSON_KEY_REASON_INFO_EXTRA_MESSAGE, data.getString(
+ TelephonyEventLog.DATA_KEY_REASONINFO_EXTRA_MESSAGE));
+ }
+ }
+
+ private void imsCapabilitiesToJson(Formatter formatter) {
+ formatter.format(", \"%s\":\"%s\""
+ + ",\"%s\":%b,\"%s\":%b,\"%s\":%b"
+ + ",\"%s\":%b,\"%s\":%b,\"%s\":%b",
+ JSON_KEY_TAG, JSON_TAG_IMS_CAPABILITIES,
+ JSON_KEY_VOLTE, data.getBoolean(TelephonyEventLog.DATA_KEY_VOLTE),
+ JSON_KEY_VILTE, data.getBoolean(TelephonyEventLog.DATA_KEY_VILTE),
+ JSON_KEY_VOWIFI, data.getBoolean(TelephonyEventLog.DATA_KEY_VOWIFI),
+ JSON_KEY_VIWIFI, data.getBoolean(TelephonyEventLog.DATA_KEY_VIWIFI),
+ JSON_KEY_UTLTE, data.getBoolean(TelephonyEventLog.DATA_KEY_UTLTE),
+ JSON_KEY_UTWIFI, data.getBoolean(TelephonyEventLog.DATA_KEY_UTWIFI));
+ }
+
+ private void dataCallListToJson(StringBuilder sb, Formatter formatter) {
+ formatter.format(", \"%s\":\"%s\",\"%s\":[",
+ JSON_KEY_TAG, JSON_TAG_DATA_CALL_LIST, JSON_KEY_DATA_CALLS);
+ int[] statuses = data.getIntArray(TelephonyEventLog.DATA_KEY_DATA_CALL_STATUSES);
+ int[] cids = data.getIntArray(TelephonyEventLog.DATA_KEY_DATA_CALL_CIDS);
+ int[] actives = data.getIntArray(TelephonyEventLog.DATA_KEY_DATA_CALL_ACTIVES);
+ String[] types = data.getStringArray(TelephonyEventLog.DATA_KEY_DATA_CALL_TYPES);
+ String[] ifnames = data.getStringArray(TelephonyEventLog.DATA_KEY_DATA_CALL_IFNAMES);
+ for (int i = 0; i < cids.length; i++) {
+ formatter.format("{\"%s\":%d,\"%s\":%d,\"%s\":%d"
+ + ",\"%s\":\"%s\",\"%s\":\"%s\"},",
+ JSON_KEY_STATUS, statuses[i], JSON_KEY_CID, cids[i],
+ JSON_KEY_ACTIVE, actives[i],
+ JSON_KEY_TYPE, types[i], JSON_KEY_IFNAME, ifnames[i]);
+ }
+ sb.append("]");
+ }
+
+ private void rilRequestToJson(Formatter formatter) {
+ switch (param1) {
+ case RIL_REQUEST_SETUP_DATA_CALL:
+ formatter.format(", \"%s\":\"%s\""
+ + ",\"%s\":%d,\"%s\":\"%s\",\"%s\":\"%s\""
+ + ",\"%s\":\"%s\",\"%s\":\"%s\"",
+ JSON_KEY_TAG, JSON_TAG_RIL_REQUEST_SETUP_DATA_CALL,
+ JSON_KEY_SERIAL, param2,
+ JSON_KEY_RAT, data.getString(
+ TelephonyEventLog.DATA_KEY_RAT),
+ JSON_KEY_PROFILE, data.getString(
+ TelephonyEventLog.DATA_KEY_DATA_PROFILE),
+ JSON_KEY_APN, data.getString(
+ TelephonyEventLog.DATA_KEY_APN),
+ JSON_KEY_PROTOCOL, data.getString(
+ TelephonyEventLog.DATA_KEY_PROTOCOL));
+ break;
+ case RIL_REQUEST_DEACTIVATE_DATA_CALL:
+ formatter.format(", \"%s\":\"%s\""
+ + ",\"%s\":%d,\"%s\":%d,\"%s\":%d",
+ JSON_KEY_TAG, JSON_TAG_RIL_REQUEST_DEACTIVATE_DATA_CALL,
+ JSON_KEY_SERIAL, param2,
+ JSON_KEY_CID, data.getInt(
+ TelephonyEventLog.DATA_KEY_DATA_CALL_CID),
+ JSON_KEY_REASON, data.getInt(
+ TelephonyEventLog.DATA_KEY_DATA_DEACTIVATE_REASON));
+ break;
+ case RIL_REQUEST_DIAL:
+ formatter.format(", \"%s\":\"%s\""
+ + ",\"%s\":%d,\"%s\":%d",
+ JSON_KEY_TAG, JSON_TAG_RIL_REQUEST_DIAL,
+ JSON_KEY_SERIAL, param2,
+ JSON_KEY_CLIR_MODE, data.getInt(
+ TelephonyEventLog.DATA_KEY_CLIR_MODE));
+ break;
+ case RIL_REQUEST_HANGUP:
+ case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND:
+ case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND:
+ formatter.format(", \"%s\":\"%s\""
+ + ",\"%s\":%d, \"%s\":%d"
+ + ",\"%s\":\"%d\"",
+ JSON_KEY_TAG, JSON_TAG_RIL_REQUEST_HANGUP,
+ JSON_KEY_SERIAL, param2, JSON_KEY_EVT, param1,
+ JSON_KEY_GSM_INDEX, data.getInt(
+ TelephonyEventLog.DATA_KEY_RIL_HANGUP_GSM_INDEX));
+ break;
+ case RIL_REQUEST_ANSWER:
+ formatter.format(", \"%s\":\"%s\",\"%s\":%d",
+ JSON_KEY_TAG, JSON_TAG_RIL_REQUEST_ANSWER, JSON_KEY_SERIAL, param2);
+ 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:
+ formatter.format(", \"%s\":\"%s\",\"%s\":%d",
+ JSON_KEY_TAG, JSON_TAG_RIL_REQUEST_SEND_SMS, JSON_KEY_SERIAL, param2);
+ break;
+ }
+ }
+
+ private void rilResponseToJson(Formatter formatter) {
+ switch (param1) {
+ case RIL_REQUEST_SETUP_DATA_CALL:
+ formatter.format(", \"%s\":\"%s\""
+ + ",\"%s\":%d,\"%s\":%d,\"%s\":%d"
+ + ",\"%s\":%d,\"%s\":%d"
+ + ",\"%s\":\"%s\",\"%s\":\"%s\"",
+ JSON_KEY_TAG, JSON_TAG_RIL_RESPONSE_SETUP_DATA_CALL,
+ JSON_KEY_SERIAL, param2,
+ JSON_KEY_STATUS, data.getInt(
+ TelephonyEventLog.DATA_KEY_DATA_CALL_STATUS),
+ JSON_KEY_RETRY, data.getInt(
+ TelephonyEventLog.DATA_KEY_DATA_CALL_RETRY),
+ JSON_KEY_CID, data.getInt(
+ TelephonyEventLog.DATA_KEY_DATA_CALL_CID),
+ JSON_KEY_ACTIVE, data.getInt(
+ TelephonyEventLog.DATA_KEY_DATA_CALL_ACTIVE),
+ JSON_KEY_TYPE, data.getString(
+ TelephonyEventLog.DATA_KEY_DATA_CALL_TYPE),
+ JSON_KEY_IFNAME, data.getString(
+ TelephonyEventLog.DATA_KEY_DATA_CALL_IFNAME));
+ 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:
+ formatter.format(", \"%s\":\"%s\",\"%s\":%d",
+ JSON_KEY_TAG, rilResponseToString(param1), JSON_KEY_SERIAL, param2);
+ 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:
+ formatter.format(", \"%s\":\"%s\",\"%s\":%d"
+ + ",\"%s\":%d,\"%s\":%d",
+ JSON_KEY_TAG, rilResponseToString(param1), JSON_KEY_SERIAL, param2,
+ JSON_KEY_SMS_MESSAGE_REF, data.getInt(
+ TelephonyEventLog.DATA_KEY_SMS_MESSAGE_REF),
+ JSON_KEY_SMS_ERROR_CODE, data.getInt(
+ TelephonyEventLog.DATA_KEY_SMS_ERROR_CODE));
+ break;
+ }
+ formatter.format(", \"%s\":%d",
+ JSON_KEY_RIL_ERROR, data.getInt(TelephonyEventLog.DATA_KEY_RIL_ERROR));
+ }
+
+ private void unsolRilResponseToJson(Formatter formatter) {
+ switch (param1) {
+ case RIL_UNSOL_CALL_RING:
+ formatter.format(", \"%s\":\"%s\"", JSON_KEY_TAG, JSON_TAG_RIL_UNSOL_CALL_RING);
+ break;
+ case RIL_UNSOL_SRVCC_STATE_NOTIFY:
+ formatter.format(", \"%s\":\"%s\",\"%s\":%d",
+ JSON_KEY_TAG, JSON_TAG_RIL_UNSOL_SRVCC_STATE_NOTIFY,
+ JSON_KEY_STATE, param2);
+ break;
+ case RIL_UNSOL_RESPONSE_NEW_SMS:
+ formatter.format(", \"%s\":\"%s\"",
+ JSON_KEY_TAG, JSON_TAG_RIL_UNSOL_RESPONSE_NEW_SMS);
+ break;
+ case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS:
+ formatter.format(", \"%s\":\"%s\"",
+ JSON_KEY_TAG, JSON_TAG_RIL_UNSOL_RESPONSE_CDMA_NEW_SMS);
+ break;
+ }
+ }
+
+ private void imsCallEventToJson(Formatter formatter) {
+ formatter.format(", \"%s\":\"%s\", \"%s\":\"%s\",\"%s\":%d",
+ JSON_KEY_TAG, JSON_TAG_IMS_CALL, JSON_KEY_EVT, imsCallEventToString(tag),
+ JSON_KEY_CALL_ID, param1);
+ }
+
+ private void imsHandoverToJson(Formatter formatter) {
+ formatter.format(", \"%s\":\"%s\", \"%s\":\"%s\",\"%s\":%d"
+ + ",\"%s\":%d,\"%s\":%d"
+ + ",\"%s\":%d,\"%s\":%d,\"%s\":\"%s\"",
+ JSON_KEY_TAG, JSON_TAG_IMS_CALL_HANDOVER,
+ JSON_KEY_EVT, imsCallEventToString(tag), JSON_KEY_CALL_ID, param1,
+ JSON_KEY_SRC_TECH, data.getInt(TelephonyEventLog.DATA_KEY_SRC_TECH),
+ JSON_KEY_TARGET_TECH, data.getInt(TelephonyEventLog.DATA_KEY_TARGET_TECH),
+ JSON_KEY_REASON_INFO_CODE, data.getInt(
+ TelephonyEventLog.DATA_KEY_REASONINFO_CODE),
+ JSON_KEY_REASON_INFO_EXTRA_CODE, data.getInt(
+ TelephonyEventLog.DATA_KEY_REASONINFO_EXTRA_CODE),
+ JSON_KEY_REASON_INFO_EXTRA_MESSAGE, data.getString(
+ TelephonyEventLog.DATA_KEY_REASONINFO_EXTRA_MESSAGE));
+ }
+
+ private void imsCallStateToJson(Formatter formatter) {
+ formatter.format(", \"%s\":\"%s\", \"%s\":%d, \"%s\":%d",
+ JSON_KEY_TAG, JSON_TAG_IMS_CALL_STATE, JSON_KEY_CALL_ID, param1,
+ JSON_KEY_STATE, param2);
+ }
+
+ private void phoneStateToJson(Formatter formatter) {
+ formatter.format(", \"%s\":\"%s\", \"%s\":%d",
+ JSON_KEY_TAG, JSON_TAG_PHONE_STATE, JSON_KEY_STATE, param1);
+ }
+ }
+ private final List<Event> mEvents = new ArrayList<Event>();
+
+ /**
+ * Implementation of the ITelephonyDebug interface.
+ */
+ private final ITelephonyDebug.Stub mBinder = new ITelephonyDebug.Stub() {
+ public void writeEvent(long timestamp, int phoneId, int tag,
+ int param1, int param2, Bundle data) {
+ if (VDBG) {
+ Log.v(TAG, String.format("writeEvent(%d, %d, %d, %d, %d)",
+ timestamp, phoneId, tag, param1, param2));
+ }
+ synchronized (mEvents) {
+ mEvents.add(new Event(timestamp, phoneId, tag, param1, param2, data));
+ }
+ }
+ };
}