package io.nlopez.smartlocation.location.providers; import android.content.Context; import android.location.Location; import android.support.annotation.NonNull; import com.google.android.gms.location.DetectedActivity; import io.nlopez.smartlocation.OnActivityUpdatedListener; import io.nlopez.smartlocation.OnLocationUpdatedListener; import io.nlopez.smartlocation.activity.config.ActivityParams; import io.nlopez.smartlocation.activity.providers.ActivityGooglePlayServicesProvider; import io.nlopez.smartlocation.location.LocationProvider; import io.nlopez.smartlocation.location.config.LocationParams; import io.nlopez.smartlocation.utils.Logger; /** * Created by mrm on 20/12/14. */ public class LocationBasedOnActivityProvider implements LocationProvider, OnActivityUpdatedListener { private final ActivityGooglePlayServicesProvider activityProvider; private final LocationGooglePlayServicesProvider locationProvider; private final LocationBasedOnActivityListener locationBasedOnActivityListener; private OnLocationUpdatedListener locationUpdatedListener; private LocationParams locationParams; public LocationBasedOnActivityProvider(@NonNull LocationBasedOnActivityListener locationBasedOnActivityListener) { activityProvider = new ActivityGooglePlayServicesProvider(); locationProvider = new LocationGooglePlayServicesProvider(); this.locationBasedOnActivityListener = locationBasedOnActivityListener; } @Override public void init(Context context, Logger logger) { locationProvider.init(context, logger); activityProvider.init(context, logger); } @Override public void start(OnLocationUpdatedListener listener, LocationParams params, boolean singleUpdate) { if (singleUpdate) { throw new IllegalArgumentException("singleUpdate cannot be set to true"); } locationProvider.start(listener, params, false); activityProvider.start(this, ActivityParams.NORMAL); this.locationParams = params; this.locationUpdatedListener = listener; } @Override public void stop() { locationProvider.stop(); activityProvider.stop(); } @Override public Location getLastLocation() { return locationProvider.getLastLocation(); } @Override public void onActivityUpdated(DetectedActivity detectedActivity) { LocationParams params = locationBasedOnActivityListener.locationParamsForActivity(detectedActivity); if (params != null && locationParams != null && !locationParams.equals(params)) { start(locationUpdatedListener, params, false); } } public interface LocationBasedOnActivityListener { public LocationParams locationParamsForActivity(DetectedActivity detectedActivity); } }