blob: 04ebec2520ee66da863596be45a4279ce0bdefb9 [file] [log] [blame]
Santos Cordon7d4ddf62013-07-10 11:58:08 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.phone;
18
19import com.android.internal.telephony.DebugService;
Pavel Zhamaitsiaka94b97e2016-01-12 11:37:36 -080020import com.android.internal.telephony.ITelephonyDebug;
21import com.android.internal.telephony.TelephonyEventLog;
22
Santos Cordon7d4ddf62013-07-10 11:58:08 -070023import android.app.Service;
24import android.content.Intent;
Pavel Zhamaitsiaka94b97e2016-01-12 11:37:36 -080025import android.os.Bundle;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070026import android.os.IBinder;
27import android.util.Log;
28
29import java.io.FileDescriptor;
30import java.io.PrintWriter;
Pavel Zhamaitsiaka94b97e2016-01-12 11:37:36 -080031import java.util.ArrayList;
32import java.util.Formatter;
33import java.util.List;
34import java.util.Locale;
35
36import static com.android.internal.telephony.RILConstants.*;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070037
38/**
39 * A debug service for telephony.
40 */
41public class TelephonyDebugService extends Service {
42 private static String TAG = "TelephonyDebugService";
Pavel Zhamaitsiaka94b97e2016-01-12 11:37:36 -080043 private static final boolean DBG = true;
44 private static final boolean VDBG = true;
Santos Cordon7d4ddf62013-07-10 11:58:08 -070045 private DebugService mDebugService = new DebugService();
46
Pavel Zhamaitsiaka94b97e2016-01-12 11:37:36 -080047 public static final String JSON_KEY_TAG = "tag";
48 public static final String JSON_KEY_REG_STATE = "reg-state";
49 public static final String JSON_KEY_DATA_REG_STATE = "data-reg-state";
50 public static final String JSON_KEY_ROAMING_TYPE = "roaming-type";
51 public static final String JSON_KEY_DATA_ROAMING_TYPE = "data-roaming-type";
52 public static final String JSON_KEY_OPERATOR_ALPHA_LONG = "operator-alpha-long";
53 public static final String JSON_KEY_OPERATOR_ALPHA_SHORT = "operator-alpha-short";
54 public static final String JSON_KEY_OPERATOR_NUMERIC = "operator-numeric";
55 public static final String JSON_KEY_DATA_OPERATOR_ALPHA_LONG = "data-operator-alpha-long";
56 public static final String JSON_KEY_DATA_OPERATOR_ALPHA_SHORT = "data-operator-alpha-short";
57 public static final String JSON_KEY_DATA_OPERATOR_NUMERIC = "data-operator-numeric";
58 public static final String JSON_KEY_RAT = "rat";
59 public static final String JSON_KEY_DATA_RAT = "data-rat";
60 public static final String JSON_KEY_STATE = "state";
61 public static final String JSON_KEY_REASON_INFO = "reason_info";
62 public static final String JSON_KEY_REASON_INFO_CODE = "code";
63 public static final String JSON_KEY_REASON_INFO_EXTRA_CODE = "extra_code";
64 public static final String JSON_KEY_REASON_INFO_EXTRA_MESSAGE = "extra_message";
65 public static final String JSON_KEY_VOLTE = "VoLTE";
66 public static final String JSON_KEY_VILTE = "ViLTE";
67 public static final String JSON_KEY_VOWIFI = "VoWiFi";
68 public static final String JSON_KEY_VIWIFI = "ViWiFi";
69 public static final String JSON_KEY_UTLTE = "UTLTE";
70 public static final String JSON_KEY_UTWIFI = "UTWiFi";
71 public static final String JSON_KEY_DATA_CALLS = "data-calls";
72 public static final String JSON_KEY_STATUS = "status";
73 public static final String JSON_KEY_CID = "cid";
74 public static final String JSON_KEY_ACTIVE = "active";
75 public static final String JSON_KEY_TYPE = "type";
76 public static final String JSON_KEY_IFNAME = "ifname";
77 public static final String JSON_KEY_SERIAL = "serial";
78 public static final String JSON_KEY_PROFILE = "profile";
79 public static final String JSON_KEY_APN = "apn";
80 public static final String JSON_KEY_PROTOCOL = "protocol";
81 public static final String JSON_KEY_REASON = "reason";
82 public static final String JSON_KEY_CLIR_MODE = "clirMode";
83 public static final String JSON_KEY_EVT = "evt";
84 public static final String JSON_KEY_GSM_INDEX = "gsmIndex";
85 public static final String JSON_KEY_RETRY = "retry";
86 public static final String JSON_KEY_SMS_MESSAGE_REF = "messageRef";
87 public static final String JSON_KEY_SMS_ERROR_CODE = "errorCode";
88 public static final String JSON_KEY_RIL_ERROR = "error";
89 public static final String JSON_KEY_CALL_ID = "call-id";
90 public static final String JSON_KEY_SRC_TECH = "src-tech";
91 public static final String JSON_KEY_TARGET_TECH = "target-tech";
92
Santos Cordon7d4ddf62013-07-10 11:58:08 -070093 /** Constructor */
94 public TelephonyDebugService() {
Pavel Zhamaitsiaka94b97e2016-01-12 11:37:36 -080095 if (DBG) Log.d(TAG, "TelephonyDebugService()");
Santos Cordon7d4ddf62013-07-10 11:58:08 -070096 }
97
98 /**
99 * {@inheritDoc}
100 */
101 @Override
102 public IBinder onBind(Intent intent) {
Pavel Zhamaitsiaka94b97e2016-01-12 11:37:36 -0800103 if (DBG) Log.d(TAG, "onBind()");
104 return mBinder;
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700105 }
106
107 @Override
108 protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
Pavel Zhamaitsiaka94b97e2016-01-12 11:37:36 -0800109 boolean dumpEvents = false;
110 if (args != null) {
111 for (String arg : args) {
112 if ("--events".equals(arg)) {
113 dumpEvents = true;
114 } else if ("--reset-events".equals(arg)) {
115 synchronized (mEvents) {
116 mEvents.clear();
117 }
118 pw.println("TelephonyDebugService reset.");
119 return;
120 } else if ("-h".equals(arg)) {
121 dumpHelp(pw);
122 return;
123 } else {
124 pw.println("Unknown option: " + arg);
125 dumpHelp(pw);
126 return;
127 }
128 }
129 }
130
131 if (dumpEvents) {
132 synchronized (mEvents) {
133 pw.println("{\"version\": \"1.0\"," +
134 "\"events\": [");
135 for (Event e : mEvents) {
136 pw.println(e.toJson());
137 }
138 pw.println("]}");
139 }
140 } else {
141 mDebugService.dump(fd, pw, args);
142 }
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700143 }
Pavel Zhamaitsiaka94b97e2016-01-12 11:37:36 -0800144
145 private static void dumpHelp(PrintWriter pw) {
146 pw.println("TelephonyDebugService dump options:");
147 pw.println(" [--events] [--reset-events] [-h]");
148 pw.println(" --events: dump events in JSON format.");
149 pw.println(" --reset-events: reset the stats, clearing all current data.");
150 pw.println(" -h: print this help text.");
151 }
152
153 class Event {
154
155 public static final String JSON_TAG_SETTINGS = "SETTINGS";
156 public static final String JSON_TAG_SERVICE_STATE = "SERVICE_STATE";
157 public static final String JSON_TAG_IMS_CONNECTION_STATE = "IMS_CONNECTION_STATE";
158 public static final String JSON_TAG_IMS_CAPABILITIES = "IMS_CAPABILITIES";
159 public static final String JSON_TAG_DATA_CALL_LIST = "DATA_CALL_LIST";
160 public static final String JSON_TAG_RIL_REQUEST_SETUP_DATA_CALL
161 = "RIL_REQUEST_SETUP_DATA_CALL";
162 public static final String JSON_TAG_RIL_REQUEST_DEACTIVATE_DATA_CALL
163 = "RIL_REQUEST_DEACTIVATE_DATA_CALL";
164 public static final String JSON_TAG_RIL_REQUEST_DIAL = "RIL_REQUEST_DIAL";
165 public static final String JSON_TAG_RIL_REQUEST_HANGUP = "RIL_REQUEST_HANGUP";
166 public static final String JSON_TAG_RIL_REQUEST_ANSWER = "RIL_REQUEST_ANSWER";
167 public static final String JSON_TAG_RIL_REQUEST_SEND_SMS = "RIL_REQUEST_SEND_SMS";
168 public static final String JSON_TAG_RIL_RESPONSE_SETUP_DATA_CALL
169 = "RIL_RESPONSE_SETUP_DATA_CALL";
170 public static final String JSON_TAG_RIL_UNSOL_CALL_RING = "RIL_UNSOL_CALL_RING";
171 public static final String JSON_TAG_RIL_UNSOL_SRVCC_STATE_NOTIFY
172 = "RIL_UNSOL_SRVCC_STATE_NOTIFY";
173 public static final String JSON_TAG_RIL_UNSOL_RESPONSE_NEW_SMS
174 = "RIL_UNSOL_RESPONSE_NEW_SMS";
175 public static final String JSON_TAG_RIL_UNSOL_RESPONSE_CDMA_NEW_SMS
176 = "RIL_UNSOL_RESPONSE_CDMA_NEW_SMS";
177 public static final String JSON_TAG_IMS_CALL = "IMS_CALL";
178 public static final String JSON_TAG_IMS_CALL_HANDOVER = "IMS_CALL_HANDOVER";
179 public static final String JSON_TAG_IMS_CALL_STATE = "IMS_CALL_STATE";
180 public static final String JSON_TAG_PHONE_STATE = "PHONE_STATE";
181 public static final String JSON_TAG_SMS = "SMS";
182
183 public long timestamp;
184 public int phoneId;
185 public int tag;
186 public int param1;
187 public int param2;
188 public Bundle data;
189
190 public Event(long timestamp, int phoneId, int tag, int param1, int param2, Bundle data) {
191 this.timestamp = timestamp;
192 this.phoneId = phoneId;
193 this.tag = tag;
194 this.param1 = param1;
195 this.param2 = param2;
196 this.data = data;
197 }
198
199 public String imsCallEventToString(int evt) {
200 switch (evt) {
201 case TelephonyEventLog.TAG_IMS_CALL_START: return "START";
202 case TelephonyEventLog.TAG_IMS_CALL_START_CONFERENCE: return "START_CONFERENCE";
203 case TelephonyEventLog.TAG_IMS_CALL_RECEIVE: return "RECEIVE";
204 case TelephonyEventLog.TAG_IMS_CALL_ACCEPT: return "ACCEPT";
205 case TelephonyEventLog.TAG_IMS_CALL_REJECT: return "REJECT";
206 case TelephonyEventLog.TAG_IMS_CALL_TERMINATE: return "TERMINATE";
207 case TelephonyEventLog.TAG_IMS_CALL_HOLD: return "HOLD";
208 case TelephonyEventLog.TAG_IMS_CALL_RESUME: return "RESUME";
209 case TelephonyEventLog.TAG_IMS_CALL_MERGE: return "MERGE";
210 case TelephonyEventLog.TAG_IMS_CALL_UPDATE: return "UPDATE";
211 case TelephonyEventLog.TAG_IMS_CALL_PROGRESSING: return "PROGRESSING";
212 case TelephonyEventLog.TAG_IMS_CALL_STARTED: return "STARTED";
213 case TelephonyEventLog.TAG_IMS_CALL_START_FAILED: return "START_FAILED";
214 case TelephonyEventLog.TAG_IMS_CALL_TERMINATED: return "TERMINATED";
215 case TelephonyEventLog.TAG_IMS_CALL_HELD: return "HELD";
216 case TelephonyEventLog.TAG_IMS_CALL_HOLD_FAILED: return "HOLD_FAILED";
217 case TelephonyEventLog.TAG_IMS_CALL_HOLD_RECEIVED: return "HOLD_RECEIVED";
218 case TelephonyEventLog.TAG_IMS_CALL_RESUMED: return "RESUMED";
219 case TelephonyEventLog.TAG_IMS_CALL_RESUME_FAILED: return "RESUME_FAILED";
220 case TelephonyEventLog.TAG_IMS_CALL_RESUME_RECEIVED: return "RESUME_RECEIVED";
221 case TelephonyEventLog.TAG_IMS_CALL_UPDATED: return "UPDATED";
222 case TelephonyEventLog.TAG_IMS_CALL_UPDATE_FAILED: return "UPDATE_FAILED";
223 case TelephonyEventLog.TAG_IMS_CALL_MERGED: return "MERGED";
224 case TelephonyEventLog.TAG_IMS_CALL_MERGE_FAILED: return "MERGE_FAILED";
225 case TelephonyEventLog.TAG_IMS_CALL_HANDOVER: return "HANDOVER";
226 case TelephonyEventLog.TAG_IMS_CALL_HANDOVER_FAILED: return "HANDOVER_FAILED";
227 case TelephonyEventLog.TAG_IMS_CALL_TTY_MODE_RECEIVED: return "TTY_MODE_RECEIVED";
228 case TelephonyEventLog.TAG_IMS_CONFERENCE_PARTICIPANTS_STATE_CHANGED:
229 return "CONFERENCE_PARTICIPANTS_STATE_CHANGED";
230 case TelephonyEventLog.TAG_IMS_MULTIPARTY_STATE_CHANGED:
231 return "MULTIPARTY_STATE_CHANGED";
232 case TelephonyEventLog.TAG_IMS_CALL_STATE: return "STATE";
233 }
234 return "UNKNOWN("+evt+")";
235 }
236
237 public String rilResponseToString(int evt) {
238 switch (evt) {
239 case RIL_REQUEST_DEACTIVATE_DATA_CALL: return "RIL_RESPONSE_DEACTIVATE_DATA_CALL";
240 case RIL_REQUEST_HANGUP: return "RIL_RESPONSE_HANGUP";
241 case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: return "RIL_RESPONSE_HANGUP_WAITING_OR_BACKGROUND";
242 case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: return "RIL_RESPONSE_HANGUP_FOREGROUND_RESUME_BACKGROUND";
243 case RIL_REQUEST_DIAL: return "RIL_RESPONSE_DIAL";
244 case RIL_REQUEST_ANSWER: return "RIL_RESPONSE_ANSWER";
245 case RIL_REQUEST_SEND_SMS: return "RIL_RESPONSE_SEND_SMS";
246 case RIL_REQUEST_SEND_SMS_EXPECT_MORE: return "RIL_RESPONSE_SEND_SMS_EXPECT_MORE";
247 case RIL_REQUEST_CDMA_SEND_SMS: return "RIL_RESPONSE_CDMA_SEND_SMS";
248 case RIL_REQUEST_IMS_SEND_SMS: return "RIL_RESPONSE_IMS_SEND_SMS";
249 }
250 return "UNKNOWN("+evt+")";
251 }
252
253 public String toString() {
254 return String.format("%d,%d,%d,%d,%d,%s",
255 timestamp, phoneId, tag, param1, param2, data);
256 }
257
258 public String toJson() {
259 StringBuilder sb = new StringBuilder();
260 Formatter formatter = new Formatter(sb, Locale.US);
261 formatter.format("{\"ts\":%d, \"phone\":%d", timestamp, phoneId);
262 switch (tag) {
263 case TelephonyEventLog.TAG_SETTINGS:
264 formatter.format(", \"%s\":\"%s\"", JSON_KEY_TAG, JSON_TAG_SETTINGS);
265 break;
266
267 case TelephonyEventLog.TAG_SERVICE_STATE:
268 serviceStateToJson(formatter);
269 break;
270
271 case TelephonyEventLog.TAG_IMS_CONNECTION_STATE:
272 imsConnectionStateToJson(formatter);
273 break;
274
275 case TelephonyEventLog.TAG_IMS_CAPABILITIES:
276 imsCapabilitiesToJson(formatter);
277 break;
278
279 case TelephonyEventLog.TAG_DATA_CALL_LIST:
280 dataCallListToJson(sb, formatter);
281 break;
282
283 case TelephonyEventLog.TAG_RIL_REQUEST:
284 rilRequestToJson(formatter);
285 break;
286
287 case TelephonyEventLog.TAG_RIL_RESPONSE:
288 rilResponseToJson(formatter);
289 break;
290
291 case TelephonyEventLog.TAG_RIL_UNSOL_RESPONSE:
292 unsolRilResponseToJson(formatter);
293 break;
294
295 case TelephonyEventLog.TAG_IMS_CALL_START:
296 case TelephonyEventLog.TAG_IMS_CALL_START_CONFERENCE:
297 case TelephonyEventLog.TAG_IMS_CALL_RECEIVE:
298 case TelephonyEventLog.TAG_IMS_CALL_ACCEPT:
299 case TelephonyEventLog.TAG_IMS_CALL_REJECT:
300 case TelephonyEventLog.TAG_IMS_CALL_TERMINATE:
301 case TelephonyEventLog.TAG_IMS_CALL_HOLD:
302 case TelephonyEventLog.TAG_IMS_CALL_RESUME:
303 case TelephonyEventLog.TAG_IMS_CALL_PROGRESSING:
304 case TelephonyEventLog.TAG_IMS_CALL_STARTED:
305 case TelephonyEventLog.TAG_IMS_CALL_START_FAILED:
306 case TelephonyEventLog.TAG_IMS_CALL_TERMINATED:
307 case TelephonyEventLog.TAG_IMS_CALL_HELD:
308 case TelephonyEventLog.TAG_IMS_CALL_HOLD_RECEIVED:
309 case TelephonyEventLog.TAG_IMS_CALL_HOLD_FAILED:
310 case TelephonyEventLog.TAG_IMS_CALL_RESUMED:
311 case TelephonyEventLog.TAG_IMS_CALL_RESUME_RECEIVED:
312 case TelephonyEventLog.TAG_IMS_CALL_RESUME_FAILED:
313 imsCallEventToJson(formatter);
314 break;
315
316 case TelephonyEventLog.TAG_IMS_CALL_HANDOVER:
317 case TelephonyEventLog.TAG_IMS_CALL_HANDOVER_FAILED:
318 imsHandoverToJson(formatter);
319 break;
320
321 case TelephonyEventLog.TAG_IMS_CALL_STATE:
322 imsCallStateToJson(formatter);
323 break;
324
325 case TelephonyEventLog.TAG_PHONE_STATE:
326 phoneStateToJson(formatter);
327 break;
328
329 case TelephonyEventLog.TAG_SMS:
330 formatter.format(", \"%s\":\"%s\"", JSON_KEY_TAG, JSON_TAG_SMS);
331 break;
332
333 default:
334 formatter.format(", \"%s\":\"UNKNOWN(%d)\"", JSON_KEY_TAG, tag);
335 break;
336 }
337 sb.append("},");
338 return sb.toString();
339 }
340
341 private void serviceStateToJson(Formatter formatter) {
342 formatter.format(", \"%s\":\"%s\""
343 + ",\"%s\":%d,\"%s\":%d,\"%s\":%d,\"%s\":%d"
344 + ",\"%s\":\"%s\",\"%s\":\"%s\",\"%s\":\"%s\""
345 + ",\"%s\":\"%s\",\"%s\":\"%s\",\"%s\":\"%s\""
346 + ",\"%s\":%d,\"%s\":%d",
347 JSON_KEY_TAG, JSON_TAG_SERVICE_STATE,
348 JSON_KEY_REG_STATE, data.getInt("voiceRegState"),
349 JSON_KEY_DATA_REG_STATE, data.getInt("dataRegState"),
350 JSON_KEY_ROAMING_TYPE, data.getInt("voiceRoamingType"),
351 JSON_KEY_DATA_ROAMING_TYPE, data.getInt("dataRoamingType"),
352 JSON_KEY_OPERATOR_ALPHA_LONG, data.getString("operator-alpha-long"),
353 JSON_KEY_OPERATOR_ALPHA_SHORT, data.getString("operator-alpha-short"),
354 JSON_KEY_OPERATOR_NUMERIC, data.getString("operator-numeric"),
355 JSON_KEY_DATA_OPERATOR_ALPHA_LONG, data.getString("data-operator-alpha-long"),
356 JSON_KEY_DATA_OPERATOR_ALPHA_SHORT, data.getString("data-operator-alpha-short"),
357 JSON_KEY_DATA_OPERATOR_NUMERIC, data.getString("data-operator-numeric"),
358 JSON_KEY_RAT, data.getInt("radioTechnology"),
359 JSON_KEY_DATA_RAT, data.getInt("dataRadioTechnology"));
360 }
361
362 private void imsConnectionStateToJson(Formatter formatter) {
363 if (data == null) {
364 formatter.format(", \"%s\":\"%s\", \"%s\":%d",
365 JSON_KEY_TAG, JSON_TAG_IMS_CONNECTION_STATE, JSON_KEY_STATE, param1);
366 } else {
367 formatter.format(", \"%s\":\"%s\""
368 + ", \"%s\":%d"
369 + ", \"%s\":{\"%s\":%d,\"%s\":%d,\"%s\":%s}",
370 JSON_KEY_TAG, JSON_TAG_IMS_CONNECTION_STATE,
371 JSON_KEY_STATE, param1,
372 JSON_KEY_REASON_INFO,
373 JSON_KEY_REASON_INFO_CODE, data.getInt(
374 TelephonyEventLog.DATA_KEY_REASONINFO_CODE),
375 JSON_KEY_REASON_INFO_EXTRA_CODE, data.getInt(
376 TelephonyEventLog.DATA_KEY_REASONINFO_EXTRA_CODE),
377 JSON_KEY_REASON_INFO_EXTRA_MESSAGE, data.getString(
378 TelephonyEventLog.DATA_KEY_REASONINFO_EXTRA_MESSAGE));
379 }
380 }
381
382 private void imsCapabilitiesToJson(Formatter formatter) {
383 formatter.format(", \"%s\":\"%s\""
384 + ",\"%s\":%b,\"%s\":%b,\"%s\":%b"
385 + ",\"%s\":%b,\"%s\":%b,\"%s\":%b",
386 JSON_KEY_TAG, JSON_TAG_IMS_CAPABILITIES,
387 JSON_KEY_VOLTE, data.getBoolean(TelephonyEventLog.DATA_KEY_VOLTE),
388 JSON_KEY_VILTE, data.getBoolean(TelephonyEventLog.DATA_KEY_VILTE),
389 JSON_KEY_VOWIFI, data.getBoolean(TelephonyEventLog.DATA_KEY_VOWIFI),
390 JSON_KEY_VIWIFI, data.getBoolean(TelephonyEventLog.DATA_KEY_VIWIFI),
391 JSON_KEY_UTLTE, data.getBoolean(TelephonyEventLog.DATA_KEY_UTLTE),
392 JSON_KEY_UTWIFI, data.getBoolean(TelephonyEventLog.DATA_KEY_UTWIFI));
393 }
394
395 private void dataCallListToJson(StringBuilder sb, Formatter formatter) {
396 formatter.format(", \"%s\":\"%s\",\"%s\":[",
397 JSON_KEY_TAG, JSON_TAG_DATA_CALL_LIST, JSON_KEY_DATA_CALLS);
398 int[] statuses = data.getIntArray(TelephonyEventLog.DATA_KEY_DATA_CALL_STATUSES);
399 int[] cids = data.getIntArray(TelephonyEventLog.DATA_KEY_DATA_CALL_CIDS);
400 int[] actives = data.getIntArray(TelephonyEventLog.DATA_KEY_DATA_CALL_ACTIVES);
401 String[] types = data.getStringArray(TelephonyEventLog.DATA_KEY_DATA_CALL_TYPES);
402 String[] ifnames = data.getStringArray(TelephonyEventLog.DATA_KEY_DATA_CALL_IFNAMES);
403 for (int i = 0; i < cids.length; i++) {
404 formatter.format("{\"%s\":%d,\"%s\":%d,\"%s\":%d"
405 + ",\"%s\":\"%s\",\"%s\":\"%s\"},",
406 JSON_KEY_STATUS, statuses[i], JSON_KEY_CID, cids[i],
407 JSON_KEY_ACTIVE, actives[i],
408 JSON_KEY_TYPE, types[i], JSON_KEY_IFNAME, ifnames[i]);
409 }
410 sb.append("]");
411 }
412
413 private void rilRequestToJson(Formatter formatter) {
414 switch (param1) {
415 case RIL_REQUEST_SETUP_DATA_CALL:
416 formatter.format(", \"%s\":\"%s\""
417 + ",\"%s\":%d,\"%s\":\"%s\",\"%s\":\"%s\""
418 + ",\"%s\":\"%s\",\"%s\":\"%s\"",
419 JSON_KEY_TAG, JSON_TAG_RIL_REQUEST_SETUP_DATA_CALL,
420 JSON_KEY_SERIAL, param2,
421 JSON_KEY_RAT, data.getString(
422 TelephonyEventLog.DATA_KEY_RAT),
423 JSON_KEY_PROFILE, data.getString(
424 TelephonyEventLog.DATA_KEY_DATA_PROFILE),
425 JSON_KEY_APN, data.getString(
426 TelephonyEventLog.DATA_KEY_APN),
427 JSON_KEY_PROTOCOL, data.getString(
428 TelephonyEventLog.DATA_KEY_PROTOCOL));
429 break;
430 case RIL_REQUEST_DEACTIVATE_DATA_CALL:
431 formatter.format(", \"%s\":\"%s\""
432 + ",\"%s\":%d,\"%s\":%d,\"%s\":%d",
433 JSON_KEY_TAG, JSON_TAG_RIL_REQUEST_DEACTIVATE_DATA_CALL,
434 JSON_KEY_SERIAL, param2,
435 JSON_KEY_CID, data.getInt(
436 TelephonyEventLog.DATA_KEY_DATA_CALL_CID),
437 JSON_KEY_REASON, data.getInt(
438 TelephonyEventLog.DATA_KEY_DATA_DEACTIVATE_REASON));
439 break;
440 case RIL_REQUEST_DIAL:
441 formatter.format(", \"%s\":\"%s\""
442 + ",\"%s\":%d,\"%s\":%d",
443 JSON_KEY_TAG, JSON_TAG_RIL_REQUEST_DIAL,
444 JSON_KEY_SERIAL, param2,
445 JSON_KEY_CLIR_MODE, data.getInt(
446 TelephonyEventLog.DATA_KEY_CLIR_MODE));
447 break;
448 case RIL_REQUEST_HANGUP:
449 case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND:
450 case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND:
451 formatter.format(", \"%s\":\"%s\""
452 + ",\"%s\":%d, \"%s\":%d"
453 + ",\"%s\":\"%d\"",
454 JSON_KEY_TAG, JSON_TAG_RIL_REQUEST_HANGUP,
455 JSON_KEY_SERIAL, param2, JSON_KEY_EVT, param1,
456 JSON_KEY_GSM_INDEX, data.getInt(
457 TelephonyEventLog.DATA_KEY_RIL_HANGUP_GSM_INDEX));
458 break;
459 case RIL_REQUEST_ANSWER:
460 formatter.format(", \"%s\":\"%s\",\"%s\":%d",
461 JSON_KEY_TAG, JSON_TAG_RIL_REQUEST_ANSWER, JSON_KEY_SERIAL, param2);
462 break;
463
464 case RIL_REQUEST_SEND_SMS:
465 case RIL_REQUEST_SEND_SMS_EXPECT_MORE:
466 case RIL_REQUEST_CDMA_SEND_SMS:
467 case RIL_REQUEST_IMS_SEND_SMS:
468 formatter.format(", \"%s\":\"%s\",\"%s\":%d",
469 JSON_KEY_TAG, JSON_TAG_RIL_REQUEST_SEND_SMS, JSON_KEY_SERIAL, param2);
470 break;
471 }
472 }
473
474 private void rilResponseToJson(Formatter formatter) {
475 switch (param1) {
476 case RIL_REQUEST_SETUP_DATA_CALL:
477 formatter.format(", \"%s\":\"%s\""
478 + ",\"%s\":%d,\"%s\":%d,\"%s\":%d"
479 + ",\"%s\":%d,\"%s\":%d"
480 + ",\"%s\":\"%s\",\"%s\":\"%s\"",
481 JSON_KEY_TAG, JSON_TAG_RIL_RESPONSE_SETUP_DATA_CALL,
482 JSON_KEY_SERIAL, param2,
483 JSON_KEY_STATUS, data.getInt(
484 TelephonyEventLog.DATA_KEY_DATA_CALL_STATUS),
485 JSON_KEY_RETRY, data.getInt(
486 TelephonyEventLog.DATA_KEY_DATA_CALL_RETRY),
487 JSON_KEY_CID, data.getInt(
488 TelephonyEventLog.DATA_KEY_DATA_CALL_CID),
489 JSON_KEY_ACTIVE, data.getInt(
490 TelephonyEventLog.DATA_KEY_DATA_CALL_ACTIVE),
491 JSON_KEY_TYPE, data.getString(
492 TelephonyEventLog.DATA_KEY_DATA_CALL_TYPE),
493 JSON_KEY_IFNAME, data.getString(
494 TelephonyEventLog.DATA_KEY_DATA_CALL_IFNAME));
495 break;
496
497 case RIL_REQUEST_DEACTIVATE_DATA_CALL:
498 case RIL_REQUEST_HANGUP:
499 case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND:
500 case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND:
501 case RIL_REQUEST_DIAL:
502 case RIL_REQUEST_ANSWER:
503 formatter.format(", \"%s\":\"%s\",\"%s\":%d",
504 JSON_KEY_TAG, rilResponseToString(param1), JSON_KEY_SERIAL, param2);
505 break;
506
507 case RIL_REQUEST_SEND_SMS:
508 case RIL_REQUEST_SEND_SMS_EXPECT_MORE:
509 case RIL_REQUEST_CDMA_SEND_SMS:
510 case RIL_REQUEST_IMS_SEND_SMS:
511 formatter.format(", \"%s\":\"%s\",\"%s\":%d"
512 + ",\"%s\":%d,\"%s\":%d",
513 JSON_KEY_TAG, rilResponseToString(param1), JSON_KEY_SERIAL, param2,
514 JSON_KEY_SMS_MESSAGE_REF, data.getInt(
515 TelephonyEventLog.DATA_KEY_SMS_MESSAGE_REF),
516 JSON_KEY_SMS_ERROR_CODE, data.getInt(
517 TelephonyEventLog.DATA_KEY_SMS_ERROR_CODE));
518 break;
519 }
520 formatter.format(", \"%s\":%d",
521 JSON_KEY_RIL_ERROR, data.getInt(TelephonyEventLog.DATA_KEY_RIL_ERROR));
522 }
523
524 private void unsolRilResponseToJson(Formatter formatter) {
525 switch (param1) {
526 case RIL_UNSOL_CALL_RING:
527 formatter.format(", \"%s\":\"%s\"", JSON_KEY_TAG, JSON_TAG_RIL_UNSOL_CALL_RING);
528 break;
529 case RIL_UNSOL_SRVCC_STATE_NOTIFY:
530 formatter.format(", \"%s\":\"%s\",\"%s\":%d",
531 JSON_KEY_TAG, JSON_TAG_RIL_UNSOL_SRVCC_STATE_NOTIFY,
532 JSON_KEY_STATE, param2);
533 break;
534 case RIL_UNSOL_RESPONSE_NEW_SMS:
535 formatter.format(", \"%s\":\"%s\"",
536 JSON_KEY_TAG, JSON_TAG_RIL_UNSOL_RESPONSE_NEW_SMS);
537 break;
538 case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS:
539 formatter.format(", \"%s\":\"%s\"",
540 JSON_KEY_TAG, JSON_TAG_RIL_UNSOL_RESPONSE_CDMA_NEW_SMS);
541 break;
542 }
543 }
544
545 private void imsCallEventToJson(Formatter formatter) {
546 formatter.format(", \"%s\":\"%s\", \"%s\":\"%s\",\"%s\":%d",
547 JSON_KEY_TAG, JSON_TAG_IMS_CALL, JSON_KEY_EVT, imsCallEventToString(tag),
548 JSON_KEY_CALL_ID, param1);
549 }
550
551 private void imsHandoverToJson(Formatter formatter) {
552 formatter.format(", \"%s\":\"%s\", \"%s\":\"%s\",\"%s\":%d"
553 + ",\"%s\":%d,\"%s\":%d"
554 + ",\"%s\":%d,\"%s\":%d,\"%s\":\"%s\"",
555 JSON_KEY_TAG, JSON_TAG_IMS_CALL_HANDOVER,
556 JSON_KEY_EVT, imsCallEventToString(tag), JSON_KEY_CALL_ID, param1,
557 JSON_KEY_SRC_TECH, data.getInt(TelephonyEventLog.DATA_KEY_SRC_TECH),
558 JSON_KEY_TARGET_TECH, data.getInt(TelephonyEventLog.DATA_KEY_TARGET_TECH),
559 JSON_KEY_REASON_INFO_CODE, data.getInt(
560 TelephonyEventLog.DATA_KEY_REASONINFO_CODE),
561 JSON_KEY_REASON_INFO_EXTRA_CODE, data.getInt(
562 TelephonyEventLog.DATA_KEY_REASONINFO_EXTRA_CODE),
563 JSON_KEY_REASON_INFO_EXTRA_MESSAGE, data.getString(
564 TelephonyEventLog.DATA_KEY_REASONINFO_EXTRA_MESSAGE));
565 }
566
567 private void imsCallStateToJson(Formatter formatter) {
568 formatter.format(", \"%s\":\"%s\", \"%s\":%d, \"%s\":%d",
569 JSON_KEY_TAG, JSON_TAG_IMS_CALL_STATE, JSON_KEY_CALL_ID, param1,
570 JSON_KEY_STATE, param2);
571 }
572
573 private void phoneStateToJson(Formatter formatter) {
574 formatter.format(", \"%s\":\"%s\", \"%s\":%d",
575 JSON_KEY_TAG, JSON_TAG_PHONE_STATE, JSON_KEY_STATE, param1);
576 }
577 }
578 private final List<Event> mEvents = new ArrayList<Event>();
579
580 /**
581 * Implementation of the ITelephonyDebug interface.
582 */
583 private final ITelephonyDebug.Stub mBinder = new ITelephonyDebug.Stub() {
584 public void writeEvent(long timestamp, int phoneId, int tag,
585 int param1, int param2, Bundle data) {
586 if (VDBG) {
587 Log.v(TAG, String.format("writeEvent(%d, %d, %d, %d, %d)",
588 timestamp, phoneId, tag, param1, param2));
589 }
590 synchronized (mEvents) {
591 mEvents.add(new Event(timestamp, phoneId, tag, param1, param2, data));
592 }
593 }
594 };
Santos Cordon7d4ddf62013-07-10 11:58:08 -0700595}
596