eleith
/
calchoochoo
Archived
1
0
Fork 0
This repository has been archived on 2020-11-15. You can view files and clone it, but cannot push or open issues or pull requests.
calchoochoo/app/src/main/java/com/eleith/calchoochoo/utils/DeviceLocation.java

153 lines
5.3 KiB
Java

package com.eleith.calchoochoo.utils;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import com.eleith.calchoochoo.utils.RxBusMessage.RxMessageKeys;
import com.eleith.calchoochoo.utils.RxBusMessage.RxMessageLocation;
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 javax.inject.Inject;
public class DeviceLocation
implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
com.google.android.gms.location.LocationListener,
ActivityCompat.OnRequestPermissionsResultCallback {
private RxBus rxBus;
private GoogleApiClient googleApiClient;
private Activity activity;
private int requestedUpdates = 0;
private int requestedLocation = 0;
private Boolean requestingUpdates = false;
@Inject
public DeviceLocation(RxBus rxBus, Activity activity) {
this.rxBus = rxBus;
this.activity = activity;
googleApiClient = new GoogleApiClient.Builder(activity).addApi(LocationServices.API).build();
googleApiClient.registerConnectionFailedListener(this);
googleApiClient.registerConnectionCallbacks(this);
}
private void connectGoogleApiClient() {
if (!googleApiClient.isConnected() && !googleApiClient.isConnecting()) {
googleApiClient.connect();
}
}
public void requestLocation() {
if (googleApiClient.isConnected()) {
if (android.os.Build.VERSION.SDK_INT >= 23) {
if (activity.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
sendLastLocation(location);
} else {
activity.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, Permissions.READ_GPS);
}
} else {
Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
sendLastLocation(location);
}
} else {
requestedLocation++;
connectGoogleApiClient();
}
}
public void listenForLocationUpdates() {
if (googleApiClient.isConnected()) {
if (android.os.Build.VERSION.SDK_INT >= 23) {
if (activity.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
if (!requestingUpdates) {
LocationRequest locationRequest = new LocationRequest();
locationRequest.setInterval(5000); //5 seconds
locationRequest.setFastestInterval(3000); //3 seconds
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this);
requestingUpdates = true;
}
} else {
activity.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, Permissions.READ_GPS);
}
} else {
if (!requestingUpdates) {
LocationRequest locationRequest = new LocationRequest();
locationRequest.setInterval(5000); //5 seconds
locationRequest.setFastestInterval(3000); //3 seconds
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this);
requestingUpdates = true;
}
}
} else {
requestedUpdates++;
connectGoogleApiClient();
}
}
public void stopListeningForLocationUpdates() {
requestingUpdates = false;
googleApiClient.disconnect();
}
@Override
public void onConnected(@Nullable Bundle bundle) {
if (requestedUpdates > 0) {
listenForLocationUpdates();
}
if (requestedLocation > 0) {
requestLocation();
}
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@Override
public void onLocationChanged(Location location) {
rxBus.send(new RxMessageLocation(RxMessageKeys.MY_LOCATION_UPDATE, location));
}
private void sendLastLocation(Location location) {
requestedLocation--;
if (requestedUpdates == 0 && !requestingUpdates && requestedLocation == 0) {
googleApiClient.disconnect();
}
rxBus.send(new RxMessageLocation(RxMessageKeys.MY_LOCATION, location));
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
switch (requestCode) {
case Permissions.READ_GPS: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (requestedUpdates > 0) {
listenForLocationUpdates();
} else if (requestedLocation > 0) {
requestLocation();
}
} else {
rxBus.send(new RxMessageLocation(RxMessageKeys.MY_LOCATION_UPDATE, null));
}
}
}
}
}