/*******************************************************************************
* Created by Orlando Aliaga
* Copyright 2015 Prey Inc. All rights reserved.
* License: GPLv3
* Full license at "/LICENSE"
******************************************************************************/
package com.prey.actions.location;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.os.Looper;
import android.support.v4.app.ActivityCompat;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.prey.PreyConfig;
import com.prey.PreyLogger;
import com.prey.json.UtilJson;
import com.prey.net.PreyWebServices;
import java.text.DateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class PreyGooglePlayServiceLocation implements
ConnectionCallbacks, OnConnectionFailedListener, LocationListener {
protected GoogleApiClient mGoogleApiClient;
protected LocationRequest mLocationRequest;
protected Location mCurrentLocation;
protected String mLastUpdateTime;
protected Boolean mRequestingLocationUpdates;
private Context ctx;
public void init(Context ctx) {
this.ctx = ctx;
PreyLogger.d("init");
mCurrentLocation = null;
mLastUpdateTime = null;
mRequestingLocationUpdates = false;
buildGoogleApiClient();
}
public Location getLastLocation(Context ctx) {
return mCurrentLocation;
}
public static final int GOOGLE_API_CLIENT_TIMEOUT_S = 10;
public static final String GOOGLE_API_CLIENT_ERROR_MSG =
"Failed to connect to GoogleApiClient (error code = %d)";
protected synchronized void buildGoogleApiClient() {
PreyLogger.d("Building GoogleApiClient");
mGoogleApiClient = new GoogleApiClient.Builder(ctx)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
ConnectionResult connectionResult = mGoogleApiClient.blockingConnect(
GOOGLE_API_CLIENT_TIMEOUT_S, TimeUnit.SECONDS);
if (connectionResult.isSuccess() && mGoogleApiClient.isConnected()) {
createLocationRequest();
startLocationUpdates();
} else {
PreyLogger.i(String.format(GOOGLE_API_CLIENT_ERROR_MSG,
connectionResult.getErrorCode()));
}
}
protected void createLocationRequest() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(PreyConfig.UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setFastestInterval(PreyConfig.FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setPriority(PreyConfig.LOCATION_PRIORITY_HIGHT);
}
@Override
public void onConnected(Bundle connectionHint) {
PreyLogger.d("Connected to GoogleApiClient");
}
@Override
public void onLocationChanged(Location location) {
PreyLogger.d("onLocationChanged");
mCurrentLocation = location;
if (location != null) {
mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
PreyLogger.d("latitude:" + location.getLatitude() + " longitude:" + location.getLongitude() + " accuracy:" + location.getAccuracy());
stopLocationUpdates();
}
}
protected void stopLocationUpdates() {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
}
@Override
public void onConnectionSuspended(int cause) {
PreyLogger.d("Connection suspended");
mGoogleApiClient.connect();
}
@Override
public void onConnectionFailed(ConnectionResult result) {
PreyLogger.d("Connection failed: ConnectionResult.getErrorCode() = " + result.getErrorCode());
}
protected void startLocationUpdates() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M
|| (ActivityCompat.checkSelfPermission(ctx, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(ctx, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)) {
try {
Looper.prepare();
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mLocationRequest, this);
Looper.loop();
}catch (Exception e){
PreyLogger.d("Error startLocationUpdates: "+e.getMessage());
}
}
}
}