diff options
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationSource.java')
-rw-r--r-- | platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationSource.java | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationSource.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationSource.java new file mode 100644 index 0000000000..5a87f6384f --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationSource.java @@ -0,0 +1,148 @@ +package com.mapbox.mapboxsdk.location; + +import android.content.Context; +import android.location.Location; +import android.util.Log; + +import com.mapbox.services.android.telemetry.location.LocationEngine; +import com.mapbox.services.android.telemetry.location.LocationEngineListener; +import com.mapbox.services.android.telemetry.location.LocationEnginePriority; +import com.mapbox.services.android.telemetry.permissions.PermissionsManager; +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; + +import java.lang.ref.WeakReference; + +/** + * Manages locational updates. Contains methods to register and unregister location listeners. + * <ul> + * <li>You can register a {@link LocationEngineListener} with + * {@link #addLocationEngineListener(LocationEngineListener)} to receive + * location updates.</li> + * <li> You can unregister a {@link LocationEngineListener} with + * {@link #removeLocationEngineListener(LocationEngineListener)} to stop receiving location updates.</li> + * </ul> + * <p> + * Note: If registering a listener in your Activity.onStart() implementation, you should unregister it in + * Activity.onStop(). (You won't receive location updates when paused, and this will cut down on unnecessary system + * overhead). Do not unregister in Activity.onSaveInstanceState(), because this won't be called if the user moves back + * in the history stack. + * </p> + */ +public class LocationSource extends LocationEngine implements + LostApiClient.ConnectionCallbacks, LocationListener { + + private static final String LOG_TAG = LocationSource.class.getSimpleName(); + + private static LocationEngine instance; + + private WeakReference<Context> context; + private LostApiClient lostApiClient; + + public LocationSource(Context context) { + super(); + this.context = new WeakReference<>(context); + lostApiClient = new LostApiClient.Builder(this.context.get()) + .addConnectionCallbacks(this) + .build(); + } + + public static synchronized LocationEngine getLocationEngine(Context context) { + if (instance == null) { + instance = new LocationSource(context.getApplicationContext()); + } + + return instance; + } + + @Override + public void activate() { + if (lostApiClient != null && !lostApiClient.isConnected()) { + lostApiClient.connect(); + } + } + + @Override + public void deactivate() { + if (lostApiClient != null && lostApiClient.isConnected()) { + lostApiClient.disconnect(); + } + } + + @Override + public boolean isConnected() { + return lostApiClient.isConnected(); + } + + @Override + public void onConnected() { + for (LocationEngineListener listener : locationListeners) { + listener.onConnected(); + } + } + + @Override + public void onConnectionSuspended() { + Log.d(LOG_TAG, "Connection suspended."); + } + + @Override + public Location getLastLocation() { + if (lostApiClient.isConnected() && PermissionsManager.areLocationPermissionsGranted(context.get())) { + //noinspection MissingPermission + return LocationServices.FusedLocationApi.getLastLocation(lostApiClient); + } + + return null; + } + + @Override + public void requestLocationUpdates() { + // Common params + LocationRequest request = LocationRequest.create() + .setFastestInterval(1000) + .setSmallestDisplacement(3.0f); + + // Priority matching is straightforward + if (priority == LocationEnginePriority.NO_POWER) { + request.setPriority(LocationRequest.PRIORITY_NO_POWER); + } else if (priority == LocationEnginePriority.LOW_POWER) { + request.setPriority(LocationRequest.PRIORITY_LOW_POWER); + } else if (priority == LocationEnginePriority.BALANCED_POWER_ACCURACY) { + request.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); + } else if (priority == LocationEnginePriority.HIGH_ACCURACY) { + request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); + } + + if (lostApiClient.isConnected() && PermissionsManager.areLocationPermissionsGranted(context.get())) { + //noinspection MissingPermission + LocationServices.FusedLocationApi.requestLocationUpdates(lostApiClient, request, this); + } + } + + @Override + public void removeLocationUpdates() { + if (lostApiClient.isConnected()) { + LocationServices.FusedLocationApi.removeLocationUpdates(lostApiClient, this); + } + } + + @Override + public void onLocationChanged(Location location) { + for (LocationEngineListener listener : locationListeners) { + listener.onLocationChanged(location); + } + } + + @Override + public void onProviderDisabled(String provider) { + Log.d(LOG_TAG, "Provider disabled: " + provider); + } + + @Override + public void onProviderEnabled(String provider) { + Log.d(LOG_TAG, "Provider enabled: " + provider); + } +} |