Example usage for com.google.common.io.protocol ProtoBuf has

List of usage examples for com.google.common.io.protocol ProtoBuf has

Introduction

In this page you can find the example usage for com.google.common.io.protocol ProtoBuf has.

Prototype

public boolean has(int tag) 

Source Link

Document

Convenience method for determining whether a tag has a value.

Usage

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");
    }
}