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 java.io.IOException; 20 import java.net.HttpURLConnection; 21 import java.net.InetAddress; 22 import java.net.InetSocketAddress; 23 import java.net.URL; 24 import java.security.PrivateKey; 25 import java.security.cert.CertificateEncodingException; 26 import java.security.cert.X509Certificate; 27 import java.util.ArrayList; 28 import java.util.Collection; 29 import java.util.List; 30 import java.util.Map; 31 import java.util.Map.Entry; 32 import java.util.Set; 33 34 import org.apache.commons.codec.binary.Base64Codec; 35 import org.json.JSONArray; 36 import org.json.JSONException; 37 import org.json.JSONObject; 38 39 import com.android.internal.net.LegacyVpnInfo; 40 import com.googlecode.android_scripting.ConvertUtils; 41 import com.googlecode.android_scripting.Log; 42 import com.googlecode.android_scripting.event.Event; 43 //FIXME: Refactor classes, constants and conversions out of here 44 import com.googlecode.android_scripting.facade.telephony.InCallServiceImpl; 45 import com.googlecode.android_scripting.facade.telephony.TelephonyConstants; 46 import com.googlecode.android_scripting.facade.telephony.TelephonyUtils; 47 48 import android.bluetooth.BluetoothDevice; 49 import android.bluetooth.BluetoothGattCharacteristic; 50 import android.bluetooth.BluetoothGattDescriptor; 51 import android.bluetooth.BluetoothGattService; 52 import android.bluetooth.le.AdvertiseSettings; 53 import android.content.ComponentName; 54 import android.content.Intent; 55 import android.graphics.Point; 56 import android.location.Address; 57 import android.location.Location; 58 import android.net.DhcpInfo; 59 import android.net.Network; 60 import android.net.NetworkInfo; 61 import android.net.Uri; 62 import android.net.wifi.RttManager.RttCapabilities; 63 import android.net.wifi.ScanResult; 64 import android.net.wifi.WifiActivityEnergyInfo; 65 import android.net.wifi.WifiChannel; 66 import android.net.wifi.WifiConfiguration; 67 import android.net.wifi.WifiEnterpriseConfig; 68 import android.net.wifi.WifiInfo; 69 import android.net.wifi.WifiScanner.ScanData; 70 import android.net.wifi.p2p.WifiP2pDevice; 71 import android.net.wifi.p2p.WifiP2pGroup; 72 import android.net.wifi.p2p.WifiP2pInfo; 73 import android.os.Bundle; 74 import android.os.ParcelUuid; 75 import android.telecom.Call; 76 import android.telecom.CallAudioState; 77 import android.telecom.PhoneAccount; 78 import android.telecom.PhoneAccountHandle; 79 import android.telecom.VideoProfile; 80 import android.telecom.VideoProfile.CameraCapabilities; 81 import android.telephony.CellIdentityCdma; 82 import android.telephony.CellIdentityGsm; 83 import android.telephony.CellIdentityLte; 84 import android.telephony.CellIdentityWcdma; 85 import android.telephony.CellInfoCdma; 86 import android.telephony.CellInfoGsm; 87 import android.telephony.CellInfoLte; 88 import android.telephony.CellInfoWcdma; 89 import android.telephony.CellLocation; 90 import android.telephony.CellSignalStrengthCdma; 91 import android.telephony.CellSignalStrengthGsm; 92 import android.telephony.CellSignalStrengthLte; 93 import android.telephony.CellSignalStrengthWcdma; 94 import android.telephony.ModemActivityInfo; 95 import android.telephony.NeighboringCellInfo; 96 import android.telephony.SignalStrength; 97 import android.telephony.SmsMessage; 98 import android.telephony.SubscriptionInfo; 99 import android.telephony.VoLteServiceState; 100 import android.telephony.gsm.GsmCellLocation; 101 import android.util.Base64; 102 import android.util.DisplayMetrics; 103 import android.util.SparseArray; 104 105 public class JsonBuilder { 106 107 @SuppressWarnings("unchecked") build(Object data)108 public static Object build(Object data) throws JSONException { 109 if (data == null) { 110 return JSONObject.NULL; 111 } 112 if (data instanceof Integer) { 113 return data; 114 } 115 if (data instanceof Float) { 116 return data; 117 } 118 if (data instanceof Double) { 119 return data; 120 } 121 if (data instanceof Long) { 122 return data; 123 } 124 if (data instanceof String) { 125 return data; 126 } 127 if (data instanceof Boolean) { 128 return data; 129 } 130 if (data instanceof JsonSerializable) { 131 return ((JsonSerializable) data).toJSON(); 132 } 133 if (data instanceof JSONObject) { 134 return data; 135 } 136 if (data instanceof JSONArray) { 137 return data; 138 } 139 if (data instanceof Set<?>) { 140 List<Object> items = new ArrayList<Object>((Set<?>) data); 141 return buildJsonList(items); 142 } 143 if (data instanceof Collection<?>) { 144 List<Object> items = new ArrayList<Object>((Collection<?>) data); 145 return buildJsonList(items); 146 } 147 if (data instanceof List<?>) { 148 return buildJsonList((List<?>) data); 149 } 150 if (data instanceof Address) { 151 return buildJsonAddress((Address) data); 152 } 153 if (data instanceof CallAudioState) { 154 return buildJsonAudioState((CallAudioState) data); 155 } 156 if (data instanceof Location) { 157 return buildJsonLocation((Location) data); 158 } 159 if (data instanceof Bundle) { 160 return buildJsonBundle((Bundle) data); 161 } 162 if (data instanceof Intent) { 163 return buildJsonIntent((Intent) data); 164 } 165 if (data instanceof Event) { 166 return buildJsonEvent((Event) data); 167 } 168 if (data instanceof Map<?, ?>) { 169 // TODO(damonkohler): I would like to make this a checked cast if 170 // possible. 171 return buildJsonMap((Map<String, ?>) data); 172 } 173 if (data instanceof ParcelUuid) { 174 return data.toString(); 175 } 176 if (data instanceof ScanResult) { 177 return buildJsonScanResult((ScanResult) data); 178 } 179 if (data instanceof ScanData) { 180 return buildJsonScanData((ScanData) data); 181 } 182 if (data instanceof android.bluetooth.le.ScanResult) { 183 return buildJsonBleScanResult((android.bluetooth.le.ScanResult) data); 184 } 185 if (data instanceof AdvertiseSettings) { 186 return buildJsonBleAdvertiseSettings((AdvertiseSettings) data); 187 } 188 if (data instanceof BluetoothGattService) { 189 return buildJsonBluetoothGattService((BluetoothGattService) data); 190 } 191 if (data instanceof BluetoothGattCharacteristic) { 192 return buildJsonBluetoothGattCharacteristic((BluetoothGattCharacteristic) data); 193 } 194 if (data instanceof BluetoothGattDescriptor) { 195 return buildJsonBluetoothGattDescriptor((BluetoothGattDescriptor) data); 196 } 197 if (data instanceof BluetoothDevice) { 198 return buildJsonBluetoothDevice((BluetoothDevice) data); 199 } 200 if (data instanceof CellLocation) { 201 return buildJsonCellLocation((CellLocation) data); 202 } 203 if (data instanceof WifiInfo) { 204 return buildJsonWifiInfo((WifiInfo) data); 205 } 206 if (data instanceof NeighboringCellInfo) { 207 return buildNeighboringCellInfo((NeighboringCellInfo) data); 208 } 209 if (data instanceof Network) { 210 return buildNetwork((Network) data); 211 } 212 if (data instanceof NetworkInfo) { 213 return buildNetworkInfo((NetworkInfo) data); 214 } 215 if (data instanceof HttpURLConnection) { 216 return buildHttpURLConnection((HttpURLConnection) data); 217 } 218 if (data instanceof InetSocketAddress) { 219 return buildInetSocketAddress((InetSocketAddress) data); 220 } 221 if (data instanceof InetAddress) { 222 return buildInetAddress((InetAddress) data); 223 } 224 if (data instanceof URL) { 225 return buildURL((URL) data); 226 } 227 if (data instanceof Point) { 228 return buildPoint((Point) data); 229 } 230 if (data instanceof SmsMessage) { 231 return buildSmsMessage((SmsMessage) data); 232 } 233 if (data instanceof PhoneAccount) { 234 return buildPhoneAccount((PhoneAccount) data); 235 } 236 if (data instanceof PhoneAccountHandle) { 237 return buildPhoneAccountHandle((PhoneAccountHandle) data); 238 } 239 if (data instanceof SubscriptionInfo) { 240 return buildSubscriptionInfoRecord((SubscriptionInfo) data); 241 } 242 if (data instanceof DhcpInfo) { 243 return buildDhcpInfo((DhcpInfo) data); 244 } 245 if (data instanceof DisplayMetrics) { 246 return buildDisplayMetrics((DisplayMetrics) data); 247 } 248 if (data instanceof RttCapabilities) { 249 return buildRttCapabilities((RttCapabilities) data); 250 } 251 if (data instanceof WifiActivityEnergyInfo) { 252 return buildWifiActivityEnergyInfo((WifiActivityEnergyInfo) data); 253 } 254 if (data instanceof WifiChannel) { 255 return buildWifiChannel((WifiChannel) data); 256 } 257 if (data instanceof WifiConfiguration) { 258 return buildWifiConfiguration((WifiConfiguration) data); 259 } 260 if (data instanceof WifiP2pDevice) { 261 return buildWifiP2pDevice((WifiP2pDevice) data); 262 } 263 if (data instanceof WifiP2pInfo) { 264 return buildWifiP2pInfo((WifiP2pInfo) data); 265 } 266 if (data instanceof WifiP2pGroup) { 267 return buildWifiP2pGroup((WifiP2pGroup) data); 268 } 269 if (data instanceof byte[]) { 270 JSONArray result = new JSONArray(); 271 for (byte b : (byte[]) data) { 272 result.put(b & 0xFF); 273 } 274 return result; 275 } 276 if (data instanceof Object[]) { 277 return buildJSONArray((Object[]) data); 278 } 279 if (data instanceof CellInfoLte) { 280 return buildCellInfoLte((CellInfoLte) data); 281 } 282 if (data instanceof CellInfoWcdma) { 283 return buildCellInfoWcdma((CellInfoWcdma) data); 284 } 285 if (data instanceof CellInfoGsm) { 286 return buildCellInfoGsm((CellInfoGsm) data); 287 } 288 if (data instanceof CellInfoCdma) { 289 return buildCellInfoCdma((CellInfoCdma) data); 290 } 291 if (data instanceof Call) { 292 return buildCall((Call) data); 293 } 294 if (data instanceof Call.Details) { 295 return buildCallDetails((Call.Details) data); 296 } 297 if (data instanceof InCallServiceImpl.CallEvent<?>) { 298 return buildCallEvent((InCallServiceImpl.CallEvent<?>) data); 299 } 300 if (data instanceof VideoProfile) { 301 return buildVideoProfile((VideoProfile) data); 302 } 303 if (data instanceof CameraCapabilities) { 304 return buildCameraCapabilities((CameraCapabilities) data); 305 } 306 if (data instanceof VoLteServiceState) { 307 return buildVoLteServiceStateEvent((VoLteServiceState) data); 308 } 309 if (data instanceof LegacyVpnInfo) { 310 return buildLegacyVpnInfo((LegacyVpnInfo) data); 311 } 312 if (data instanceof ModemActivityInfo) { 313 return buildModemActivityInfo((ModemActivityInfo) data); 314 } 315 if (data instanceof SignalStrength) { 316 return buildSignalStrength((SignalStrength) data); 317 } 318 319 return data.toString(); 320 // throw new JSONException("Failed to build JSON result. " + 321 // data.getClass().getName()); 322 } 323 buildJsonAudioState(CallAudioState data)324 private static JSONObject buildJsonAudioState(CallAudioState data) 325 throws JSONException { 326 JSONObject state = new JSONObject(); 327 state.put("isMuted", data.isMuted()); 328 state.put("AudioRoute", InCallServiceImpl.getAudioRouteString(data.getRoute())); 329 return state; 330 } 331 buildDisplayMetrics(DisplayMetrics data)332 private static Object buildDisplayMetrics(DisplayMetrics data) 333 throws JSONException { 334 JSONObject dm = new JSONObject(); 335 dm.put("widthPixels", data.widthPixels); 336 dm.put("heightPixels", data.heightPixels); 337 dm.put("noncompatHeightPixels", data.noncompatHeightPixels); 338 dm.put("noncompatWidthPixels", data.noncompatWidthPixels); 339 return dm; 340 } 341 buildInetAddress(InetAddress data)342 private static Object buildInetAddress(InetAddress data) { 343 JSONArray address = new JSONArray(); 344 address.put(data.getHostName()); 345 address.put(data.getHostAddress()); 346 return address; 347 } 348 buildInetSocketAddress(InetSocketAddress data)349 private static Object buildInetSocketAddress(InetSocketAddress data) { 350 JSONArray address = new JSONArray(); 351 address.put(data.getHostName()); 352 address.put(data.getPort()); 353 return address; 354 } 355 buildJsonAddress(Address address)356 private static JSONObject buildJsonAddress(Address address) 357 throws JSONException { 358 JSONObject result = new JSONObject(); 359 result.put("admin_area", address.getAdminArea()); 360 result.put("country_code", address.getCountryCode()); 361 result.put("country_name", address.getCountryName()); 362 result.put("feature_name", address.getFeatureName()); 363 result.put("phone", address.getPhone()); 364 result.put("locality", address.getLocality()); 365 result.put("postal_code", address.getPostalCode()); 366 result.put("sub_admin_area", address.getSubAdminArea()); 367 result.put("thoroughfare", address.getThoroughfare()); 368 result.put("url", address.getUrl()); 369 return result; 370 } 371 buildJSONArray(Object[] data)372 private static JSONArray buildJSONArray(Object[] data) throws JSONException { 373 JSONArray result = new JSONArray(); 374 for (Object o : data) { 375 result.put(build(o)); 376 } 377 return result; 378 } 379 buildJsonBleAdvertiseSettings( AdvertiseSettings advertiseSettings)380 private static JSONObject buildJsonBleAdvertiseSettings( 381 AdvertiseSettings advertiseSettings) throws JSONException { 382 JSONObject result = new JSONObject(); 383 result.put("mode", advertiseSettings.getMode()); 384 result.put("txPowerLevel", advertiseSettings.getTxPowerLevel()); 385 result.put("isConnectable", advertiseSettings.isConnectable()); 386 return result; 387 } 388 buildJsonBleScanResult( android.bluetooth.le.ScanResult scanResult)389 private static JSONObject buildJsonBleScanResult( 390 android.bluetooth.le.ScanResult scanResult) throws JSONException { 391 JSONObject result = new JSONObject(); 392 result.put("rssi", scanResult.getRssi()); 393 result.put("timestampNanos", scanResult.getTimestampNanos()); 394 result.put("deviceName", scanResult.getScanRecord().getDeviceName()); 395 result.put("txPowerLevel", scanResult.getScanRecord().getTxPowerLevel()); 396 result.put("advertiseFlags", scanResult.getScanRecord() 397 .getAdvertiseFlags()); 398 ArrayList<String> manufacturerDataList = new ArrayList<String>(); 399 ArrayList<Integer> idList = new ArrayList<Integer>(); 400 if (scanResult.getScanRecord().getManufacturerSpecificData() != null) { 401 SparseArray<byte[]> manufacturerSpecificData = scanResult 402 .getScanRecord().getManufacturerSpecificData(); 403 for (int i = 0; i < manufacturerSpecificData.size(); i++) { 404 manufacturerDataList.add(ConvertUtils 405 .convertByteArrayToString(manufacturerSpecificData 406 .valueAt(i))); 407 idList.add(manufacturerSpecificData.keyAt(i)); 408 } 409 } 410 result.put("manufacturerSpecificDataList", manufacturerDataList); 411 result.put("manufacturerIdList", idList); 412 ArrayList<String> serviceUuidList = new ArrayList<String>(); 413 ArrayList<String> serviceDataList = new ArrayList<String>(); 414 if (scanResult.getScanRecord().getServiceData() != null) { 415 Map<ParcelUuid, byte[]> serviceDataMap = scanResult.getScanRecord() 416 .getServiceData(); 417 for (ParcelUuid serviceUuid : serviceDataMap.keySet()) { 418 serviceUuidList.add(serviceUuid.toString()); 419 serviceDataList.add(ConvertUtils 420 .convertByteArrayToString(serviceDataMap 421 .get(serviceUuid))); 422 } 423 } 424 result.put("serviceUuidList", serviceUuidList); 425 result.put("serviceDataList", serviceDataList); 426 List<ParcelUuid> serviceUuids = scanResult.getScanRecord() 427 .getServiceUuids(); 428 String serviceUuidsString = ""; 429 if (serviceUuids != null && serviceUuids.size() > 0) { 430 for (ParcelUuid uuid : serviceUuids) { 431 serviceUuidsString = serviceUuidsString + "," + uuid; 432 } 433 } 434 result.put("serviceUuids", serviceUuidsString); 435 result.put("scanRecord", 436 build(ConvertUtils.convertByteArrayToString(scanResult 437 .getScanRecord().getBytes()))); 438 result.put("deviceInfo", build(scanResult.getDevice())); 439 return result; 440 } 441 buildJsonBluetoothDevice(BluetoothDevice data)442 private static JSONObject buildJsonBluetoothDevice(BluetoothDevice data) 443 throws JSONException { 444 JSONObject deviceInfo = new JSONObject(); 445 deviceInfo.put("address", data.getAddress()); 446 deviceInfo.put("state", data.getBondState()); 447 deviceInfo.put("name", data.getName()); 448 deviceInfo.put("type", data.getType()); 449 return deviceInfo; 450 } 451 buildJsonBluetoothGattCharacteristic( BluetoothGattCharacteristic data)452 private static Object buildJsonBluetoothGattCharacteristic( 453 BluetoothGattCharacteristic data) throws JSONException { 454 JSONObject result = new JSONObject(); 455 result.put("instanceId", data.getInstanceId()); 456 result.put("permissions", data.getPermissions()); 457 result.put("properties", data.getProperties()); 458 result.put("writeType", data.getWriteType()); 459 result.put("descriptorsList", build(data.getDescriptors())); 460 result.put("uuid", data.getUuid().toString()); 461 result.put("value", build(data.getValue())); 462 463 return result; 464 } 465 buildJsonBluetoothGattDescriptor( BluetoothGattDescriptor data)466 private static Object buildJsonBluetoothGattDescriptor( 467 BluetoothGattDescriptor data) throws JSONException { 468 JSONObject result = new JSONObject(); 469 result.put("instanceId", data.getInstanceId()); 470 result.put("permissions", data.getPermissions()); 471 result.put("characteristic", data.getCharacteristic()); 472 result.put("uuid", data.getUuid().toString()); 473 result.put("value", build(data.getValue())); 474 return result; 475 } 476 buildJsonBluetoothGattService( BluetoothGattService data)477 private static Object buildJsonBluetoothGattService( 478 BluetoothGattService data) throws JSONException { 479 JSONObject result = new JSONObject(); 480 result.put("instanceId", data.getInstanceId()); 481 result.put("type", data.getType()); 482 result.put("gattCharacteristicList", build(data.getCharacteristics())); 483 result.put("includedServices", build(data.getIncludedServices())); 484 result.put("uuid", data.getUuid().toString()); 485 return result; 486 } 487 buildJsonBundle(Bundle bundle)488 private static JSONObject buildJsonBundle(Bundle bundle) 489 throws JSONException { 490 JSONObject result = new JSONObject(); 491 for (String key : bundle.keySet()) { 492 result.put(key, build(bundle.get(key))); 493 } 494 return result; 495 } 496 buildJsonCellLocation(CellLocation cellLocation)497 private static JSONObject buildJsonCellLocation(CellLocation cellLocation) 498 throws JSONException { 499 JSONObject result = new JSONObject(); 500 if (cellLocation instanceof GsmCellLocation) { 501 GsmCellLocation location = (GsmCellLocation) cellLocation; 502 result.put("lac", location.getLac()); 503 result.put("cid", location.getCid()); 504 } 505 // TODO(damonkohler): Add support for CdmaCellLocation. Not supported 506 // until API level 5. 507 return result; 508 } 509 buildDhcpInfo(DhcpInfo data)510 private static JSONObject buildDhcpInfo(DhcpInfo data) throws JSONException { 511 JSONObject result = new JSONObject(); 512 result.put("ipAddress", data.ipAddress); 513 result.put("dns1", data.dns1); 514 result.put("dns2", data.dns2); 515 result.put("gateway", data.gateway); 516 result.put("serverAddress", data.serverAddress); 517 result.put("leaseDuration", data.leaseDuration); 518 return result; 519 } 520 buildJsonEvent(Event event)521 private static JSONObject buildJsonEvent(Event event) throws JSONException { 522 JSONObject result = new JSONObject(); 523 result.put("name", event.getName()); 524 result.put("data", build(event.getData())); 525 result.put("time", event.getCreationTime()); 526 return result; 527 } 528 buildJsonIntent(Intent data)529 private static JSONObject buildJsonIntent(Intent data) throws JSONException { 530 JSONObject result = new JSONObject(); 531 result.put("data", data.getDataString()); 532 result.put("type", data.getType()); 533 result.put("extras", build(data.getExtras())); 534 result.put("categories", build(data.getCategories())); 535 result.put("action", data.getAction()); 536 ComponentName component = data.getComponent(); 537 if (component != null) { 538 result.put("packagename", component.getPackageName()); 539 result.put("classname", component.getClassName()); 540 } 541 result.put("flags", data.getFlags()); 542 return result; 543 } 544 buildJsonList(final List<T> list)545 private static <T> JSONArray buildJsonList(final List<T> list) 546 throws JSONException { 547 JSONArray result = new JSONArray(); 548 for (T item : list) { 549 result.put(build(item)); 550 } 551 return result; 552 } 553 buildJsonLocation(Location location)554 private static JSONObject buildJsonLocation(Location location) 555 throws JSONException { 556 JSONObject result = new JSONObject(); 557 result.put("altitude", location.getAltitude()); 558 result.put("latitude", location.getLatitude()); 559 result.put("longitude", location.getLongitude()); 560 result.put("time", location.getTime()); 561 result.put("accuracy", location.getAccuracy()); 562 result.put("speed", location.getSpeed()); 563 result.put("provider", location.getProvider()); 564 result.put("bearing", location.getBearing()); 565 return result; 566 } 567 buildJsonMap(Map<String, ?> map)568 private static JSONObject buildJsonMap(Map<String, ?> map) 569 throws JSONException { 570 JSONObject result = new JSONObject(); 571 for (Entry<String, ?> entry : map.entrySet()) { 572 String key = entry.getKey(); 573 if (key == null) { 574 key = ""; 575 } 576 result.put(key, build(entry.getValue())); 577 } 578 return result; 579 } 580 buildJsonScanResult(ScanResult scanResult)581 private static JSONObject buildJsonScanResult(ScanResult scanResult) 582 throws JSONException { 583 JSONObject result = new JSONObject(); 584 result.put("BSSID", scanResult.BSSID); 585 result.put("SSID", scanResult.SSID); 586 result.put("frequency", scanResult.frequency); 587 result.put("level", scanResult.level); 588 result.put("capabilities", scanResult.capabilities); 589 result.put("timestamp", scanResult.timestamp); 590 result.put("blackListTimestamp", scanResult.blackListTimestamp); 591 result.put("centerFreq0", scanResult.centerFreq0); 592 result.put("centerFreq1", scanResult.centerFreq1); 593 result.put("channelWidth", scanResult.channelWidth); 594 result.put("distanceCm", scanResult.distanceCm); 595 result.put("distanceSdCm", scanResult.distanceSdCm); 596 result.put("is80211McRTTResponder", scanResult.is80211mcResponder()); 597 result.put("numConnection", scanResult.numConnection); 598 result.put("passpointNetwork", scanResult.isPasspointNetwork()); 599 result.put("numIpConfigFailures", scanResult.numIpConfigFailures); 600 result.put("numUsage", scanResult.numUsage); 601 result.put("seen", scanResult.seen); 602 result.put("untrusted", scanResult.untrusted); 603 result.put("operatorFriendlyName", scanResult.operatorFriendlyName); 604 result.put("venueName", scanResult.venueName); 605 if (scanResult.informationElements != null) { 606 JSONArray infoEles = new JSONArray(); 607 for (ScanResult.InformationElement ie : scanResult.informationElements) { 608 JSONObject infoEle = new JSONObject(); 609 infoEle.put("id", ie.id); 610 infoEle.put("bytes", Base64Codec.encodeBase64(ie.bytes).toString()); 611 infoEles.put(infoEle); 612 } 613 result.put("InfomationElements", infoEles); 614 } else { 615 result.put("InfomationElements", null); 616 } 617 return result; 618 } 619 buildJsonScanData(ScanData scanData)620 private static JSONObject buildJsonScanData(ScanData scanData) 621 throws JSONException { 622 JSONObject result = new JSONObject(); 623 result.put("Id", scanData.getId()); 624 result.put("Flags", scanData.getFlags()); 625 JSONArray scanResults = new JSONArray(); 626 for (ScanResult sr : scanData.getResults()) { 627 scanResults.put(buildJsonScanResult(sr)); 628 } 629 result.put("ScanResults", scanResults); 630 return result; 631 } 632 buildJsonWifiInfo(WifiInfo data)633 private static JSONObject buildJsonWifiInfo(WifiInfo data) 634 throws JSONException { 635 JSONObject result = new JSONObject(); 636 result.put("hidden_ssid", data.getHiddenSSID()); 637 result.put("ip_address", data.getIpAddress()); 638 result.put("link_speed", data.getLinkSpeed()); 639 result.put("network_id", data.getNetworkId()); 640 result.put("rssi", data.getRssi()); 641 result.put("BSSID", data.getBSSID()); 642 result.put("mac_address", data.getMacAddress()); 643 // Trim the double quotes if exist 644 String ssid = data.getSSID(); 645 if (ssid.charAt(0) == '"' 646 && ssid.charAt(ssid.length() - 1) == '"') { 647 result.put("SSID", ssid.substring(1, ssid.length() - 1)); 648 } else { 649 result.put("SSID", ssid); 650 } 651 String supplicantState = ""; 652 switch (data.getSupplicantState()) { 653 case ASSOCIATED: 654 supplicantState = "associated"; 655 break; 656 case ASSOCIATING: 657 supplicantState = "associating"; 658 break; 659 case COMPLETED: 660 supplicantState = "completed"; 661 break; 662 case DISCONNECTED: 663 supplicantState = "disconnected"; 664 break; 665 case DORMANT: 666 supplicantState = "dormant"; 667 break; 668 case FOUR_WAY_HANDSHAKE: 669 supplicantState = "four_way_handshake"; 670 break; 671 case GROUP_HANDSHAKE: 672 supplicantState = "group_handshake"; 673 break; 674 case INACTIVE: 675 supplicantState = "inactive"; 676 break; 677 case INVALID: 678 supplicantState = "invalid"; 679 break; 680 case SCANNING: 681 supplicantState = "scanning"; 682 break; 683 case UNINITIALIZED: 684 supplicantState = "uninitialized"; 685 break; 686 default: 687 supplicantState = null; 688 } 689 result.put("supplicant_state", build(supplicantState)); 690 result.put("is_5ghz", data.is5GHz()); 691 result.put("is_24ghz", data.is24GHz()); 692 return result; 693 } 694 buildNeighboringCellInfo(NeighboringCellInfo data)695 private static JSONObject buildNeighboringCellInfo(NeighboringCellInfo data) 696 throws JSONException { 697 JSONObject result = new JSONObject(); 698 result.put("cid", data.getCid()); 699 result.put("rssi", data.getRssi()); 700 result.put("lac", data.getLac()); 701 result.put("psc", data.getPsc()); 702 String networkType = TelephonyUtils.getNetworkTypeString(data.getNetworkType()); 703 result.put("network_type", build(networkType)); 704 return result; 705 } 706 buildCellInfoLte(CellInfoLte data)707 private static JSONObject buildCellInfoLte(CellInfoLte data) 708 throws JSONException { 709 JSONObject result = new JSONObject(); 710 result.put("rat", "lte"); 711 result.put("registered", data.isRegistered()); 712 CellIdentityLte cellidentity = ((CellInfoLte) data).getCellIdentity(); 713 CellSignalStrengthLte signalstrength = ((CellInfoLte) data).getCellSignalStrength(); 714 result.put("mcc", cellidentity.getMcc()); 715 result.put("mnc", cellidentity.getMnc()); 716 result.put("cid", cellidentity.getCi()); 717 result.put("pcid", cellidentity.getPci()); 718 result.put("tac", cellidentity.getTac()); 719 result.put("rsrp", signalstrength.getDbm()); 720 result.put("asulevel", signalstrength.getAsuLevel()); 721 result.put("timing_advance", signalstrength.getTimingAdvance()); 722 return result; 723 } 724 buildCellInfoGsm(CellInfoGsm data)725 private static JSONObject buildCellInfoGsm(CellInfoGsm data) 726 throws JSONException { 727 JSONObject result = new JSONObject(); 728 result.put("rat", "gsm"); 729 result.put("registered", data.isRegistered()); 730 CellIdentityGsm cellidentity = ((CellInfoGsm) data).getCellIdentity(); 731 CellSignalStrengthGsm signalstrength = ((CellInfoGsm) data).getCellSignalStrength(); 732 result.put("mcc", cellidentity.getMcc()); 733 result.put("mnc", cellidentity.getMnc()); 734 result.put("cid", cellidentity.getCid()); 735 result.put("lac", cellidentity.getLac()); 736 result.put("signal_strength", signalstrength.getDbm()); 737 result.put("asulevel", signalstrength.getAsuLevel()); 738 return result; 739 } 740 buildCellInfoWcdma(CellInfoWcdma data)741 private static JSONObject buildCellInfoWcdma(CellInfoWcdma data) 742 throws JSONException { 743 JSONObject result = new JSONObject(); 744 result.put("rat", "wcdma"); 745 result.put("registered", data.isRegistered()); 746 CellIdentityWcdma cellidentity = ((CellInfoWcdma) data).getCellIdentity(); 747 CellSignalStrengthWcdma signalstrength = ((CellInfoWcdma) data).getCellSignalStrength(); 748 result.put("mcc", cellidentity.getMcc()); 749 result.put("mnc", cellidentity.getMnc()); 750 result.put("cid", cellidentity.getCid()); 751 result.put("lac", cellidentity.getLac()); 752 result.put("psc", cellidentity.getPsc()); 753 result.put("signal_strength", signalstrength.getDbm()); 754 result.put("asulevel", signalstrength.getAsuLevel()); 755 return result; 756 } 757 buildCellInfoCdma(CellInfoCdma data)758 private static JSONObject buildCellInfoCdma(CellInfoCdma data) 759 throws JSONException { 760 JSONObject result = new JSONObject(); 761 result.put("rat", "cdma"); 762 result.put("registered", data.isRegistered()); 763 CellIdentityCdma cellidentity = ((CellInfoCdma) data).getCellIdentity(); 764 CellSignalStrengthCdma signalstrength = ((CellInfoCdma) data).getCellSignalStrength(); 765 result.put("network_id", cellidentity.getNetworkId()); 766 result.put("system_id", cellidentity.getSystemId()); 767 result.put("basestation_id", cellidentity.getBasestationId()); 768 result.put("longitude", cellidentity.getLongitude()); 769 result.put("latitude", cellidentity.getLatitude()); 770 result.put("cdma_dbm", signalstrength.getCdmaDbm()); 771 result.put("cdma_ecio", signalstrength.getCdmaEcio()); 772 result.put("evdo_dbm", signalstrength.getEvdoDbm()); 773 result.put("evdo_ecio", signalstrength.getEvdoEcio()); 774 result.put("evdo_snr", signalstrength.getEvdoSnr()); 775 return result; 776 } 777 buildHttpURLConnection(HttpURLConnection data)778 private static Object buildHttpURLConnection(HttpURLConnection data) 779 throws JSONException { 780 JSONObject con = new JSONObject(); 781 try { 782 con.put("ResponseCode", data.getResponseCode()); 783 con.put("ResponseMessage", data.getResponseMessage()); 784 } catch (IOException e) { 785 e.printStackTrace(); 786 return con; 787 } 788 con.put("ContentLength", data.getContentLength()); 789 con.put("ContentEncoding", data.getContentEncoding()); 790 con.put("ContentType", data.getContentType()); 791 con.put("Date", data.getDate()); 792 con.put("ReadTimeout", data.getReadTimeout()); 793 con.put("HeaderFields", buildJsonMap(data.getHeaderFields())); 794 con.put("URL", buildURL(data.getURL())); 795 return con; 796 } 797 buildNetwork(Network data)798 private static Object buildNetwork(Network data) throws JSONException { 799 JSONObject nw = new JSONObject(); 800 nw.put("netId", data.netId); 801 return nw; 802 } 803 buildNetworkInfo(NetworkInfo data)804 private static Object buildNetworkInfo(NetworkInfo data) 805 throws JSONException { 806 JSONObject info = new JSONObject(); 807 info.put("isAvailable", data.isAvailable()); 808 info.put("isConnected", data.isConnected()); 809 info.put("isFailover", data.isFailover()); 810 info.put("isRoaming", data.isRoaming()); 811 info.put("ExtraInfo", data.getExtraInfo()); 812 info.put("FailedReason", data.getReason()); 813 info.put("TypeName", data.getTypeName()); 814 info.put("SubtypeName", data.getSubtypeName()); 815 info.put("State", data.getState().name().toString()); 816 return info; 817 } 818 buildURL(URL data)819 private static Object buildURL(URL data) throws JSONException { 820 JSONObject url = new JSONObject(); 821 url.put("Authority", data.getAuthority()); 822 url.put("Host", data.getHost()); 823 url.put("Path", data.getPath()); 824 url.put("Port", data.getPort()); 825 url.put("Protocol", data.getProtocol()); 826 return url; 827 } 828 buildPhoneAccount(PhoneAccount data)829 private static JSONObject buildPhoneAccount(PhoneAccount data) 830 throws JSONException { 831 JSONObject acct = new JSONObject(); 832 acct.put("Address", data.getAddress().toSafeString()); 833 acct.put("SubscriptionAddress", data.getSubscriptionAddress() 834 .toSafeString()); 835 acct.put("Label", ((data.getLabel() != null) ? data.getLabel().toString() : "")); 836 acct.put("ShortDescription", ((data.getShortDescription() != null) ? data 837 .getShortDescription().toString() : "")); 838 return acct; 839 } 840 buildPhoneAccountHandle(PhoneAccountHandle data)841 private static Object buildPhoneAccountHandle(PhoneAccountHandle data) 842 throws JSONException { 843 JSONObject msg = new JSONObject(); 844 msg.put("id", data.getId()); 845 msg.put("ComponentName", data.getComponentName().flattenToString()); 846 return msg; 847 } 848 buildSubscriptionInfoRecord(SubscriptionInfo data)849 private static Object buildSubscriptionInfoRecord(SubscriptionInfo data) 850 throws JSONException { 851 JSONObject msg = new JSONObject(); 852 msg.put("subscriptionId", data.getSubscriptionId()); 853 msg.put("iccId", data.getIccId()); 854 msg.put("simSlotIndex", data.getSimSlotIndex()); 855 msg.put("displayName", data.getDisplayName()); 856 msg.put("nameSource", data.getNameSource()); 857 msg.put("iconTint", data.getIconTint()); 858 msg.put("number", data.getNumber()); 859 msg.put("dataRoaming", data.getDataRoaming()); 860 msg.put("mcc", data.getMcc()); 861 msg.put("mnc", data.getMnc()); 862 return msg; 863 } 864 buildPoint(Point data)865 private static Object buildPoint(Point data) throws JSONException { 866 JSONObject point = new JSONObject(); 867 point.put("x", data.x); 868 point.put("y", data.y); 869 return point; 870 } 871 buildRttCapabilities(RttCapabilities data)872 private static Object buildRttCapabilities(RttCapabilities data) 873 throws JSONException { 874 JSONObject cap = new JSONObject(); 875 cap.put("bwSupported", data.bwSupported); 876 cap.put("lciSupported", data.lciSupported); 877 cap.put("lcrSupported", data.lcrSupported); 878 cap.put("oneSidedRttSupported", data.oneSidedRttSupported); 879 cap.put("preambleSupported", data.preambleSupported); 880 cap.put("twoSided11McRttSupported", data.twoSided11McRttSupported); 881 return cap; 882 } 883 buildSmsMessage(SmsMessage data)884 private static Object buildSmsMessage(SmsMessage data) throws JSONException { 885 JSONObject msg = new JSONObject(); 886 msg.put("originatingAddress", data.getOriginatingAddress()); 887 msg.put("messageBody", data.getMessageBody()); 888 return msg; 889 } 890 buildWifiActivityEnergyInfo( WifiActivityEnergyInfo data)891 private static JSONObject buildWifiActivityEnergyInfo( 892 WifiActivityEnergyInfo data) throws JSONException { 893 JSONObject result = new JSONObject(); 894 result.put("ControllerEnergyUsed", data.getControllerEnergyUsed()); 895 result.put("ControllerIdleTimeMillis", 896 data.getControllerIdleTimeMillis()); 897 result.put("ControllerRxTimeMillis", data.getControllerRxTimeMillis()); 898 result.put("ControllerTxTimeMillis", data.getControllerTxTimeMillis()); 899 result.put("StackState", data.getStackState()); 900 result.put("TimeStamp", data.getTimeStamp()); 901 return result; 902 } 903 buildWifiChannel(WifiChannel data)904 private static Object buildWifiChannel(WifiChannel data) throws JSONException { 905 JSONObject channel = new JSONObject(); 906 channel.put("channelNum", data.channelNum); 907 channel.put("freqMHz", data.freqMHz); 908 channel.put("isDFS", data.isDFS); 909 channel.put("isValid", data.isValid()); 910 return channel; 911 } 912 buildWifiConfiguration(WifiConfiguration data)913 private static Object buildWifiConfiguration(WifiConfiguration data) 914 throws JSONException { 915 JSONObject config = new JSONObject(); 916 config.put("networkId", data.networkId); 917 // Trim the double quotes if exist 918 if (data.SSID.charAt(0) == '"' 919 && data.SSID.charAt(data.SSID.length() - 1) == '"') { 920 config.put("SSID", data.SSID.substring(1, data.SSID.length() - 1)); 921 } else { 922 config.put("SSID", data.SSID); 923 } 924 config.put("BSSID", data.BSSID); 925 config.put("priority", data.priority); 926 config.put("hiddenSSID", data.hiddenSSID); 927 config.put("FQDN", data.FQDN); 928 config.put("providerFriendlyName", data.providerFriendlyName); 929 config.put("isPasspoint", data.isPasspoint()); 930 config.put("hiddenSSID", data.hiddenSSID); 931 if (data.status == WifiConfiguration.Status.CURRENT) { 932 config.put("status", "CURRENT"); 933 } else if (data.status == WifiConfiguration.Status.DISABLED) { 934 config.put("status", "DISABLED"); 935 } else if (data.status == WifiConfiguration.Status.ENABLED) { 936 config.put("status", "ENABLED"); 937 } else { 938 config.put("status", "UNKNOWN"); 939 } 940 // config.put("enterpriseConfig", buildWifiEnterpriseConfig(data.enterpriseConfig)); 941 return config; 942 } 943 buildWifiEnterpriseConfig(WifiEnterpriseConfig data)944 private static Object buildWifiEnterpriseConfig(WifiEnterpriseConfig data) 945 throws JSONException, CertificateEncodingException { 946 JSONObject config = new JSONObject(); 947 config.put(WifiEnterpriseConfig.PLMN_KEY, data.getPlmn()); 948 config.put(WifiEnterpriseConfig.REALM_KEY, data.getRealm()); 949 config.put(WifiEnterpriseConfig.EAP_KEY, data.getEapMethod()); 950 config.put(WifiEnterpriseConfig.PHASE2_KEY, data.getPhase2Method()); 951 config.put(WifiEnterpriseConfig.ALTSUBJECT_MATCH_KEY, data.getAltSubjectMatch()); 952 X509Certificate caCert = data.getCaCertificate(); 953 String caCertString = Base64.encodeToString(caCert.getEncoded(), Base64.DEFAULT); 954 config.put(WifiEnterpriseConfig.CA_CERT_KEY, caCertString); 955 X509Certificate clientCert = data.getClientCertificate(); 956 String clientCertString = Base64.encodeToString(clientCert.getEncoded(), Base64.DEFAULT); 957 config.put(WifiEnterpriseConfig.CLIENT_CERT_KEY, clientCertString); 958 PrivateKey pk = data.getClientPrivateKey(); 959 String privateKeyString = Base64.encodeToString(pk.getEncoded(), Base64.DEFAULT); 960 config.put(WifiEnterpriseConfig.PRIVATE_KEY_ID_KEY, privateKeyString); 961 config.put(WifiEnterpriseConfig.PASSWORD_KEY, data.getPassword()); 962 return config; 963 } 964 buildWifiP2pDevice(WifiP2pDevice data)965 private static JSONObject buildWifiP2pDevice(WifiP2pDevice data) 966 throws JSONException { 967 JSONObject deviceInfo = new JSONObject(); 968 deviceInfo.put("Name", data.deviceName); 969 deviceInfo.put("Address", data.deviceAddress); 970 return deviceInfo; 971 } 972 buildWifiP2pGroup(WifiP2pGroup data)973 private static JSONObject buildWifiP2pGroup(WifiP2pGroup data) 974 throws JSONException { 975 JSONObject group = new JSONObject(); 976 Log.d("build p2p group."); 977 group.put("ClientList", build(data.getClientList())); 978 group.put("Interface", data.getInterface()); 979 group.put("Networkname", data.getNetworkName()); 980 group.put("Owner", data.getOwner()); 981 group.put("Passphrase", data.getPassphrase()); 982 group.put("NetworkId", data.getNetworkId()); 983 return group; 984 } 985 buildWifiP2pInfo(WifiP2pInfo data)986 private static JSONObject buildWifiP2pInfo(WifiP2pInfo data) 987 throws JSONException { 988 JSONObject info = new JSONObject(); 989 Log.d("build p2p info."); 990 info.put("groupFormed", data.groupFormed); 991 info.put("isGroupOwner", data.isGroupOwner); 992 info.put("groupOwnerAddress", data.groupOwnerAddress); 993 return info; 994 } 995 buildCallEvent(InCallServiceImpl.CallEvent<T> callEvent)996 private static <T> JSONObject buildCallEvent(InCallServiceImpl.CallEvent<T> callEvent) 997 throws JSONException { 998 JSONObject jsonEvent = new JSONObject(); 999 jsonEvent.put("CallId", callEvent.getCallId()); 1000 jsonEvent.put("Event", build(callEvent.getEvent())); 1001 return jsonEvent; 1002 } 1003 buildUri(Uri uri)1004 private static JSONObject buildUri(Uri uri) throws JSONException { 1005 return new JSONObject().put("Uri", build((uri != null) ? uri.toString() : "")); 1006 } 1007 buildCallDetails(Call.Details details)1008 private static JSONObject buildCallDetails(Call.Details details) throws JSONException { 1009 1010 JSONObject callDetails = new JSONObject(); 1011 1012 callDetails.put("Handle", buildUri(details.getHandle())); 1013 callDetails.put("HandlePresentation", 1014 build(InCallServiceImpl.getCallPresentationInfoString( 1015 details.getHandlePresentation()))); 1016 callDetails.put("CallerDisplayName", build(details.getCallerDisplayName())); 1017 1018 // TODO AccountHandle 1019 // callDetails.put("AccountHandle", build("")); 1020 1021 callDetails.put("Capabilities", 1022 build(InCallServiceImpl.getCallCapabilitiesString(details.getCallCapabilities()))); 1023 1024 callDetails.put("Properties", 1025 build(InCallServiceImpl.getCallPropertiesString(details.getCallProperties()))); 1026 1027 // TODO Parse fields in Disconnect Cause 1028 callDetails.put("DisconnectCause", build((details.getDisconnectCause() != null) ? details 1029 .getDisconnectCause().toString() : "")); 1030 callDetails.put("ConnectTimeMillis", build(details.getConnectTimeMillis())); 1031 1032 // TODO: GatewayInfo 1033 // callDetails.put("GatewayInfo", build("")); 1034 1035 callDetails.put("VideoState", 1036 build(InCallServiceImpl.getVideoCallStateString(details.getVideoState()))); 1037 1038 // TODO: StatusHints 1039 // callDetails.put("StatusHints", build("")); 1040 1041 callDetails.put("Extras", build(details.getExtras())); 1042 1043 return callDetails; 1044 } 1045 buildCall(Call call)1046 private static JSONObject buildCall(Call call) throws JSONException { 1047 1048 JSONObject callInfo = new JSONObject(); 1049 1050 callInfo.put("Parent", build(InCallServiceImpl.getCallId(call))); 1051 1052 // TODO:Make a function out of this for consistency 1053 ArrayList<String> children = new ArrayList<String>(); 1054 for (Call child : call.getChildren()) { 1055 children.add(InCallServiceImpl.getCallId(child)); 1056 } 1057 callInfo.put("Children", build(children)); 1058 1059 // TODO:Make a function out of this for consistency 1060 ArrayList<String> conferenceables = new ArrayList<String>(); 1061 for (Call conferenceable : call.getChildren()) { 1062 children.add(InCallServiceImpl.getCallId(conferenceable)); 1063 } 1064 callInfo.put("ConferenceableCalls", build(conferenceables)); 1065 1066 callInfo.put("State", build(InCallServiceImpl.getCallStateString(call.getState()))); 1067 callInfo.put("CannedTextResponses", build(call.getCannedTextResponses())); 1068 callInfo.put("VideoCall", InCallServiceImpl.getVideoCallId(call.getVideoCall())); 1069 callInfo.put("Details", build(call.getDetails())); 1070 1071 return callInfo; 1072 } 1073 buildVideoProfile(VideoProfile videoProfile)1074 private static JSONObject buildVideoProfile(VideoProfile videoProfile) throws JSONException { 1075 JSONObject profile = new JSONObject(); 1076 1077 profile.put("VideoState", 1078 InCallServiceImpl.getVideoCallStateString(videoProfile.getVideoState())); 1079 profile.put("VideoQuality", 1080 InCallServiceImpl.getVideoCallQualityString(videoProfile.getQuality())); 1081 1082 return profile; 1083 } 1084 buildCameraCapabilities(CameraCapabilities cameraCapabilities)1085 private static JSONObject buildCameraCapabilities(CameraCapabilities cameraCapabilities) 1086 throws JSONException { 1087 JSONObject capabilities = new JSONObject(); 1088 1089 capabilities.put("Height", build(cameraCapabilities.getHeight())); 1090 capabilities.put("Width", build(cameraCapabilities.getWidth())); 1091 capabilities.put("ZoomSupported", build(cameraCapabilities.isZoomSupported())); 1092 capabilities.put("MaxZoom", build(cameraCapabilities.getMaxZoom())); 1093 1094 return capabilities; 1095 } 1096 buildVoLteServiceStateEvent( VoLteServiceState volteInfo)1097 private static JSONObject buildVoLteServiceStateEvent( 1098 VoLteServiceState volteInfo) 1099 throws JSONException { 1100 JSONObject info = new JSONObject(); 1101 info.put(TelephonyConstants.VoLteServiceStateContainer.SRVCC_STATE, 1102 TelephonyUtils.getSrvccStateString(volteInfo.getSrvccState())); 1103 return info; 1104 } 1105 buildLegacyVpnInfo(LegacyVpnInfo data)1106 private static JSONObject buildLegacyVpnInfo(LegacyVpnInfo data) throws JSONException { 1107 JSONObject info = new JSONObject(); 1108 if (data == null) { 1109 return info; 1110 } 1111 info.put("state", data.state); 1112 info.put("key", data.key); 1113 String intentStr = ""; 1114 if (data.intent != null) { 1115 intentStr = data.intent.toString(); 1116 } 1117 info.put("intent", intentStr); 1118 return info; 1119 } 1120 buildModemActivityInfo(ModemActivityInfo modemInfo)1121 private static JSONObject buildModemActivityInfo(ModemActivityInfo modemInfo) 1122 throws JSONException { 1123 JSONObject info = new JSONObject(); 1124 1125 info.put("Timestamp", modemInfo.getTimestamp()); 1126 info.put("SleepTimeMs", modemInfo.getSleepTimeMillis()); 1127 info.put("IdleTimeMs", modemInfo.getIdleTimeMillis()); 1128 // convert from int[] to List<Integer> for proper JSON translation 1129 int[] txTimes = modemInfo.getTxTimeMillis(); 1130 List<Integer> tmp = new ArrayList<Integer>(txTimes.length); 1131 for (int val : txTimes) { 1132 tmp.add(val); 1133 } 1134 info.put("TxTimeMs", build(tmp)); 1135 info.put("RxTimeMs", modemInfo.getRxTimeMillis()); 1136 info.put("EnergyUsedMw", modemInfo.getEnergyUsed()); 1137 return info; 1138 } 1139 buildSignalStrength(SignalStrength signalStrength)1140 private static JSONObject buildSignalStrength(SignalStrength signalStrength) 1141 throws JSONException { 1142 JSONObject info = new JSONObject(); 1143 info.put(TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_GSM, 1144 signalStrength.getGsmSignalStrength()); 1145 info.put( 1146 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_GSM_DBM, 1147 signalStrength.getGsmDbm()); 1148 info.put( 1149 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_GSM_LEVEL, 1150 signalStrength.getGsmLevel()); 1151 info.put( 1152 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_GSM_ASU_LEVEL, 1153 signalStrength.getGsmAsuLevel()); 1154 info.put( 1155 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_GSM_BIT_ERROR_RATE, 1156 signalStrength.getGsmBitErrorRate()); 1157 info.put( 1158 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_CDMA_DBM, 1159 signalStrength.getCdmaDbm()); 1160 info.put( 1161 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_CDMA_LEVEL, 1162 signalStrength.getCdmaLevel()); 1163 info.put( 1164 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_CDMA_ASU_LEVEL, 1165 signalStrength.getCdmaAsuLevel()); 1166 info.put( 1167 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_CDMA_ECIO, 1168 signalStrength.getCdmaEcio()); 1169 info.put( 1170 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_EVDO_DBM, 1171 signalStrength.getEvdoDbm()); 1172 info.put( 1173 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_EVDO_ECIO, 1174 signalStrength.getEvdoEcio()); 1175 info.put(TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_LTE, 1176 signalStrength.getLteSignalStrength()); 1177 info.put( 1178 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_LTE_DBM, 1179 signalStrength.getLteDbm()); 1180 info.put( 1181 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_LTE_LEVEL, 1182 signalStrength.getLteLevel()); 1183 info.put( 1184 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_LTE_ASU_LEVEL, 1185 signalStrength.getLteAsuLevel()); 1186 info.put( 1187 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_LEVEL, 1188 signalStrength.getLevel()); 1189 info.put( 1190 TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_ASU_LEVEL, 1191 signalStrength.getAsuLevel()); 1192 info.put(TelephonyConstants.SignalStrengthContainer.SIGNAL_STRENGTH_DBM, 1193 signalStrength.getDbm()); 1194 return info; 1195 } 1196 JsonBuilder()1197 private JsonBuilder() { 1198 // This is a utility class. 1199 } 1200 } 1201