diff options
author | Antonio Zugaldia <antonio@mapbox.com> | 2017-02-03 15:12:13 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-03 15:12:13 -0500 |
commit | c97ec3be0397290e172299c49361f5033270f150 (patch) | |
tree | c66ceec30a95c484e5df9fabe1a22d8381bd8b19 /platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location | |
parent | e5c9db47931174911f0403a1f640a5ae33814b60 (diff) | |
download | qtlocation-mapboxgl-c97ec3be0397290e172299c49361f5033270f150.tar.gz |
[android] Extract telemetry into MAS
* [android] add the mapbox-android-telemetry module dependency.
* update javadoc
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location')
3 files changed, 144 insertions, 230 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationListener.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationListener.java deleted file mode 100644 index 7d86d8b096..0000000000 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationListener.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.mapbox.mapboxsdk.location; - -import android.location.Location; - -/** - * Callback interface for when a location change occurs. - */ -public interface LocationListener { - - /** - * Callback method for receiving location updates from LocationServices. - * - * @param location The new Location data - */ - void onLocationChanged(Location location); - -} diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationServices.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationServices.java deleted file mode 100644 index 364d925d37..0000000000 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationServices.java +++ /dev/null @@ -1,213 +0,0 @@ -package com.mapbox.mapboxsdk.location; - -import android.Manifest; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.location.Location; -import android.location.LocationManager; -import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; -import android.support.v4.content.LocalBroadcastManager; - -import timber.log.Timber; - -import com.mapbox.mapboxsdk.telemetry.TelemetryLocationReceiver; -import com.mapzen.android.lost.api.LocationRequest; -import com.mapzen.android.lost.api.LostApiClient; - -import java.util.concurrent.CopyOnWriteArrayList; - -import static com.mapzen.android.lost.api.LocationServices.FusedLocationApi; - -/** - * Manages locational updates. Contains methods to register and unregister location listeners. - * <ul> - * <li>You can register a {@link LocationListener} with {@link #addLocationListener(LocationListener)} to receive - * location updates.</li> - * <li> You can unregister a {@link LocationListener} with {@link #removeLocationListener(LocationListener)}.</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 LocationServices implements LostApiClient.ConnectionCallbacks, - com.mapzen.android.lost.api.LocationListener { - - private static LocationServices instance; - - private Context context; - private LostApiClient locationClient; - private Location lastLocation; - - private CopyOnWriteArrayList<LocationListener> locationListeners; - - private boolean isGpsEnabled; - - /** - * Private constructor for singleton LocationServices - */ - private LocationServices(Context context) { - super(); - this.context = context; - // Setup location services - locationClient = new LostApiClient.Builder(context).addConnectionCallbacks(this).build(); - locationListeners = new CopyOnWriteArrayList<>(); - } - - /** - * Primary (singleton) access method for LocationServices - * - * @param context Context - * @return LocationServices - */ - public static LocationServices getLocationServices(@NonNull final Context context) { - if (instance == null) { - instance = new LocationServices(context.getApplicationContext()); - } - return instance; - } - - /** - * Enabled / Disable GPS focused location tracking - * - * @param enableGPS true if GPS is to be enabled, false if GPS is to be disabled - */ - public void toggleGPS(boolean enableGPS) { - if (!areLocationPermissionsGranted()) { - Timber.w("Location Permissions Not Granted Yet. Try again after requesting."); - return; - } - - // Disconnect - if (locationClient.isConnected()) { - // Disconnect first to ensure that the new requests are GPS - FusedLocationApi.removeLocationUpdates(locationClient, this); - locationClient.disconnect(); - } - isGpsEnabled = enableGPS; - - // Setup Fresh - locationClient.connect(); - } - - @Override - public void onConnected() { - // noinspection MissingPermission - Location lastLocation = FusedLocationApi.getLastLocation(locationClient); - if (lastLocation != null) { - this.lastLocation = lastLocation; - } - - LocationRequest locationRequest; - - if (isGpsEnabled) { - // LocationRequest Tuned for GPS - locationRequest = LocationRequest.create() - .setFastestInterval(1000) - .setSmallestDisplacement(3.0f) - .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); - // noinspection MissingPermission - FusedLocationApi.requestLocationUpdates(locationClient, locationRequest, this); - } else { - // LocationRequest Tuned for PASSIVE - locationRequest = LocationRequest.create() - .setFastestInterval(1000) - .setSmallestDisplacement(3.0f) - .setPriority(LocationRequest.PRIORITY_NO_POWER); - // noinspection MissingPermission - FusedLocationApi.requestLocationUpdates(locationClient, locationRequest, this); - } - } - - @Override - public void onConnectionSuspended() { - } - - /** - * Returns if the GPS sensor is currently enabled - * - * @return active state of the GPS - */ - public boolean isGpsEnabled() { - return isGpsEnabled; - } - - /** - * Called when the location has changed. - * - * @param location The updated location - */ - @Override - public void onLocationChanged(Location location) { - // Timber.d("onLocationChanged()..." + location); - this.lastLocation = location; - - // Update Listeners - for (LocationListener listener : this.locationListeners) { - listener.onLocationChanged(location); - } - - // Update the Telemetry Receiver - Intent locIntent = new Intent(TelemetryLocationReceiver.INTENT_STRING); - locIntent.putExtra(LocationManager.KEY_LOCATION_CHANGED, location); - LocalBroadcastManager.getInstance(context.getApplicationContext()).sendBroadcast(locIntent); - } - - /** - * Last known location - * - * @return Last known location data - */ - public Location getLastLocation() { - return lastLocation; - } - - /** - * Registers a LocationListener to receive location updates - * - * @param locationListener LocationListener - */ - public void addLocationListener(@NonNull LocationListener locationListener) { - if (!this.locationListeners.contains(locationListener)) { - this.locationListeners.add(locationListener); - } - } - - /** - * Unregister a LocationListener to stop receiving location updates - * - * @param locationListener LocationListener to remove - * @return True if LocationListener was found and removed, False if it was not - */ - public boolean removeLocationListener(@NonNull LocationListener locationListener) { - return this.locationListeners.remove(locationListener); - } - - /** - * Check status of Location Permissions - * - * @return True if granted to the app, False if not - */ - public boolean areLocationPermissionsGranted() { - if ((ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) - != PackageManager.PERMISSION_GRANTED) - && (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) - != PackageManager.PERMISSION_GRANTED)) { - Timber.w("Location Permissions Not Granted Yet. Try again after requesting."); - return false; - } - return true; - } - - @Override - public void onProviderDisabled(String provider) { - } - - @Override - public void onProviderEnabled(String provider) { - } -} 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..ff367abe1f --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationSource.java @@ -0,0 +1,144 @@ +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; + +/** + * 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 Context context; + private LostApiClient lostApiClient; + + public LocationSource(Context context) { + super(); + this.context = context; + lostApiClient = new LostApiClient.Builder(context) + .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)) { + //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)) { + //noinspection MissingPermission + LocationServices.FusedLocationApi.requestLocationUpdates(lostApiClient, request, this); + } + } + + @Override + public void removeLocationUpdates() { + 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); + } +} |