package de.westnordost.streetcomplete.location; import android.content.Context; import android.location.Location; import android.os.Handler; import android.os.Looper; import com.mapzen.android.lost.api.LocationListener; import com.mapzen.android.lost.api.LocationRequest; import com.mapzen.android.lost.api.LocationServices; import com.mapzen.android.lost.api.LostApiClient; /** Request ONE location update */ public class SingleLocationRequest implements LocationListener, LostApiClient.ConnectionCallbacks { private final LostApiClient lostApiClient; private int priority; private Callback listener; public interface Callback { void onLocation(Location location); } public SingleLocationRequest(Context context) { lostApiClient = new LostApiClient.Builder(context).addConnectionCallbacks(this).build(); } /** @param priority use one of the LocationRequest.PRIORITY_* constants */ public void startRequest(int priority, Callback listener) { this.priority = priority; this.listener = listener; if(!lostApiClient.isConnected()) lostApiClient.connect(); } public void stopRequest() { try // TODO remove when https://github.com/mapzen/lost/issues/178 is solved { Handler h = new Handler(Looper.getMainLooper()); h.post(new Runnable() { @Override public void run() { if(lostApiClient.isConnected()) { LocationServices.FusedLocationApi.removeLocationUpdates(lostApiClient, SingleLocationRequest.this); lostApiClient.disconnect(); } } }); } catch(Exception e) { e.printStackTrace(); } } @Override public void onConnected() throws SecurityException { LocationRequest r = LocationRequest.create().setPriority(priority); LocationServices.FusedLocationApi.requestLocationUpdates(lostApiClient, r, this); } @Override public void onLocationChanged(Location location) { listener.onLocation(location); stopRequest(); } @Override public void onProviderDisabled(String provider) {} @Override public void onProviderEnabled(String provider) {} @Override public void onConnectionSuspended() {} }