• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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 
17 package com.googlecode.android_scripting.jsonrpc;
18 
19 import static com.googlecode.android_scripting.ConvertUtils.toNonNullString;
20 
21 import android.annotation.NonNull;
22 import android.bluetooth.BluetoothCodecConfig;
23 import android.bluetooth.BluetoothDevice;
24 import android.bluetooth.BluetoothGattCharacteristic;
25 import android.bluetooth.BluetoothGattDescriptor;
26 import android.bluetooth.BluetoothGattService;
27 import android.bluetooth.le.AdvertiseSettings;
28 import android.content.ComponentName;
29 import android.content.Intent;
30 import android.graphics.Point;
31 import android.location.Address;
32 import android.location.Location;
33 import android.media.session.PlaybackState;
34 import android.net.DhcpInfo;
35 import android.net.IpPrefix;
36 import android.net.LinkAddress;
37 import android.net.LinkProperties;
38 import android.net.Network;
39 import android.net.NetworkInfo;
40 import android.net.ProxyInfo;
41 import android.net.RouteInfo;
42 import android.net.Uri;
43 import android.net.wifi.RttManager.RttCapabilities;
44 import android.net.wifi.ScanResult;
45 import android.net.wifi.WifiActivityEnergyInfo;
46 import android.net.wifi.WifiConfiguration;
47 import android.net.wifi.WifiEnterpriseConfig;
48 import android.net.wifi.WifiInfo;
49 import android.net.wifi.WifiScanner.ScanData;
50 import android.net.wifi.WpsInfo;
51 import android.net.wifi.p2p.WifiP2pConfig;
52 import android.net.wifi.p2p.WifiP2pDevice;
53 import android.net.wifi.p2p.WifiP2pGroup;
54 import android.net.wifi.p2p.WifiP2pInfo;
55 import android.os.Bundle;
56 import android.os.ParcelUuid;
57 import android.telecom.Call;
58 import android.telecom.CallAudioState;
59 import android.telecom.PhoneAccount;
60 import android.telecom.PhoneAccountHandle;
61 import android.telecom.VideoProfile;
62 import android.telecom.VideoProfile.CameraCapabilities;
63 import android.telephony.CellIdentity;
64 import android.telephony.CellIdentityCdma;
65 import android.telephony.CellIdentityGsm;
66 import android.telephony.CellIdentityLte;
67 import android.telephony.CellIdentityTdscdma;
68 import android.telephony.CellIdentityWcdma;
69 import android.telephony.CellInfo;
70 import android.telephony.CellInfoCdma;
71 import android.telephony.CellInfoGsm;
72 import android.telephony.CellInfoLte;
73 import android.telephony.CellInfoTdscdma;
74 import android.telephony.CellInfoWcdma;
75 import android.telephony.CellLocation;
76 import android.telephony.CellSignalStrengthCdma;
77 import android.telephony.CellSignalStrengthGsm;
78 import android.telephony.CellSignalStrengthLte;
79 import android.telephony.CellSignalStrengthTdscdma;
80 import android.telephony.CellSignalStrengthWcdma;
81 import android.telephony.ModemActivityInfo;
82 import android.telephony.NeighboringCellInfo;
83 import android.telephony.ServiceState;
84 import android.telephony.SignalStrength;
85 import android.telephony.SmsMessage;
86 import android.telephony.SubscriptionInfo;
87 import android.telephony.VoLteServiceState;
88 import android.telephony.gsm.GsmCellLocation;
89 import android.util.Base64;
90 import android.util.DisplayMetrics;
91 import android.util.SparseArray;
92 
93 import com.android.internal.net.LegacyVpnInfo;
94 
95 import com.googlecode.android_scripting.ConvertUtils;
96 import com.googlecode.android_scripting.Log;
97 import com.googlecode.android_scripting.event.Event;
98 import com.googlecode.android_scripting.facade.DataUsageController.DataUsageInfo;
99 import com.googlecode.android_scripting.facade.telephony.InCallServiceImpl;
100 import com.googlecode.android_scripting.facade.telephony.TelephonyConstants;
101 import com.googlecode.android_scripting.facade.telephony.TelephonyUtils;
102 
103 import org.apache.commons.codec.binary.Base64Codec;
104 import org.json.JSONArray;
105 import org.json.JSONException;
106 import org.json.JSONObject;
107 
108 import java.io.IOException;
109 import java.net.HttpURLConnection;
110 import java.net.InetAddress;
111 import java.net.InetSocketAddress;
112 import java.net.URL;
113 import java.security.PrivateKey;
114 import java.security.cert.CertificateEncodingException;
115 import java.security.cert.X509Certificate;
116 import java.util.ArrayList;
117 import java.util.Collection;
118 import java.util.List;
119 import java.util.Map;
120 import java.util.Map.Entry;
121 import java.util.Set;
122 
123 public class JsonBuilder {
124 
125     @SuppressWarnings("unchecked")
build(Object data)126     public static Object build(Object data) throws JSONException {
127         if (data == null) {
128             return JSONObject.NULL;
129         }
130         if (data instanceof Integer) {
131             return data;
132         }
133         if (data instanceof Float) {
134             return data;
135         }
136         if (data instanceof Double) {
137             return data;
138         }
139         if (data instanceof Long) {
140             return data;
141         }
142         if (data instanceof String) {
143             return data;
144         }
145         if (data instanceof Boolean) {
146             return data;
147         }
148         if (data instanceof JsonSerializable) {
149             return ((JsonSerializable) data).toJSON();
150         }
151         if (data instanceof JSONObject) {
152             return data;
153         }
154         if (data instanceof JSONArray) {
155             return data;
156         }
157         if (data instanceof Set<?>) {
158             List<Object> items = new ArrayList<Object>((Set<?>) data);
159             return buildJsonList(items);
160         }
161         if (data instanceof Collection<?>) {
162             List<Object> items = new ArrayList<Object>((Collection<?>) data);
163             return buildJsonList(items);
164         }
165         if (data instanceof List<?>) {
166             return buildJsonList((List<?>) data);
167         }
168         if (data instanceof Address) {
169             return buildJsonAddress((Address) data);
170         }
171         if (data instanceof CallAudioState) {
172             return buildJsonAudioState((CallAudioState) data);
173         }
174         if (data instanceof Location) {
175             return buildJsonLocation((Location) data);
176         }
177         if (data instanceof Bundle) {
178             return buildJsonBundle((Bundle) data);
179         }
180         if (data instanceof Intent) {
181             return buildJsonIntent((Intent) data);
182         }
183         if (data instanceof Event) {
184             return buildJsonEvent((Event) data);
185         }
186         if (data instanceof Map<?, ?>) {
187             // TODO(damonkohler): I would like to make this a checked cast if
188             // possible.
189             return buildJsonMap((Map<String, ?>) data);
190         }
191         if (data instanceof ParcelUuid) {
192             return data.toString();
193         }
194         if (data instanceof ScanResult) {
195             return buildJsonScanResult((ScanResult) data);
196         }
197         if (data instanceof ScanData) {
198             return buildJsonScanData((ScanData) data);
199         }
200         if (data instanceof android.bluetooth.le.ScanResult) {
201             return buildJsonBleScanResult((android.bluetooth.le.ScanResult) data);
202         }
203         if (data instanceof AdvertiseSettings) {
204             return buildJsonBleAdvertiseSettings((AdvertiseSettings) data);
205         }
206         if (data instanceof BluetoothGattService) {
207             return buildJsonBluetoothGattService((BluetoothGattService) data);
208         }
209         if (data instanceof BluetoothGattCharacteristic) {
210             return buildJsonBluetoothGattCharacteristic((BluetoothGattCharacteristic) data);
211         }
212         if (data instanceof BluetoothGattDescriptor) {
213             return buildJsonBluetoothGattDescriptor((BluetoothGattDescriptor) data);
214         }
215         if (data instanceof BluetoothDevice) {
216             return buildJsonBluetoothDevice((BluetoothDevice) data);
217         }
218         if (data instanceof BluetoothCodecConfig) {
219             return buildJsonBluetoothCodecConfig((BluetoothCodecConfig) data);
220         }
221         if (data instanceof PlaybackState) {
222             return buildJsonPlaybackState((PlaybackState) data);
223         }
224         if (data instanceof CellLocation) {
225             return buildJsonCellLocation((CellLocation) data);
226         }
227         if (data instanceof WifiInfo) {
228             return buildJsonWifiInfo((WifiInfo) data);
229         }
230         if (data instanceof NeighboringCellInfo) {
231             return buildNeighboringCellInfo((NeighboringCellInfo) data);
232         }
233         if (data instanceof Network) {
234             return buildNetwork((Network) data);
235         }
236         if (data instanceof NetworkInfo) {
237             return buildNetworkInfo((NetworkInfo) data);
238         }
239         if (data instanceof HttpURLConnection) {
240             return buildHttpURLConnection((HttpURLConnection) data);
241         }
242         if (data instanceof InetSocketAddress) {
243             return buildInetSocketAddress((InetSocketAddress) data);
244         }
245         if (data instanceof InetAddress) {
246             return buildInetAddress((InetAddress) data);
247         }
248         if (data instanceof URL) {
249             return buildURL((URL) data);
250         }
251         if (data instanceof Point) {
252             return buildPoint((Point) data);
253         }
254         if (data instanceof SmsMessage) {
255             return buildSmsMessage((SmsMessage) data);
256         }
257         if (data instanceof PhoneAccount) {
258             return buildPhoneAccount((PhoneAccount) data);
259         }
260         if (data instanceof PhoneAccountHandle) {
261             return buildPhoneAccountHandle((PhoneAccountHandle) data);
262         }
263         if (data instanceof SubscriptionInfo) {
264             return buildSubscriptionInfoRecord((SubscriptionInfo) data);
265         }
266         if (data instanceof DataUsageInfo) {
267             return buildDataUsageInfo((DataUsageInfo) data);
268         }
269         if (data instanceof DhcpInfo) {
270             return buildDhcpInfo((DhcpInfo) data);
271         }
272         if (data instanceof DisplayMetrics) {
273             return buildDisplayMetrics((DisplayMetrics) data);
274         }
275         if (data instanceof RttCapabilities) {
276             return buildRttCapabilities((RttCapabilities) data);
277         }
278         if (data instanceof WifiActivityEnergyInfo) {
279             return buildWifiActivityEnergyInfo((WifiActivityEnergyInfo) data);
280         }
281         if (data instanceof WifiConfiguration) {
282             return buildWifiConfiguration((WifiConfiguration) data);
283         }
284         if (data instanceof WifiP2pConfig) {
285             return buildWifiP2pConfig((WifiP2pConfig) data);
286         }
287         if (data instanceof WifiP2pDevice) {
288             return buildWifiP2pDevice((WifiP2pDevice) data);
289         }
290         if (data instanceof WifiP2pInfo) {
291             return buildWifiP2pInfo((WifiP2pInfo) data);
292         }
293         if (data instanceof WifiP2pGroup) {
294             return buildWifiP2pGroup((WifiP2pGroup) data);
295         }
296         if (data instanceof LinkProperties) {
297             return buildLinkProperties((LinkProperties) data);
298         }
299         if (data instanceof LinkAddress) {
300             return buildLinkAddress((LinkAddress) data);
301         }
302         if (data instanceof RouteInfo) {
303             return buildRouteInfo((RouteInfo) data);
304         }
305         if (data instanceof IpPrefix) {
306             return buildIpPrefix((IpPrefix) data);
307         }
308         if (data instanceof ProxyInfo) {
309             return buildProxyInfo((ProxyInfo) data);
310         }
311         if (data instanceof byte[]) {
312             JSONArray result = new JSONArray();
313             for (byte b : (byte[]) data) {
314                 result.put(b & 0xFF);
315             }
316             return result;
317         }
318         if (data instanceof Object[]) {
319             return buildJSONArray((Object[]) data);
320         }
321         if (data instanceof CellInfo) {
322             return buildCellInfo((CellInfo) data);
323         }
324         if (data instanceof Call) {
325             return buildCall((Call) data);
326         }
327         if (data instanceof Call.Details) {
328             return buildCallDetails((Call.Details) data);
329         }
330         if (data instanceof InCallServiceImpl.CallEvent<?>) {
331             return buildCallEvent((InCallServiceImpl.CallEvent<?>) data);
332         }
333         if (data instanceof VideoProfile) {
334             return buildVideoProfile((VideoProfile) data);
335         }
336         if (data instanceof CameraCapabilities) {
337             return buildCameraCapabilities((CameraCapabilities) data);
338         }
339         if (data instanceof VoLteServiceState) {
340             return buildVoLteServiceStateEvent((VoLteServiceState) data);
341         }
342         if (data instanceof LegacyVpnInfo) {
343             return buildLegacyVpnInfo((LegacyVpnInfo) data);
344         }
345         if (data instanceof ModemActivityInfo) {
346             return buildModemActivityInfo((ModemActivityInfo) data);
347         }
348         if (data instanceof SignalStrength) {
349             return buildSignalStrength((SignalStrength) data);
350         }
351         if (data instanceof ServiceState) {
352             return buildServiceState((ServiceState) data);
353         }
354 
355         return data.toString();
356         // throw new JSONException("Failed to build JSON result. " +
357         // data.getClass().getName());
358     }
359 
buildJsonAudioState(CallAudioState data)360     private static JSONObject buildJsonAudioState(CallAudioState data)
361             throws JSONException {
362         JSONObject state = new JSONObject();
363         state.put("isMuted", data.isMuted());
364         state.put("AudioRoute", InCallServiceImpl.getAudioRouteString(data.getRoute()));
365         return state;
366     }
367 
buildDisplayMetrics(DisplayMetrics data)368     private static Object buildDisplayMetrics(DisplayMetrics data)
369             throws JSONException {
370         JSONObject dm = new JSONObject();
371         dm.put("widthPixels", data.widthPixels);
372         dm.put("heightPixels", data.heightPixels);
373         dm.put("noncompatHeightPixels", data.noncompatHeightPixels);
374         dm.put("noncompatWidthPixels", data.noncompatWidthPixels);
375         return dm;
376     }
377 
buildInetAddress(InetAddress data)378     private static Object buildInetAddress(InetAddress data) {
379         JSONArray address = new JSONArray();
380         address.put(data.getHostName());
381         address.put(data.getHostAddress());
382         return address;
383     }
384 
buildInetSocketAddress(InetSocketAddress data)385     private static Object buildInetSocketAddress(InetSocketAddress data) {
386         JSONArray address = new JSONArray();
387         address.put(data.getHostName());
388         address.put(data.getPort());
389         return address;
390     }
391 
buildJsonAddress(Address address)392     private static JSONObject buildJsonAddress(Address address)
393             throws JSONException {
394         JSONObject result = new JSONObject();
395         result.put("admin_area", address.getAdminArea());
396         result.put("country_code", address.getCountryCode());
397         result.put("country_name", address.getCountryName());
398         result.put("feature_name", address.getFeatureName());
399         result.put("phone", address.getPhone());
400         result.put("locality", address.getLocality());
401         result.put("postal_code", address.getPostalCode());
402         result.put("sub_admin_area", address.getSubAdminArea());
403         result.put("thoroughfare", address.getThoroughfare());
404         result.put("url", address.getUrl());
405         return result;
406     }
407 
buildJSONArray(Object[] data)408     private static JSONArray buildJSONArray(Object[] data) throws JSONException {
409         JSONArray result = new JSONArray();
410         for (Object o : data) {
411             result.put(build(o));
412         }
413         return result;
414     }
415 
buildJsonBleAdvertiseSettings( AdvertiseSettings advertiseSettings)416     private static JSONObject buildJsonBleAdvertiseSettings(
417             AdvertiseSettings advertiseSettings) throws JSONException {
418         JSONObject result = new JSONObject();
419         result.put("mode", advertiseSettings.getMode());
420         result.put("txPowerLevel", advertiseSettings.getTxPowerLevel());
421         result.put("isConnectable", advertiseSettings.isConnectable());
422         return result;
423     }
424 
buildJsonBleScanResult( android.bluetooth.le.ScanResult scanResult)425     private static JSONObject buildJsonBleScanResult(
426             android.bluetooth.le.ScanResult scanResult) throws JSONException {
427         JSONObject result = new JSONObject();
428         result.put("rssi", scanResult.getRssi());
429         result.put("timestampNanos", scanResult.getTimestampNanos());
430         result.put("deviceName", scanResult.getScanRecord().getDeviceName());
431         result.put("txPowerLevel", scanResult.getScanRecord().getTxPowerLevel());
432         result.put("advertiseFlags", scanResult.getScanRecord()
433                 .getAdvertiseFlags());
434         ArrayList<String> manufacturerDataList = new ArrayList<String>();
435         ArrayList<Integer> idList = new ArrayList<Integer>();
436         if (scanResult.getScanRecord().getManufacturerSpecificData() != null) {
437             SparseArray<byte[]> manufacturerSpecificData = scanResult
438                     .getScanRecord().getManufacturerSpecificData();
439             for (int i = 0; i < manufacturerSpecificData.size(); i++) {
440                 manufacturerDataList.add(ConvertUtils
441                         .convertByteArrayToString(manufacturerSpecificData
442                                 .valueAt(i)));
443                 idList.add(manufacturerSpecificData.keyAt(i));
444             }
445         }
446         result.put("manufacturerSpecificDataList", manufacturerDataList);
447         result.put("manufacturerIdList", idList);
448         ArrayList<String> serviceUuidList = new ArrayList<String>();
449         ArrayList<String> serviceDataList = new ArrayList<String>();
450         if (scanResult.getScanRecord().getServiceData() != null) {
451             Map<ParcelUuid, byte[]> serviceDataMap = scanResult.getScanRecord()
452                     .getServiceData();
453             for (ParcelUuid serviceUuid : serviceDataMap.keySet()) {
454                 serviceUuidList.add(serviceUuid.toString());
455                 serviceDataList.add(ConvertUtils
456                         .convertByteArrayToString(serviceDataMap
457                                 .get(serviceUuid)));
458             }
459         }
460         result.put("serviceUuidList", serviceUuidList);
461         result.put("serviceDataList", serviceDataList);
462         List<ParcelUuid> serviceUuids = scanResult.getScanRecord()
463                 .getServiceUuids();
464         String serviceUuidsString = "";
465         if (serviceUuids != null && serviceUuids.size() > 0) {
466             for (ParcelUuid uuid : serviceUuids) {
467                 serviceUuidsString = serviceUuidsString + "," + uuid;
468             }
469         }
470         result.put("serviceUuids", serviceUuidsString);
471         result.put("scanRecord",
472                 build(ConvertUtils.convertByteArrayToString(scanResult
473                         .getScanRecord().getBytes())));
474         result.put("deviceInfo", build(scanResult.getDevice()));
475         return result;
476     }
477 
buildJsonBluetoothCodecConfig(BluetoothCodecConfig codecConfig)478     private static JSONObject buildJsonBluetoothCodecConfig(BluetoothCodecConfig codecConfig)
479             throws JSONException {
480         JSONObject result = new JSONObject();
481         result.put("codecType", codecConfig.getCodecType());
482         result.put("sampleRate", codecConfig.getSampleRate());
483         result.put("bitsPerSample", codecConfig.getBitsPerSample());
484         result.put("channelMode", codecConfig.getChannelMode());
485         result.put("codecSpecific1", codecConfig.getCodecSpecific1());
486         return result;
487     }
488 
buildJsonBluetoothDevice(BluetoothDevice data)489     private static JSONObject buildJsonBluetoothDevice(BluetoothDevice data)
490             throws JSONException {
491         JSONObject deviceInfo = new JSONObject();
492         deviceInfo.put("address", data.getAddress());
493         deviceInfo.put("state", data.getBondState());
494         deviceInfo.put("name", data.getName());
495         deviceInfo.put("type", data.getType());
496         return deviceInfo;
497     }
498 
buildJsonBluetoothGattCharacteristic( BluetoothGattCharacteristic data)499     private static Object buildJsonBluetoothGattCharacteristic(
500             BluetoothGattCharacteristic data) throws JSONException {
501         JSONObject result = new JSONObject();
502         result.put("instanceId", data.getInstanceId());
503         result.put("permissions", data.getPermissions());
504         result.put("properties", data.getProperties());
505         result.put("writeType", data.getWriteType());
506         result.put("descriptorsList", build(data.getDescriptors()));
507         result.put("uuid", data.getUuid().toString());
508         result.put("value", build(data.getValue()));
509 
510         return result;
511     }
512 
buildJsonBluetoothGattDescriptor( BluetoothGattDescriptor data)513     private static Object buildJsonBluetoothGattDescriptor(
514             BluetoothGattDescriptor data) throws JSONException {
515         JSONObject result = new JSONObject();
516         result.put("instanceId", data.getInstanceId());
517         result.put("permissions", data.getPermissions());
518         result.put("characteristic", data.getCharacteristic());
519         result.put("uuid", data.getUuid().toString());
520         result.put("value", build(data.getValue()));
521         return result;
522     }
523 
buildJsonBluetoothGattService( BluetoothGattService data)524     private static Object buildJsonBluetoothGattService(
525             BluetoothGattService data) throws JSONException {
526         JSONObject result = new JSONObject();
527         result.put("instanceId", data.getInstanceId());
528         result.put("type", data.getType());
529         result.put("gattCharacteristicList", build(data.getCharacteristics()));
530         result.put("includedServices", build(data.getIncludedServices()));
531         result.put("uuid", data.getUuid().toString());
532         return result;
533     }
534 
buildJsonBundle(Bundle bundle)535     private static JSONObject buildJsonBundle(Bundle bundle)
536             throws JSONException {
537         JSONObject result = new JSONObject();
538         for (String key : bundle.keySet()) {
539             result.put(key, build(bundle.get(key)));
540         }
541         return result;
542     }
543 
buildJsonCellLocation(CellLocation cellLocation)544     private static JSONObject buildJsonCellLocation(CellLocation cellLocation)
545             throws JSONException {
546         JSONObject result = new JSONObject();
547         if (cellLocation instanceof GsmCellLocation) {
548             GsmCellLocation location = (GsmCellLocation) cellLocation;
549             result.put("lac", location.getLac());
550             result.put("cid", location.getCid());
551         }
552         // TODO(damonkohler): Add support for CdmaCellLocation. Not supported
553         // until API level 5.
554         return result;
555     }
556 
buildDhcpInfo(DhcpInfo data)557     private static JSONObject buildDhcpInfo(DhcpInfo data) throws JSONException {
558         JSONObject result = new JSONObject();
559         result.put("ipAddress", data.ipAddress);
560         result.put("dns1", data.dns1);
561         result.put("dns2", data.dns2);
562         result.put("gateway", data.gateway);
563         result.put("serverAddress", data.serverAddress);
564         result.put("leaseDuration", data.leaseDuration);
565         return result;
566     }
567 
buildJsonEvent(Event event)568     private static JSONObject buildJsonEvent(Event event) throws JSONException {
569         JSONObject result = new JSONObject();
570         result.put("name", event.getName());
571         result.put("data", build(event.getData()));
572         result.put("time", event.getCreationTime());
573         return result;
574     }
575 
buildJsonIntent(Intent data)576     private static JSONObject buildJsonIntent(Intent data) throws JSONException {
577         JSONObject result = new JSONObject();
578         result.put("data", data.getDataString());
579         result.put("type", data.getType());
580         result.put("extras", build(data.getExtras()));
581         result.put("categories", build(data.getCategories()));
582         result.put("action", data.getAction());
583         ComponentName component = data.getComponent();
584         if (component != null) {
585             result.put("packagename", component.getPackageName());
586             result.put("classname", component.getClassName());
587         }
588         result.put("flags", data.getFlags());
589         return result;
590     }
591 
buildJsonList(final List<T> list)592     private static <T> JSONArray buildJsonList(final List<T> list)
593             throws JSONException {
594         JSONArray result = new JSONArray();
595         for (T item : list) {
596             result.put(build(item));
597         }
598         return result;
599     }
600 
buildJsonLocation(Location location)601     private static JSONObject buildJsonLocation(Location location)
602             throws JSONException {
603         JSONObject result = new JSONObject();
604         result.put("altitude", location.getAltitude());
605         result.put("latitude", location.getLatitude());
606         result.put("longitude", location.getLongitude());
607         result.put("time", location.getTime());
608         result.put("accuracy", location.getAccuracy());
609         result.put("speed", location.getSpeed());
610         result.put("provider", location.getProvider());
611         result.put("bearing", location.getBearing());
612         return result;
613     }
614 
buildJsonMap(Map<String, ?> map)615     private static JSONObject buildJsonMap(Map<String, ?> map)
616             throws JSONException {
617         JSONObject result = new JSONObject();
618         for (Entry<String, ?> entry : map.entrySet()) {
619             String key = entry.getKey();
620             if (key == null) {
621                 key = "";
622             }
623             result.put(key, build(entry.getValue()));
624         }
625         return result;
626     }
627 
buildJsonPlaybackState(PlaybackState playbackState)628     private static JSONObject buildJsonPlaybackState(PlaybackState playbackState)
629             throws JSONException {
630         JSONObject result = new JSONObject();
631         result.put("state", playbackState.getState());
632         result.put("position", playbackState.getPosition());
633         result.put("speed", playbackState.getPlaybackSpeed());
634         result.put("actions", playbackState.getActions());
635         return result;
636     }
637 
buildJsonScanResult(ScanResult scanResult)638     private static JSONObject buildJsonScanResult(ScanResult scanResult)
639             throws JSONException {
640         JSONObject result = new JSONObject();
641         result.put("BSSID", scanResult.BSSID);
642         result.put("SSID", scanResult.SSID);
643         result.put("frequency", scanResult.frequency);
644         result.put("level", scanResult.level);
645         result.put("capabilities", scanResult.capabilities);
646         result.put("timestamp", scanResult.timestamp);
647         result.put("centerFreq0", scanResult.centerFreq0);
648         result.put("centerFreq1", scanResult.centerFreq1);
649         result.put("channelWidth", scanResult.channelWidth);
650         result.put("distanceCm", scanResult.distanceCm);
651         result.put("distanceSdCm", scanResult.distanceSdCm);
652         result.put("is80211McRTTResponder", scanResult.is80211mcResponder());
653         result.put("passpointNetwork", scanResult.isPasspointNetwork());
654         result.put("numUsage", scanResult.numUsage);
655         result.put("seen", scanResult.seen);
656         result.put("untrusted", scanResult.untrusted);
657         result.put("operatorFriendlyName", scanResult.operatorFriendlyName);
658         result.put("venueName", scanResult.venueName);
659         if (scanResult.informationElements != null) {
660             JSONArray infoEles = new JSONArray();
661             for (ScanResult.InformationElement ie : scanResult.informationElements) {
662                 JSONObject infoEle = new JSONObject();
663                 infoEle.put("id", ie.id);
664                 infoEle.put("bytes", Base64Codec.encodeBase64String(ie.bytes));
665                 infoEles.put(infoEle);
666             }
667             result.put("InformationElements", infoEles);
668         } else {
669             result.put("InformationElements", null);
670         }
671         if (scanResult.radioChainInfos != null) {
672             JSONArray radioChainEles = new JSONArray();
673             for (ScanResult.RadioChainInfo item : scanResult.radioChainInfos) {
674                 JSONObject radioChainEle = new JSONObject();
675                 radioChainEle.put("id", item.id);
676                 radioChainEle.put("level", item.level);
677                 radioChainEles.put(radioChainEle);
678             }
679             result.put("radioChainInfos", radioChainEles);
680         } else {
681             result.put("radioChainInfos", null);
682         }
683         return result;
684     }
685 
buildJsonScanData(ScanData scanData)686     private static JSONObject buildJsonScanData(ScanData scanData)
687             throws JSONException {
688         JSONObject result = new JSONObject();
689         result.put("Id", scanData.getId());
690         result.put("Flags", scanData.getFlags());
691         JSONArray scanResults = new JSONArray();
692         for (ScanResult sr : scanData.getResults()) {
693             scanResults.put(buildJsonScanResult(sr));
694         }
695         result.put("ScanResults", scanResults);
696         return result;
697     }
698 
buildJsonWifiInfo(WifiInfo data)699     private static JSONObject buildJsonWifiInfo(WifiInfo data)
700             throws JSONException {
701         JSONObject result = new JSONObject();
702         result.put("hidden_ssid", data.getHiddenSSID());
703         result.put("ip_address", data.getIpAddress());
704         result.put("link_speed", data.getLinkSpeed());
705         result.put("network_id", data.getNetworkId());
706         result.put("rssi", data.getRssi());
707         result.put("BSSID", data.getBSSID());
708         result.put("mac_address", data.getMacAddress());
709         result.put("frequency", data.getFrequency());
710         // Trim the double quotes if exist
711         String ssid = data.getSSID();
712         if (ssid.charAt(0) == '"'
713                 && ssid.charAt(ssid.length() - 1) == '"') {
714             result.put("SSID", ssid.substring(1, ssid.length() - 1));
715         } else {
716             result.put("SSID", ssid);
717         }
718         String supplicantState = "";
719         switch (data.getSupplicantState()) {
720             case ASSOCIATED:
721                 supplicantState = "associated";
722                 break;
723             case ASSOCIATING:
724                 supplicantState = "associating";
725                 break;
726             case COMPLETED:
727                 supplicantState = "completed";
728                 break;
729             case DISCONNECTED:
730                 supplicantState = "disconnected";
731                 break;
732             case DORMANT:
733                 supplicantState = "dormant";
734                 break;
735             case FOUR_WAY_HANDSHAKE:
736                 supplicantState = "four_way_handshake";
737                 break;
738             case GROUP_HANDSHAKE:
739                 supplicantState = "group_handshake";
740                 break;
741             case INACTIVE:
742                 supplicantState = "inactive";
743                 break;
744             case INVALID:
745                 supplicantState = "invalid";
746                 break;
747             case SCANNING:
748                 supplicantState = "scanning";
749                 break;
750             case UNINITIALIZED:
751                 supplicantState = "uninitialized";
752                 break;
753             default:
754                 supplicantState = null;
755         }
756         result.put("supplicant_state", build(supplicantState));
757         result.put("is_5ghz", data.is5GHz());
758         result.put("is_24ghz", data.is24GHz());
759         return result;
760     }
761 
buildNeighboringCellInfo(NeighboringCellInfo data)762     private static JSONObject buildNeighboringCellInfo(NeighboringCellInfo data)
763             throws JSONException {
764         JSONObject result = new JSONObject();
765         result.put("cid", data.getCid());
766         result.put("rssi", data.getRssi());
767         result.put("lac", data.getLac());
768         result.put("psc", data.getPsc());
769         String networkType = TelephonyUtils.getNetworkTypeString(data.getNetworkType());
770         result.put("network_type", build(networkType));
771         return result;
772     }
773 
buildCellInfo(CellInfo data)774     private static JSONObject buildCellInfo(CellInfo data) throws JSONException {
775         JSONObject result = new JSONObject();
776         result.put("registered", data.isRegistered());
777         result.put("connection_status", data.getCellConnectionStatus());
778         result.put("timestamp", data.getTimeStamp());
779 
780         CellIdentity cid = data.getCellIdentity();
781         result.put("channel_number", cid.getChannelNumber());
782         result.put("alpha_long", cid.getOperatorAlphaLong());
783         result.put("alpha_short", cid.getOperatorAlphaShort());
784 
785         if (data instanceof CellInfoLte) {
786             return buildCellInfoLte((CellInfoLte) data, result);
787         } else if (data instanceof CellInfoWcdma) {
788             return buildCellInfoWcdma((CellInfoWcdma) data, result);
789         } else if (data instanceof CellInfoTdscdma) {
790             return buildCellInfoTdscdma((CellInfoTdscdma) data, result);
791         } else if (data instanceof CellInfoGsm) {
792             return buildCellInfoGsm((CellInfoGsm) data, result);
793         } else if (data instanceof CellInfoCdma) {
794             return buildCellInfoCdma((CellInfoCdma) data, result);
795         }
796         return result;
797     }
798 
buildCellInfoLte(CellInfoLte data, JSONObject result)799     private static JSONObject buildCellInfoLte(CellInfoLte data, JSONObject result)
800             throws JSONException {
801         result.put("rat", "lte");
802         CellIdentityLte cellidentity = data.getCellIdentity();
803         CellSignalStrengthLte signalstrength = data.getCellSignalStrength();
804         result.put("mcc", cellidentity.getMcc());
805         result.put("mnc", cellidentity.getMnc());
806         result.put("mcc_string", cellidentity.getMccString());
807         result.put("mnc_string", cellidentity.getMncString());
808         result.put("cid", cellidentity.getCi());
809         result.put("pcid", cellidentity.getPci());
810         result.put("tac", cellidentity.getTac());
811         result.put("bandwidth", cellidentity.getBandwidth());
812         result.put("rsrp", signalstrength.getDbm());
813         result.put("asulevel", signalstrength.getAsuLevel());
814         result.put("timing_advance", signalstrength.getTimingAdvance());
815         return result;
816     }
817 
buildCellInfoGsm(CellInfoGsm data, JSONObject result)818     private static JSONObject buildCellInfoGsm(CellInfoGsm data, JSONObject result)
819             throws JSONException {
820         result.put("rat", "gsm");
821         CellIdentityGsm cellidentity = data.getCellIdentity();
822         CellSignalStrengthGsm signalstrength = data.getCellSignalStrength();
823         result.put("mcc", cellidentity.getMcc());
824         result.put("mnc", cellidentity.getMnc());
825         result.put("mcc_string", cellidentity.getMccString());
826         result.put("mnc_string", cellidentity.getMncString());
827         result.put("cid", cellidentity.getCid());
828         result.put("lac", cellidentity.getLac());
829         result.put("bsic", cellidentity.getBsic());
830         result.put("arfcn", cellidentity.getArfcn());
831         result.put("signal_strength", signalstrength.getDbm());
832         result.put("asulevel", signalstrength.getAsuLevel());
833         return result;
834     }
835 
buildCellInfoWcdma(CellInfoWcdma data, JSONObject result)836     private static JSONObject buildCellInfoWcdma(CellInfoWcdma data, JSONObject result)
837             throws JSONException {
838         result.put("rat", "wcdma");
839         CellIdentityWcdma cellidentity = data.getCellIdentity();
840         CellSignalStrengthWcdma signalstrength = data.getCellSignalStrength();
841         result.put("mcc", cellidentity.getMcc());
842         result.put("mnc", cellidentity.getMnc());
843         result.put("mcc_string", cellidentity.getMccString());
844         result.put("mnc_string", cellidentity.getMncString());
845         result.put("cid", cellidentity.getCid());
846         result.put("lac", cellidentity.getLac());
847         result.put("psc", cellidentity.getPsc());
848         result.put("signal_strength", signalstrength.getDbm());
849         result.put("asulevel", signalstrength.getAsuLevel());
850         return result;
851     }
852 
buildCellInfoTdscdma(CellInfoTdscdma data, JSONObject result)853     private static JSONObject buildCellInfoTdscdma(CellInfoTdscdma data, JSONObject result)
854             throws JSONException {
855         result.put("rat", "tdscdma");
856         CellIdentityTdscdma cellidentity = data.getCellIdentity();
857         CellSignalStrengthTdscdma signalstrength = data.getCellSignalStrength();
858         result.put("mcc_string", cellidentity.getMccString());
859         result.put("mnc_string", cellidentity.getMncString());
860         result.put("cid", cellidentity.getCid());
861         result.put("lac", cellidentity.getLac());
862         result.put("cpid", cellidentity.getCpid());
863         result.put("signal_strength", signalstrength.getDbm());
864         result.put("asulevel", signalstrength.getAsuLevel());
865         return result;
866     }
867 
buildCellInfoCdma(CellInfoCdma data, JSONObject result)868     private static JSONObject buildCellInfoCdma(CellInfoCdma data, JSONObject result)
869             throws JSONException {
870         result.put("rat", "cdma");
871         result.put("registered", data.isRegistered());
872         CellIdentityCdma cellidentity = data.getCellIdentity();
873         CellSignalStrengthCdma signalstrength = data.getCellSignalStrength();
874         result.put("network_id", cellidentity.getNetworkId());
875         result.put("system_id", cellidentity.getSystemId());
876         result.put("basestation_id", cellidentity.getBasestationId());
877         result.put("longitude", cellidentity.getLongitude());
878         result.put("latitude", cellidentity.getLatitude());
879         result.put("cdma_dbm", signalstrength.getCdmaDbm());
880         result.put("cdma_ecio", signalstrength.getCdmaEcio());
881         result.put("evdo_dbm", signalstrength.getEvdoDbm());
882         result.put("evdo_ecio", signalstrength.getEvdoEcio());
883         result.put("evdo_snr", signalstrength.getEvdoSnr());
884         return result;
885     }
886 
buildHttpURLConnection(HttpURLConnection data)887     private static Object buildHttpURLConnection(HttpURLConnection data)
888             throws JSONException {
889         JSONObject con = new JSONObject();
890         try {
891             con.put("ResponseCode", data.getResponseCode());
892             con.put("ResponseMessage", data.getResponseMessage());
893         } catch (IOException e) {
894             e.printStackTrace();
895             return con;
896         }
897         con.put("ContentLength", data.getContentLength());
898         con.put("ContentEncoding", data.getContentEncoding());
899         con.put("ContentType", data.getContentType());
900         con.put("Date", data.getDate());
901         con.put("ReadTimeout", data.getReadTimeout());
902         con.put("HeaderFields", buildJsonMap(data.getHeaderFields()));
903         con.put("URL", buildURL(data.getURL()));
904         return con;
905     }
906 
buildNetwork(Network data)907     private static Object buildNetwork(Network data) throws JSONException {
908         JSONObject nw = new JSONObject();
909         nw.put("netId", data.netId);
910         return nw;
911     }
912 
buildNetworkInfo(NetworkInfo data)913     private static Object buildNetworkInfo(NetworkInfo data)
914             throws JSONException {
915         JSONObject info = new JSONObject();
916         info.put("isAvailable", data.isAvailable());
917         info.put("isConnected", data.isConnected());
918         info.put("isFailover", data.isFailover());
919         info.put("isRoaming", data.isRoaming());
920         info.put("ExtraInfo", data.getExtraInfo());
921         info.put("FailedReason", data.getReason());
922         info.put("TypeName", data.getTypeName());
923         info.put("SubtypeName", data.getSubtypeName());
924         info.put("State", data.getState().name().toString());
925         return info;
926     }
927 
buildURL(URL data)928     private static Object buildURL(URL data) throws JSONException {
929         JSONObject url = new JSONObject();
930         url.put("Authority", data.getAuthority());
931         url.put("Host", data.getHost());
932         url.put("Path", data.getPath());
933         url.put("Port", data.getPort());
934         url.put("Protocol", data.getProtocol());
935         return url;
936     }
937 
938     /**
939      * Builds a json representation of a {@link DataUsageInfo}.
940      * @param data The DataUsageInfo convert to JSON.
941      * @return A JSONObject representation of a {@link DataUsageInfo}.
942      * @throws JSONException
943      */
buildDataUsageInfo(@onNull DataUsageInfo data)944     private static JSONObject buildDataUsageInfo(@NonNull DataUsageInfo data)
945             throws JSONException {
946         JSONObject usage = new JSONObject();
947         usage.put("SubscriberId", data.subscriberId);
948         usage.put("Period", data.period);
949         usage.put("StartEpochMilli", data.startEpochMilli);
950         usage.put("EndEpochMilli", data.endEpochMilli);
951         usage.put("CycleStart", data.cycleStart);
952         usage.put("CycleEnd", data.cycleEnd);
953         usage.put("LimitLevel", data.limitLevel);
954         usage.put("WarningLevel", data.warningLevel);
955         usage.put("UsageLevel", data.usageLevel);
956         usage.put("Uid", data.uId);
957         return usage;
958     }
959 
960     /**
961      * Builds a json representation of a {@link PhoneAccount}.
962      * @param data The PhoneAccount convert to JSON.
963      * @return A JSONObject representation of a {@link PhoneAccount}.
964      * @throws JSONException
965      */
buildPhoneAccount(@onNull PhoneAccount data)966     private static JSONObject buildPhoneAccount(@NonNull PhoneAccount data)
967             throws JSONException {
968         JSONObject acct = new JSONObject();
969         acct.put("Address", toNonNullString(data.getAddress(), Uri::toSafeString));
970         acct.put("SubscriptionAddress", toNonNullString(data.getSubscriptionAddress(),
971                 Uri::toSafeString));
972         acct.put("Label", toNonNullString(data.getLabel()));
973         acct.put("ShortDescription", toNonNullString(data.getShortDescription()));
974         return acct;
975     }
976 
buildPhoneAccountHandle(PhoneAccountHandle data)977     private static Object buildPhoneAccountHandle(PhoneAccountHandle data)
978             throws JSONException {
979         JSONObject msg = new JSONObject();
980         msg.put("id", data.getId());
981         msg.put("ComponentName", data.getComponentName().flattenToString());
982         return msg;
983     }
984 
buildSubscriptionInfoRecord(SubscriptionInfo data)985     private static Object buildSubscriptionInfoRecord(SubscriptionInfo data)
986             throws JSONException {
987         JSONObject msg = new JSONObject();
988         msg.put("subscriptionId", data.getSubscriptionId());
989         msg.put("iccId", data.getIccId());
990         msg.put("simSlotIndex", data.getSimSlotIndex());
991         msg.put("displayName", data.getDisplayName());
992         msg.put("nameSource", data.getNameSource());
993         msg.put("iconTint", data.getIconTint());
994         msg.put("number", data.getNumber());
995         msg.put("dataRoaming", data.getDataRoaming());
996         msg.put("mcc", data.getMcc());
997         msg.put("mnc", data.getMnc());
998         return msg;
999     }
1000 
buildPoint(Point data)1001     private static Object buildPoint(Point data) throws JSONException {
1002         JSONObject point = new JSONObject();
1003         point.put("x", data.x);
1004         point.put("y", data.y);
1005         return point;
1006     }
1007 
buildRttCapabilities(RttCapabilities data)1008     private static Object buildRttCapabilities(RttCapabilities data)
1009             throws JSONException {
1010         JSONObject cap = new JSONObject();
1011         cap.put("bwSupported", data.bwSupported);
1012         cap.put("lciSupported", data.lciSupported);
1013         cap.put("lcrSupported", data.lcrSupported);
1014         cap.put("oneSidedRttSupported", data.oneSidedRttSupported);
1015         cap.put("preambleSupported", data.preambleSupported);
1016         cap.put("twoSided11McRttSupported", data.twoSided11McRttSupported);
1017         return cap;
1018     }
1019 
buildSmsMessage(SmsMessage data)1020     private static Object buildSmsMessage(SmsMessage data) throws JSONException {
1021         JSONObject msg = new JSONObject();
1022         msg.put("originatingAddress", data.getOriginatingAddress());
1023         msg.put("messageBody", data.getMessageBody());
1024         return msg;
1025     }
1026 
buildWifiActivityEnergyInfo( WifiActivityEnergyInfo data)1027     private static JSONObject buildWifiActivityEnergyInfo(
1028             WifiActivityEnergyInfo data) throws JSONException {
1029         JSONObject result = new JSONObject();
1030         result.put("ControllerEnergyUsed", data.getControllerEnergyUsed());
1031         result.put("ControllerIdleTimeMillis",
1032                 data.getControllerIdleTimeMillis());
1033         result.put("ControllerRxTimeMillis", data.getControllerRxTimeMillis());
1034         result.put("ControllerTxTimeMillis", data.getControllerTxTimeMillis());
1035         result.put("StackState", data.getStackState());
1036         result.put("TimeStamp", data.getTimeStamp());
1037         return result;
1038     }
1039 
buildWifiConfiguration(WifiConfiguration data)1040     private static Object buildWifiConfiguration(WifiConfiguration data)
1041             throws JSONException {
1042         JSONObject config = new JSONObject();
1043         config.put("networkId", data.networkId);
1044         // Trim the double quotes if exist
1045         if (data.SSID.charAt(0) == '"'
1046                 && data.SSID.charAt(data.SSID.length() - 1) == '"') {
1047             config.put("SSID", data.SSID.substring(1, data.SSID.length() - 1));
1048         } else {
1049             config.put("SSID", data.SSID);
1050         }
1051         config.put("BSSID", data.BSSID);
1052         config.put("priority", data.priority);
1053         config.put("hiddenSSID", data.hiddenSSID);
1054         config.put("FQDN", data.FQDN);
1055         config.put("providerFriendlyName", data.providerFriendlyName);
1056         config.put("isPasspoint", data.isPasspoint());
1057         config.put("hiddenSSID", data.hiddenSSID);
1058         if (data.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.SAE)) {
1059             config.put("security", "SAE");
1060         } else if (data.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_PSK)) {
1061             config.put("security", "PSK");
1062         } else if (data.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.OWE)) {
1063             config.put("security", "OWE");
1064         } else if (data.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.SUITE_B_192)) {
1065             config.put("security", "SUITE_B_192");
1066         } else if (data.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_EAP)) {
1067             config.put("security", "EAP");
1068         } else if (data.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) {
1069             config.put("security", "NONE");
1070         }
1071         if (data.status == WifiConfiguration.Status.CURRENT) {
1072             config.put("status", "CURRENT");
1073         } else if (data.status == WifiConfiguration.Status.DISABLED) {
1074             config.put("status", "DISABLED");
1075         } else if (data.status == WifiConfiguration.Status.ENABLED) {
1076             config.put("status", "ENABLED");
1077         } else {
1078             config.put("status", "UNKNOWN");
1079         }
1080         // config.put("enterpriseConfig", buildWifiEnterpriseConfig(data.enterpriseConfig));
1081         return config;
1082     }
1083 
buildWifiEnterpriseConfig(WifiEnterpriseConfig data)1084     private static Object buildWifiEnterpriseConfig(WifiEnterpriseConfig data)
1085             throws JSONException, CertificateEncodingException {
1086         JSONObject config = new JSONObject();
1087         config.put(WifiEnterpriseConfig.PLMN_KEY, data.getPlmn());
1088         config.put(WifiEnterpriseConfig.REALM_KEY, data.getRealm());
1089         config.put(WifiEnterpriseConfig.EAP_KEY, data.getEapMethod());
1090         config.put(WifiEnterpriseConfig.PHASE2_KEY, data.getPhase2Method());
1091         config.put(WifiEnterpriseConfig.ALTSUBJECT_MATCH_KEY, data.getAltSubjectMatch());
1092         X509Certificate caCert = data.getCaCertificate();
1093         String caCertString = Base64.encodeToString(caCert.getEncoded(), Base64.DEFAULT);
1094         config.put(WifiEnterpriseConfig.CA_CERT_KEY, caCertString);
1095         X509Certificate clientCert = data.getClientCertificate();
1096         String clientCertString = Base64.encodeToString(clientCert.getEncoded(), Base64.DEFAULT);
1097         config.put(WifiEnterpriseConfig.CLIENT_CERT_KEY, clientCertString);
1098         PrivateKey pk = data.getClientPrivateKey();
1099         String privateKeyString = Base64.encodeToString(pk.getEncoded(), Base64.DEFAULT);
1100         config.put(WifiEnterpriseConfig.PRIVATE_KEY_ID_KEY, privateKeyString);
1101         config.put(WifiEnterpriseConfig.PASSWORD_KEY, data.getPassword());
1102         return config;
1103     }
1104 
buildWpsInfo(WpsInfo data)1105     private static JSONObject buildWpsInfo(WpsInfo data)
1106             throws JSONException {
1107         JSONObject wpsInfo = new JSONObject();
1108         wpsInfo.put("setup", data.setup);
1109         wpsInfo.put("BSSID", data.BSSID);
1110         wpsInfo.put("pin", data.pin);
1111         return wpsInfo;
1112     }
1113 
buildWifiP2pConfig(WifiP2pConfig data)1114     private static JSONObject buildWifiP2pConfig(WifiP2pConfig data)
1115             throws JSONException {
1116         JSONObject wifiP2pConfig = new JSONObject();
1117         wifiP2pConfig.put("deviceAddress", data.deviceAddress);
1118         wifiP2pConfig.put("wpsInfo", buildWpsInfo(data.wps));
1119         wifiP2pConfig.put("groupOwnerIntent", data.groupOwnerIntent);
1120         wifiP2pConfig.put("netId", data.netId);
1121         return wifiP2pConfig;
1122     }
1123 
buildWifiP2pDevice(WifiP2pDevice data)1124     private static JSONObject buildWifiP2pDevice(WifiP2pDevice data)
1125             throws JSONException {
1126         JSONObject deviceInfo = new JSONObject();
1127         deviceInfo.put("Name", data.deviceName);
1128         deviceInfo.put("Address", data.deviceAddress);
1129         deviceInfo.put("GroupCapability", data.groupCapability);
1130         return deviceInfo;
1131     }
1132 
buildWifiP2pGroup(WifiP2pGroup data)1133     private static JSONObject buildWifiP2pGroup(WifiP2pGroup data)
1134             throws JSONException {
1135         JSONObject group = new JSONObject();
1136         Log.d("build p2p group.");
1137         group.put("ClientList", build(data.getClientList()));
1138         group.put("Interface", data.getInterface());
1139         group.put("Networkname", data.getNetworkName());
1140         group.put("Owner", data.getOwner());
1141         group.put("Passphrase", data.getPassphrase());
1142         group.put("NetworkId", data.getNetworkId());
1143         return group;
1144     }
1145 
buildWifiP2pInfo(WifiP2pInfo data)1146     private static JSONObject buildWifiP2pInfo(WifiP2pInfo data)
1147             throws JSONException {
1148         JSONObject info = new JSONObject();
1149         Log.d("build p2p info.");
1150         info.put("groupFormed", data.groupFormed);
1151         info.put("isGroupOwner", data.isGroupOwner);
1152         info.put("groupOwnerAddress", data.groupOwnerAddress);
1153         return info;
1154     }
1155 
buildLinkProperties(LinkProperties data)1156     private static JSONObject buildLinkProperties(LinkProperties data) throws JSONException {
1157         JSONObject info = new JSONObject();
1158         info.put("InterfaceName", data.getInterfaceName());
1159         info.put("LinkAddresses", build(data.getLinkAddresses()));
1160         info.put("DnsServers", build(data.getDnsServers()));
1161         info.put("Domains", data.getDomains());
1162         info.put("Mtu", data.getMtu());
1163         info.put("Routes", build(data.getRoutes()));
1164         info.put("IsPrivateDnsActive", data.isPrivateDnsActive());
1165         info.put("PrivateDnsServerName", data.getPrivateDnsServerName());
1166         info.put("ValidatedPrivateDnsServers", build(data.getValidatedPrivateDnsServers()));
1167         return info;
1168     }
1169 
buildLinkAddress(LinkAddress data)1170     private static JSONObject buildLinkAddress(LinkAddress data) throws JSONException {
1171         JSONObject info = new JSONObject();
1172         info.put("Address", build(data.getAddress()));
1173         info.put("PrefixLength", data.getPrefixLength());
1174         info.put("Scope", data.getScope());
1175         info.put("Flags", data.getFlags());
1176         return info;
1177     }
1178 
buildRouteInfo(RouteInfo data)1179     private static JSONObject buildRouteInfo(RouteInfo data) throws JSONException {
1180         JSONObject info = new JSONObject();
1181         info.put("Destination", build(data.getDestination()));
1182         info.put("Gateway", build(data.getGateway()));
1183         info.put("Interface", data.getInterface());
1184         info.put("IsDefaultRoute", data.isDefaultRoute());
1185         return info;
1186     }
1187 
buildIpPrefix(IpPrefix data)1188     private static JSONObject buildIpPrefix(IpPrefix data) throws JSONException {
1189         JSONObject info = new JSONObject();
1190         info.put("Address", data.getAddress());
1191         info.put("PrefixLength", data.getPrefixLength());
1192         return info;
1193     }
1194 
buildProxyInfo(ProxyInfo data)1195     private static JSONObject buildProxyInfo(ProxyInfo data) throws JSONException {
1196         JSONObject info = new JSONObject();
1197         info.put("Hostname", data.getHost());
1198         info.put("Port", data.getPort());
1199         info.put("ExclList", data.getExclusionListAsString());
1200         info.put("PacUrl", data.getPacFileUrl().toString());
1201         return info;
1202     }
1203 
buildCallEvent(InCallServiceImpl.CallEvent<T> callEvent)1204     private static <T> JSONObject buildCallEvent(InCallServiceImpl.CallEvent<T> callEvent)
1205             throws JSONException {
1206         JSONObject jsonEvent = new JSONObject();
1207         jsonEvent.put("CallId", callEvent.getCallId());
1208         jsonEvent.put("Event", build(callEvent.getEvent()));
1209         return jsonEvent;
1210     }
1211 
buildUri(Uri uri)1212     private static JSONObject buildUri(Uri uri) throws JSONException {
1213         return new JSONObject().put("Uri", build((uri != null) ? uri.toString() : ""));
1214     }
1215 
buildCallDetails(Call.Details details)1216     private static JSONObject buildCallDetails(Call.Details details) throws JSONException {
1217 
1218         JSONObject callDetails = new JSONObject();
1219 
1220         callDetails.put("Handle", buildUri(details.getHandle()));
1221         callDetails.put("HandlePresentation",
1222                 build(InCallServiceImpl.getCallPresentationInfoString(
1223                         details.getHandlePresentation())));
1224         callDetails.put("CallerDisplayName", build(details.getCallerDisplayName()));
1225 
1226         // TODO AccountHandle
1227         // callDetails.put("AccountHandle", build(""));
1228 
1229         callDetails.put("Capabilities",
1230                 build(InCallServiceImpl.getCallCapabilitiesString(details.getCallCapabilities())));
1231 
1232         callDetails.put("Properties",
1233                 build(InCallServiceImpl.getCallPropertiesString(details.getCallProperties())));
1234 
1235         // TODO Parse fields in Disconnect Cause
1236         callDetails.put("DisconnectCause", build((details.getDisconnectCause() != null) ? details
1237                 .getDisconnectCause().toString() : ""));
1238         callDetails.put("ConnectTimeMillis", build(details.getConnectTimeMillis()));
1239 
1240         // TODO: GatewayInfo
1241         // callDetails.put("GatewayInfo", build(""));
1242 
1243         callDetails.put("VideoState",
1244                 build(InCallServiceImpl.getVideoCallStateString(details.getVideoState())));
1245 
1246         // TODO: StatusHints
1247         // callDetails.put("StatusHints", build(""));
1248 
1249         callDetails.put("Extras", build(details.getExtras()));
1250 
1251         return callDetails;
1252     }
1253 
buildCall(Call call)1254     private static JSONObject buildCall(Call call) throws JSONException {
1255 
1256         JSONObject callInfo = new JSONObject();
1257 
1258         callInfo.put("Parent", build(InCallServiceImpl.getCallId(call)));
1259 
1260         // TODO:Make a function out of this for consistency
1261         ArrayList<String> children = new ArrayList<String>();
1262         for (Call child : call.getChildren()) {
1263             children.add(InCallServiceImpl.getCallId(child));
1264         }
1265         callInfo.put("Children", build(children));
1266 
1267         // TODO:Make a function out of this for consistency
1268         ArrayList<String> conferenceables = new ArrayList<String>();
1269         for (Call conferenceable : call.getChildren()) {
1270             children.add(InCallServiceImpl.getCallId(conferenceable));
1271         }
1272         callInfo.put("ConferenceableCalls", build(conferenceables));
1273 
1274         callInfo.put("State", build(InCallServiceImpl.getCallStateString(call.getState())));
1275         callInfo.put("CannedTextResponses", build(call.getCannedTextResponses()));
1276         callInfo.put("VideoCall", InCallServiceImpl.getVideoCallId(call.getVideoCall()));
1277         callInfo.put("Details", build(call.getDetails()));
1278 
1279         return callInfo;
1280     }
1281 
buildVideoProfile(VideoProfile videoProfile)1282     private static JSONObject buildVideoProfile(VideoProfile videoProfile) throws JSONException {
1283         JSONObject profile = new JSONObject();
1284 
1285         profile.put("VideoState",
1286                 InCallServiceImpl.getVideoCallStateString(videoProfile.getVideoState()));
1287         profile.put("VideoQuality",
1288                 InCallServiceImpl.getVideoCallQualityString(videoProfile.getQuality()));
1289 
1290         return profile;
1291     }
1292 
buildCameraCapabilities(CameraCapabilities cameraCapabilities)1293     private static JSONObject buildCameraCapabilities(CameraCapabilities cameraCapabilities)
1294             throws JSONException {
1295         JSONObject capabilities = new JSONObject();
1296 
1297         capabilities.put("Height", build(cameraCapabilities.getHeight()));
1298         capabilities.put("Width", build(cameraCapabilities.getWidth()));
1299         capabilities.put("ZoomSupported", build(cameraCapabilities.isZoomSupported()));
1300         capabilities.put("MaxZoom", build(cameraCapabilities.getMaxZoom()));
1301 
1302         return capabilities;
1303     }
1304 
buildVoLteServiceStateEvent( VoLteServiceState volteInfo)1305     private static JSONObject buildVoLteServiceStateEvent(
1306             VoLteServiceState volteInfo)
1307             throws JSONException {
1308         JSONObject info = new JSONObject();
1309         info.put(TelephonyConstants.VoLteServiceStateContainer.SRVCC_STATE,
1310                 TelephonyUtils.getSrvccStateString(volteInfo.getSrvccState()));
1311         return info;
1312     }
1313 
buildLegacyVpnInfo(LegacyVpnInfo data)1314     private static JSONObject buildLegacyVpnInfo(LegacyVpnInfo data) throws JSONException {
1315         JSONObject info = new JSONObject();
1316         if (data == null) {
1317             return info;
1318         }
1319         info.put("state", data.state);
1320         info.put("key", data.key);
1321         String intentStr = "";
1322         if (data.intent != null) {
1323             intentStr = data.intent.toString();
1324         }
1325         info.put("intent", intentStr);
1326         return info;
1327     }
1328 
buildModemActivityInfo(ModemActivityInfo modemInfo)1329     private static JSONObject buildModemActivityInfo(ModemActivityInfo modemInfo)
1330             throws JSONException {
1331         JSONObject info = new JSONObject();
1332 
1333         info.put("Timestamp", modemInfo.getTimestamp());
1334         info.put("SleepTimeMs", modemInfo.getSleepTimeMillis());
1335         info.put("IdleTimeMs", modemInfo.getIdleTimeMillis());
1336         // convert from int[] to List<Integer> for proper JSON translation
1337         int[] txTimes = modemInfo.getTxTimeMillis();
1338         List<Integer> tmp = new ArrayList<Integer>(txTimes.length);
1339         for (int val : txTimes) {
1340             tmp.add(val);
1341         }
1342         info.put("TxTimeMs", build(tmp));
1343         info.put("RxTimeMs", modemInfo.getRxTimeMillis());
1344         info.put("EnergyUsedMw", modemInfo.getEnergyUsed());
1345         return info;
1346     }
1347 
buildSignalStrength(SignalStrength signalStrength)1348     private static JSONObject buildSignalStrength(SignalStrength signalStrength)
1349             throws JSONException {
1350         JSONObject info = new JSONObject();
1351         info.put(TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_GSM,
1352                 signalStrength.getGsmSignalStrength());
1353         info.put(
1354                 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_GSM_DBM,
1355                 signalStrength.getGsmDbm());
1356         info.put(
1357                 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_GSM_LEVEL,
1358                 signalStrength.getGsmLevel());
1359         info.put(
1360                 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_GSM_ASU_LEVEL,
1361                 signalStrength.getGsmAsuLevel());
1362         info.put(
1363                 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_GSM_BIT_ERROR_RATE,
1364                 signalStrength.getGsmBitErrorRate());
1365         info.put(
1366                 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_CDMA_DBM,
1367                 signalStrength.getCdmaDbm());
1368         info.put(
1369                 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_CDMA_LEVEL,
1370                 signalStrength.getCdmaLevel());
1371         info.put(
1372                 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_CDMA_ASU_LEVEL,
1373                 signalStrength.getCdmaAsuLevel());
1374         info.put(
1375                 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_CDMA_ECIO,
1376                 signalStrength.getCdmaEcio());
1377         info.put(
1378                 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_EVDO_DBM,
1379                 signalStrength.getEvdoDbm());
1380         info.put(
1381                 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_EVDO_ECIO,
1382                 signalStrength.getEvdoEcio());
1383         info.put(TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_LTE,
1384                 signalStrength.getLteSignalStrength());
1385         info.put(
1386                 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_LTE_DBM,
1387                 signalStrength.getLteDbm());
1388         info.put(
1389                 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_LTE_LEVEL,
1390                 signalStrength.getLteLevel());
1391         info.put(
1392                 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_LTE_ASU_LEVEL,
1393                 signalStrength.getLteAsuLevel());
1394         info.put(
1395                 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_LEVEL,
1396                 signalStrength.getLevel());
1397         info.put(
1398                 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_ASU_LEVEL,
1399                 signalStrength.getAsuLevel());
1400         info.put(TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_DBM,
1401                 signalStrength.getDbm());
1402         return info;
1403     }
1404 
buildServiceState(ServiceState ss)1405     public static JSONObject buildServiceState(ServiceState ss) throws JSONException {
1406         JSONObject info = new JSONObject();
1407 
1408     info.put(TelephonyConstants.ServiceStateContainer.VOICE_REG_STATE,
1409             TelephonyUtils.getNetworkStateString(ss.getVoiceRegState()));
1410     info.put(TelephonyConstants.ServiceStateContainer.VOICE_NETWORK_TYPE,
1411             TelephonyUtils.getNetworkTypeString(ss.getVoiceNetworkType()));
1412     info.put(TelephonyConstants.ServiceStateContainer.DATA_REG_STATE,
1413             TelephonyUtils.getNetworkStateString(ss.getDataRegState()));
1414     info.put(TelephonyConstants.ServiceStateContainer.DATA_NETWORK_TYPE,
1415             TelephonyUtils.getNetworkTypeString(ss.getDataNetworkType()));
1416     info.put(TelephonyConstants.ServiceStateContainer.OPERATOR_NAME, ss.getOperatorAlphaLong());
1417     info.put(TelephonyConstants.ServiceStateContainer.OPERATOR_ID, ss.getOperatorNumeric());
1418     info.put(TelephonyConstants.ServiceStateContainer.IS_MANUAL_NW_SELECTION,
1419             ss.getIsManualSelection());
1420     info.put(TelephonyConstants.ServiceStateContainer.ROAMING, ss.getRoaming());
1421     info.put(TelephonyConstants.ServiceStateContainer.IS_EMERGENCY_ONLY, ss.isEmergencyOnly());
1422     info.put(TelephonyConstants.ServiceStateContainer.NETWORK_ID, ss.getCdmaNetworkId());
1423     info.put(TelephonyConstants.ServiceStateContainer.SYSTEM_ID, ss.getCdmaSystemId());
1424     info.put(TelephonyConstants.ServiceStateContainer.SERVICE_STATE,
1425             TelephonyUtils.getNetworkStateString(ss.getState()));
1426     info.put(TelephonyConstants.ServiceStateContainer.CHANNEL_NUMBER, ss.getChannelNumber());
1427     info.put(TelephonyConstants.ServiceStateContainer.CELL_BANDWIDTHS,
1428             ss.getCellBandwidths() != null
1429                     ? new JSONArray(ss.getCellBandwidths())
1430                     : JSONObject.NULL);
1431     info.put(TelephonyConstants.ServiceStateContainer.DUPLEX_MODE, ss.getDuplexMode());
1432     info.put(TelephonyConstants.ServiceStateContainer.VOICE_ROAMING_TYPE,
1433             ss.getVoiceRoamingType());
1434     info.put(TelephonyConstants.ServiceStateContainer.DATA_ROAMING_TYPE,
1435             ss.getDataRoamingType());
1436     info.put(TelephonyConstants.ServiceStateContainer.VOICE_OPERATOR_ALPHA_LONG,
1437             ss.getVoiceOperatorAlphaLong());
1438     info.put(TelephonyConstants.ServiceStateContainer.VOICE_OPERATOR_ALPHA_SHORT,
1439             ss.getVoiceOperatorAlphaShort());
1440     info.put(TelephonyConstants.ServiceStateContainer.VOICE_OPERATOR_NUMERIC,
1441             ss.getVoiceOperatorNumeric());
1442     info.put(TelephonyConstants.ServiceStateContainer.DATA_OPERATOR_ALPHA_LONG,
1443             ss.getDataOperatorAlphaLong());
1444     info.put(TelephonyConstants.ServiceStateContainer.DATA_OPERATOR_ALPHA_SHORT,
1445             ss.getDataOperatorAlphaShort());
1446     info.put(TelephonyConstants.ServiceStateContainer.DATA_OPERATOR_NUMERIC,
1447             ss.getDataOperatorNumeric());
1448     info.put(TelephonyConstants.ServiceStateContainer.VOICE_RADIO_TECHNOLOGY,
1449             ss.getRilVoiceRadioTechnology());
1450     info.put(TelephonyConstants.ServiceStateContainer.DATA_RADIO_TECHNOLOGY,
1451             ss.getRilDataRadioTechnology());
1452     info.put(TelephonyConstants.ServiceStateContainer.CSS_INDICATOR, ss.getCssIndicator());
1453     info.put(TelephonyConstants.ServiceStateContainer.CDMA_ROAMING_INDICATOR,
1454             ss.getCdmaRoamingIndicator());
1455     info.put(TelephonyConstants.ServiceStateContainer.CDMA_DEFAULT_ROAMING_INDICATOR,
1456             ss.getCdmaDefaultRoamingIndicator());
1457     info.put(TelephonyConstants.ServiceStateContainer.IS_DATA_ROAMING_FROM_REGISTRATION,
1458             ss.getDataRoamingFromRegistration());
1459     info.put(TelephonyConstants.ServiceStateContainer.IS_USING_CARRIER_AGGREGATION,
1460             ss.isUsingCarrierAggregation());
1461     info.put(TelephonyConstants.ServiceStateContainer.LTE_EARFCN_RSRP_BOOST,
1462             ss.getLteEarfcnRsrpBoost());
1463     return info;
1464     }
1465 
JsonBuilder()1466     private JsonBuilder() {
1467         // This is a utility class.
1468     }
1469 }
1470