package com.pennapps.labs.pennmobile.classes;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationProvider;
import android.os.Bundle;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.model.LatLng;
public class MapCallbacks implements LocationListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
public LatLng latLng;
public GoogleApiClient mGoogleApiClient;
public LocationRequest mLocationRequest;
public boolean waiting, called, connected;
public static LatLng DEFAULT_LATLNG = new LatLng(39.9529, -75.197098);
public MapCallbacks() {
createLocationRequest();
called = false;
connected = false;
waiting = false;
}
protected void createLocationRequest() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10000);
mLocationRequest.setFastestInterval(5000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}
@Override
public void onConnected(Bundle bundle) {
Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (location == null) {
latLng = DEFAULT_LATLNG;
} else {
latLng = new LatLng(location.getLatitude(), location.getLongitude());
}
requestLocationUpdates();
waiting = false;
}
public void requestLocationUpdates(){
if (!called && connected) {
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest,
(com.google.android.gms.location.LocationListener) this);
}
called = true;
}
public void stopLocationUpdates() {
if (connected && called) {
LocationServices.FusedLocationApi.removeLocationUpdates(
mGoogleApiClient, (com.google.android.gms.location.LocationListener) this);
}
if (latLng == null) {
latLng = DEFAULT_LATLNG;
}
called = false;
}
@Override
public void onConnectionSuspended(int cause){
//handle cause later
if (latLng == null) {
latLng = DEFAULT_LATLNG;
}
waiting = false;
connected = false;
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
//handle connectionResult later
if (latLng == null) {
latLng = DEFAULT_LATLNG;
}
waiting = false;
}
public LatLng getLatLng(){
if(latLng == null){
return DEFAULT_LATLNG;
}
return latLng;
}
public GoogleApiClient getGoogleApiClient(){
return mGoogleApiClient;
}
public void setGoogleApiClient(GoogleApiClient mGoogleApiClient){
this.mGoogleApiClient = mGoogleApiClient;
}
@Override
public void onLocationChanged(Location location) {
if(location != null) {
latLng = new LatLng(location.getLatitude(), location.getLongitude());
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
if (status == LocationProvider.AVAILABLE) {
waiting = false;
requestLocationUpdates();
}
}
@Override
public void onProviderEnabled(String provider) {
if (waiting) {
requestLocationUpdates();
}
}
@Override
public void onProviderDisabled(String provider) {
stopLocationUpdates();
waiting = true;
}
}