Skip to content

Instantly share code, notes, and snippets.

@piyush-malaviya
Last active November 30, 2022 11:46
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save piyush-malaviya/463e7115a0051f765cdd404038d61cdd to your computer and use it in GitHub Desktop.
Save piyush-malaviya/463e7115a0051f765cdd404038d61cdd to your computer and use it in GitHub Desktop.
FusedLocationHelper class is used for requesting location for continuous location update or get only single time location update.
public class FusedLocationHelper implements GoogleApiClient.OnConnectionFailedListener, ResultCallback<Status> {
private static final String TAG = FusedLocationHelper.class.getSimpleName();
private Context context;
private GoogleApiClient googleApiClient;
private Location lastKnownLocation;
private LocationUpdateListener locationUpdateListener;
// location request parameter
private long interval = 0; // time in millisecond
private long fastestInterval = 0; // time in millisecond
private float smallestDisplacement = 0; // meter
private int priority = LocationRequest.PRIORITY_HIGH_ACCURACY;
private LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
Log.d(TAG, "onLocationChanged: " + location.toString());
if (locationUpdateListener != null) {
locationUpdateListener.onLocationUpdate(location);
}
}
};
private GoogleApiClient.ConnectionCallbacks continuousRequest = new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(Bundle bundle) {
Log.d(TAG, "ContinuousRequest : onConnected");
startLocationUpdates();
}
@Override
public void onConnectionSuspended(int cause) {
Log.d(TAG, "ContinuousRequest : onConnectionSuspended = " + cause);
}
};
private GoogleApiClient.ConnectionCallbacks singleRequest = new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(Bundle bundle) {
Log.d(TAG, "SingleRequest : onConnected");
getLastKnownLocation();
}
@Override
public void onConnectionSuspended(int cause) {
Log.d(TAG, "SingleRequest : onConnectionSuspended = " + cause);
}
};
public FusedLocationHelper(Context context) {
this.context = context;
}
public static boolean isLocationEnable(Context context) {
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.d(TAG, "onConnectionFailed : " + connectionResult.getErrorMessage());
}
private void setupGoogleApiClient(GoogleApiClient.ConnectionCallbacks connectionCallbacks) {
googleApiClient = new GoogleApiClient.Builder(context)
.addApi(LocationServices.API)
.addConnectionCallbacks(connectionCallbacks)
.addOnConnectionFailedListener(this)
.build();
googleApiClient.connect();
}
public FusedLocationHelper setInterval(long interval) {
this.interval = interval;
return this;
}
public FusedLocationHelper setFastestInterval(long fastestInterval) {
this.fastestInterval = fastestInterval;
return this;
}
public FusedLocationHelper setSmallestDisplacement(float smallestDisplacement) {
this.smallestDisplacement = smallestDisplacement;
return this;
}
public FusedLocationHelper setPriority(int priority) {
this.priority = priority;
return this;
}
public FusedLocationHelper setLocationUpdateListener(LocationUpdateListener locationUpdateListener) {
this.locationUpdateListener = locationUpdateListener;
return this;
}
public void stop() {
if (googleApiClient != null && googleApiClient.isConnected()) {
stopLocationUpdates();
googleApiClient.disconnect();
}
}
/**
* create location request
*
* @return instance of LocationRequest
*/
private LocationRequest createLocationRequest() {
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(interval);
mLocationRequest.setFastestInterval(fastestInterval);
mLocationRequest.setSmallestDisplacement(smallestDisplacement);
mLocationRequest.setPriority(priority);
return mLocationRequest;
}
public FusedLocationHelper requestSingleLocation() {
// set google api client
setupGoogleApiClient(singleRequest);
return this;
}
private void getLastKnownLocation() {
if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
lastKnownLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
if (lastKnownLocation != null) {
Log.d(TAG, "getLastKnownLocation : " + lastKnownLocation.toString());
if (locationUpdateListener != null) {
locationUpdateListener.onLocationUpdate(lastKnownLocation);
}
googleApiClient.disconnect();
} else {
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, createLocationRequest(), new LocationListener() {
@Override
public void onLocationChanged(Location location) {
Log.d(TAG, "getLastKnownLocation: onLocationChanged: " + location.toString());
if (locationUpdateListener != null) {
locationUpdateListener.onLocationUpdate(location);
}
LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this);
googleApiClient.disconnect();
}
});
}
}
public FusedLocationHelper requestContinuousLocation() {
// set google api client
setupGoogleApiClient(continuousRequest);
return this;
}
private void startLocationUpdates() {
if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, createLocationRequest(), locationListener);
pendingResult.setResultCallback(this);
}
private void stopLocationUpdates() {
if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, locationListener);
pendingResult.setResultCallback(this);
}
@Override
public void onResult(@NonNull Status status) {
Log.d(TAG, "PendingResult : " + status.getStatusMessage());
}
public interface LocationUpdateListener {
void onLocationUpdate(Location location);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment