List of usage examples for com.google.common.io.protocol ProtoBuf has
public boolean has(int tag)
From source file:com.codetastrophe.cellfinder.LocationFetcher.java
private void parseNetworkLocationReply(ProtoBuf response, LocationCallback callback) { if (response == null) { callback.Error("response is null"); return;/* w ww . j a va 2 s. c om*/ } int status1 = response.getInt(GLocReply.STATUS); if (status1 != ResponseCodes.STATUS_STATUS_SUCCESS) { callback.Error("RPC failed with status " + status1); return; } if (response.has(GLocReply.PLATFORM_KEY)) { String platformKey = response.getString(GLocReply.PLATFORM_KEY); if (!TextUtils.isEmpty(platformKey)) { setPlatformKey(platformKey); } } if (!response.has(GLocReply.REPLY_ELEMENTS)) { callback.Error("no ReplyElement"); return; } ProtoBuf replyElement = response.getProtoBuf(GLocReply.REPLY_ELEMENTS); int status2 = replyElement.getInt(GLocReplyElement.STATUS); if (status2 != ResponseCodes.STATUS_STATUS_SUCCESS && status2 != ResponseCodes.STATUS_STATUS_FAILED) { callback.Error("failed with status " + status2); return; } double lat = 0, lng = 0; int mcc = -1, mnc = -1, cid = -1, lac = -1; int locType = -1; int acc = -1, alt = 0; Log.d(TAG, "getNetworkLocation(): Number of prefetched entries " + replyElement.getCount(GLocReplyElement.DEVICE_LOCATION)); // most of the time there is only one response here, but loop through all of them // just in case one of them is the real tower location and not just the centroid for (int i = 0; i < replyElement.getCount(GLocReplyElement.DEVICE_LOCATION); i++) { ProtoBuf device = replyElement.getProtoBuf(GLocReplyElement.DEVICE_LOCATION, i); if (device.has(GDeviceLocation.LOCATION)) { ProtoBuf deviceLocation = device.getProtoBuf(GDeviceLocation.LOCATION); if (deviceLocation.has(GLocation.LAT_LNG)) { lat = deviceLocation.getProtoBuf(GLocation.LAT_LNG).getInt(GLatLng.LAT_E7) / E7; lng = deviceLocation.getProtoBuf(GLocation.LAT_LNG).getInt(GLatLng.LNG_E7) / E7; } if (deviceLocation.has(GLocation.ACCURACY)) { acc = deviceLocation.getInt(GLocation.ACCURACY); } if (deviceLocation.has(GLocation.ALTITUDE)) { alt = deviceLocation.getInt(GLocation.ALTITUDE); } if (deviceLocation.has(GLocation.LOC_TYPE)) { locType = deviceLocation.getInt(GLocation.LOC_TYPE); } } Log.d(TAG, String.format("lat %f lon %f locType %d", lat, lng, locType)); // get cell info if (device.has(GDeviceLocation.CELL)) { ProtoBuf deviceCell = device.getProtoBuf(GDeviceLocation.CELL); cid = deviceCell.getInt(GCell.CELLID); lac = deviceCell.getInt(GCell.LAC); if (deviceCell.has(GCell.MNC) && deviceCell.has(GCell.MCC)) { mcc = deviceCell.getInt(GCell.MCC); mnc = deviceCell.getInt(GCell.MNC); } } Log.d(TAG, String.format("mcc %d mnc %d lac %d cid %d lat %f lon %f locType %d", mcc, mnc, lac, cid, lat, lng, locType)); // if we have the actual tower location, break, otherwise keep going // just in case if (locType == GLocation.LOCTYPE_TOWER_LOCATION) { break; } } if (cid != -1 && lac != -1) { callback.GotLocation(lac, cid, mcc, mnc, lat, lng, alt, acc, locType); } else { callback.Error("no cell information"); } }