package io.nlopez.smartlocation.location.providers; import android.content.Context; import android.location.Location; import android.os.Bundle; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import io.nlopez.smartlocation.OnLocationUpdatedListener; import io.nlopez.smartlocation.location.LocationProvider; import io.nlopez.smartlocation.location.config.LocationParams; import io.nlopez.smartlocation.utils.GooglePlayServicesListener; import io.nlopez.smartlocation.utils.Logger; /** * Created by mrm on 20/12/14. */ public class LocationGooglePlayServicesWithFallbackProvider implements LocationProvider, GooglePlayServicesListener { private Logger logger; private OnLocationUpdatedListener listener; private boolean shouldStart = false; private Context context; private LocationParams params; private boolean singleUpdate = false; private LocationProvider provider; public LocationGooglePlayServicesWithFallbackProvider(Context context) { if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS) { provider = new LocationGooglePlayServicesProvider(this); } else { provider = new LocationManagerProvider(); } } @Override public void init(Context context, Logger logger) { this.logger = logger; this.context = context; logger.d("Currently selected provider = " + provider.getClass().getSimpleName()); provider.init(context, logger); } @Override public void start(OnLocationUpdatedListener listener, LocationParams params, boolean singleUpdate) { shouldStart = true; this.listener = listener; this.params = params; this.singleUpdate = singleUpdate; provider.start(listener, params, singleUpdate); } @Override public void stop() { provider.stop(); shouldStart = false; } @Override public Location getLastLocation() { return provider.getLastLocation(); } @Override public void onConnected(Bundle bundle) { // Nothing to do here } @Override public void onConnectionSuspended(int i) { fallbackToLocationManager(); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { fallbackToLocationManager(); } private void fallbackToLocationManager() { logger.d("FusedLocationProvider not working, falling back and using LocationManager"); provider = new LocationManagerProvider(); provider.init(context, logger); if (shouldStart) { provider.start(listener, params, singleUpdate); } } }