package com.mapzen.android.lost.internal;
import com.mapzen.android.lost.api.LocationAvailability;
import com.mapzen.android.lost.api.LocationRequest;
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.os.Looper;
import android.support.annotation.RequiresPermission;
import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
/**
* Base class for {@link com.mapzen.android.lost.internal.FusionEngine} and
* {@link com.mapzen.android.lost.internal.MockEngine} classes.
*/
public abstract class LocationEngine {
private final Context context;
private final Callback callback;
private LocationRequestUnbundled request;
public LocationEngine(Context context, Callback callback) {
this.context = context;
this.callback = callback;
request = new LocationRequestUnbundled();
}
/**
* Return most best recent location available.
*/
public abstract Location getLastLocation();
public abstract boolean isProviderEnabled(String provider);
/**
* Enables the engine on receiving a valid location request. Disables the engine on receiving a
* {@code null} request.
*
* @param request Valid location request to enable or {@code null} to disable.
*/
public void setRequest(LocationRequest request) {
if (request != null) {
this.request.addRequest(request);
enable();
} else {
this.request.removeAllRequests();
disable();
}
}
/**
* Subclass should perform all operations required to enable the engine. (ex. Register for
* location updates.)
*/
protected abstract void enable();
/**
* Subclass should perform all operations required to disable the engine. (ex. Remove location
* updates.)
*/
protected abstract void disable();
protected Context getContext() {
return context;
}
protected Looper getLooper() {
return context.getMainLooper();
}
protected Callback getCallback() {
return callback;
}
protected LocationRequestUnbundled getRequest() {
return request;
}
@RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
protected LocationAvailability createLocationAvailability() {
LocationManager locationManager = (LocationManager) context.getSystemService(
Context.LOCATION_SERVICE);
boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
boolean networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
boolean gpsLocationExists = locationManager.getLastKnownLocation(
LocationManager.GPS_PROVIDER) != null;
boolean networkLocationExists = locationManager.getLastKnownLocation(
LocationManager.NETWORK_PROVIDER) != null;
return new LocationAvailability((gpsEnabled && gpsLocationExists)
|| (networkEnabled && networkLocationExists));
}
public interface Callback {
void reportLocation(Location location);
void reportProviderDisabled(String provider);
void reportProviderEnabled(String provider);
}
}