package org.witness.informacam.informa.suckers; import org.witness.informacam.models.j3m.ILogPack; import org.witness.informacam.utils.Constants.Suckers; import org.witness.informacam.utils.Constants.Suckers.Geo; import android.content.Context; import android.location.Criteria; import android.location.Location; import android.os.Bundle; import android.util.Log; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks; import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener; import com.google.android.gms.location.LocationClient; import com.google.android.gms.location.LocationListener; import com.google.android.gms.location.LocationRequest; public class GeoFusedSucker extends GeoSucker implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener { Criteria criteria; long currentNmeaTime; private final static String LOG = Suckers.LOG; private LocationClient mLocationClient; private LocationRequest mLocationRequest; private Location mLastLocation = null; private int mLocationPriority = LocationRequest.PRIORITY_HIGH_ACCURACY; @SuppressWarnings("unchecked") public GeoFusedSucker(Context context) { super(context); setSucker(this); mLocationClient = new LocationClient(context, this, this); mLocationClient.connect(); } public void setLocationPriority (int newPriority) { mLocationPriority = newPriority; } public ILogPack forceReturn() { double[] loc = updateLocation(); if(loc == null) { Log.d(LOG, "location was null"); loc = new double[] {0d, 0d}; } ILogPack iLogPack = new ILogPack(Geo.Keys.GPS_COORDS, "[" + loc[0] + "," + loc[1] + "]"); if (mLastLocation != null){ try { if (mLastLocation.hasAccuracy()) iLogPack.put(Geo.Keys.GPS_ACCURACY, mLastLocation.getAccuracy()+""); if (mLastLocation.hasAltitude()) iLogPack.put(Geo.Keys.GPS_ALTITUDE, mLastLocation.getAltitude()+""); if (mLastLocation.hasSpeed()) iLogPack.put(Geo.Keys.GPS_SPEED, mLastLocation.getSpeed()+""); if (mLastLocation.hasBearing()) iLogPack.put(Geo.Keys.GPS_BEARING, mLastLocation.getBearing()+""); iLogPack.put(Geo.Keys.GPS_TIME, mLastLocation.getTime()+""); } catch (Exception e) { Log.d(LOG,"json exception in location data",e); } } return iLogPack; } public long getTime() { if (mLastLocation != null) return mLastLocation.getTime(); else return 0; } public double[] updateLocation() { if (mLastLocation != null) { return new double[] {mLastLocation.getLatitude(),mLastLocation.getLongitude()}; } /** //TODO don't get the last location, as that can be old and cached else { if (mLocationClient.isConnected()) { mLastLocation = mLocationClient.getLastLocation(); if (mLastLocation != null) return new double[] {mLastLocation.getLatitude(),mLastLocation.getLongitude()}; } }*/ //nothing here right now return null; } public void stopUpdates() { if (mLocationClient != null && mLocationClient.isConnected()) mLocationClient.disconnect(); } @Override public void onConnectionFailed(ConnectionResult arg0) { Log.w(LOG,"location connect failed: " + arg0.getErrorCode() + "=" + arg0.toString()); } @Override public void onConnected(Bundle arg0) { mLocationRequest = LocationRequest.create(); mLocationRequest.setInterval(Geo.LOG_RATE); mLocationRequest.setPriority(mLocationPriority); mLocationClient.requestLocationUpdates(mLocationRequest, this); } @Override public void onDisconnected() { stopUpdates (); } @Override public void onLocationChanged(Location location) { mLastLocation = location; if(mLastLocation != null) { ILogPack iLogPack = forceReturn(); if (iLogPack != null) sendToBuffer(iLogPack); } } }