From 29a94ae939cf1d81017251ec374e3fff703dc4a6 Mon Sep 17 00:00:00 2001 From: Pablo Guardiola Date: Wed, 1 Nov 2017 18:25:52 -0700 Subject: [android] make location provider optional (#9488) (#10354) --- platform/android/MapboxGLAndroidSDK/build.gradle | 5 +- .../com/mapbox/mapboxsdk/EmptyLocationSource.java | 107 +++++++++++++++++++++ .../src/main/java/com/mapbox/mapboxsdk/Mapbox.java | 35 +++++-- .../mapbox/mapboxsdk/location/LocationSource.java | 89 ++++++++++++----- .../mapbox/mapboxsdk/location/package-info.java | 2 +- .../java/com/mapbox/mapboxsdk/maps/MapboxMap.java | 2 +- .../mapbox/mapboxsdk/maps/TrackingSettings.java | 8 +- .../mapboxsdk/maps/widgets/MyLocationView.java | 59 +++++++----- .../test/java/com/mapbox/mapboxsdk/MapboxTest.java | 6 +- .../android/MapboxGLAndroidSDKTestApp/build.gradle | 1 + .../testapp/maps/widgets/MyLocationViewTest.java | 2 +- .../userlocation/CustomLocationEngineActivity.java | 2 +- .../activity/userlocation/MockLocationEngine.java | 9 +- .../userlocation/MyLocationDrawableActivity.java | 26 ++--- .../MyLocationTrackingModeActivity.java | 38 +++----- platform/android/dependencies.gradle | 6 +- 16 files changed, 280 insertions(+), 117 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/EmptyLocationSource.java diff --git a/platform/android/MapboxGLAndroidSDK/build.gradle b/platform/android/MapboxGLAndroidSDK/build.gradle index 19587d0078..49806780b5 100644 --- a/platform/android/MapboxGLAndroidSDK/build.gradle +++ b/platform/android/MapboxGLAndroidSDK/build.gradle @@ -5,8 +5,7 @@ dependencies { compile rootProject.ext.dep.supportFragmentV4 compile rootProject.ext.dep.timber compile rootProject.ext.dep.okhttp3 - compile(rootProject.ext.dep.lost) { - exclude group: 'com.google.guava' + provided(rootProject.ext.dep.lost) { exclude group: 'com.android.support' } testCompile rootProject.ext.dep.junit @@ -22,6 +21,8 @@ dependencies { transitive = true exclude group: 'com.android.support' } + + compile(rootProject.ext.dep.mapboxAndroidCore) } android { diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/EmptyLocationSource.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/EmptyLocationSource.java new file mode 100644 index 0000000000..d24ed5a113 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/EmptyLocationSource.java @@ -0,0 +1,107 @@ +package com.mapbox.mapboxsdk; + + +import android.location.Location; +import android.support.annotation.Nullable; + +import com.mapbox.mapboxsdk.location.LocationSource; +import com.mapbox.services.android.core.location.LocationEngine; +import com.mapbox.services.android.core.location.LocationEngineListener; + +class EmptyLocationSource extends LocationSource { + + /** + * Activate the location engine which will connect whichever location provider you are using. You'll need to call + * this before requesting user location updates using {@link LocationEngine#requestLocationUpdates()}. + */ + @Override + public void activate() { + // Intentionally left empty + } + + /** + * Disconnect the location engine which is useful when you no longer need location updates or requesting the users + * {@link LocationEngine#getLastLocation()}. Before deactivating, you'll need to stop request user location updates + * using {@link LocationEngine#removeLocationUpdates()}. + */ + @Override + public void deactivate() { + // Intentionally left empty + } + + /** + * Check if your location provider has been activated/connected. This is mainly used internally but is also useful in + * the rare case when you'd like to know if your location engine is connected or not. + * + * @return boolean true if the location engine has been activated/connected, else false. + */ + @Override + public boolean isConnected() { + return false; + } + + /** + * Returns the Last known location is the location provider is connected and location permissions are granted. + * + * @return the last known location + */ + @Override + @Nullable + public Location getLastLocation() { + return null; + } + + /** + * Request location updates to the location provider. + */ + @Override + public void requestLocationUpdates() { + // Intentionally left empty + } + + /** + * Dismiss ongoing location update to the location provider. + */ + @Override + public void removeLocationUpdates() { + // Intentionally left empty + } + + /** + * Invoked when the Location has changed. + * + * @param location the new location + */ + @Override + public void onLocationChanged(Location location) { + // Intentionally left empty + } + + /** + * Useful when you'd like to add a location listener to handle location connections and update events. It is important + * to note, that the callback will continue getting called even when your application isn't in the foreground. + * Therefore, it is a good idea to use {@link LocationEngine#removeLocationEngineListener(LocationEngineListener)} + * inside your activities {@code onStop()} method. + * + * @param listener A {@link LocationEngineListener} which you'd like to add to your location engine. + * @since 2.0.0 + */ + @Override + public void addLocationEngineListener(LocationEngineListener listener) { + // Intentionally left empty + } + + /** + * If you no longer need your {@link LocationEngineListener} to be invoked with every location update, use this + * method to remove it. It's also important to remove your listeners before the activity is destroyed to prevent any + * potential memory leaks. + * + * @param listener the {@link LocationEngineListener} you'd like to remove from this {@link LocationEngine}. + * @return true. + * @since 2.0.0 + */ + @Override + public boolean removeLocationEngineListener(LocationEngineListener listener) { + return true; + } +} diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/Mapbox.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/Mapbox.java index 7fd9d6172d..e575dc9062 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/Mapbox.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/Mapbox.java @@ -12,9 +12,10 @@ import com.mapbox.mapboxsdk.constants.MapboxConstants; import com.mapbox.mapboxsdk.exceptions.MapboxConfigurationException; import com.mapbox.mapboxsdk.location.LocationSource; import com.mapbox.mapboxsdk.net.ConnectivityReceiver; +import com.mapbox.services.android.core.location.LocationEngine; +import com.mapbox.services.android.core.location.LocationEnginePriority; +import com.mapbox.services.android.core.location.LocationEngineProvider; import com.mapbox.services.android.telemetry.MapboxTelemetry; -import com.mapbox.services.android.telemetry.location.LocationEngine; -import com.mapbox.services.android.telemetry.location.LocationEnginePriority; import timber.log.Timber; @@ -34,7 +35,7 @@ public final class Mapbox { private Context context; private String accessToken; private Boolean connected; - private LocationSource locationSource; + private LocationEngine locationEngine; /** * Get an instance of Mapbox. @@ -50,8 +51,9 @@ public final class Mapbox { public static synchronized Mapbox getInstance(@NonNull Context context, @NonNull String accessToken) { if (INSTANCE == null) { Context appContext = context.getApplicationContext(); - INSTANCE = new Mapbox(appContext, accessToken, new LocationSource(appContext)); - LocationEngine locationEngine = new LocationSource(appContext); + LocationEngineProvider locationEngineProvider = new LocationEngineProvider(context); + LocationEngine locationEngine = locationEngineProvider.obtainBestLocationEngineAvailable(); + INSTANCE = new Mapbox(appContext, accessToken, locationEngine); locationEngine.setPriority(LocationEnginePriority.NO_POWER); try { @@ -66,10 +68,10 @@ public final class Mapbox { return INSTANCE; } - Mapbox(@NonNull Context context, @NonNull String accessToken, LocationSource locationSource) { + Mapbox(@NonNull Context context, @NonNull String accessToken, LocationEngine locationEngine) { this.context = context; this.accessToken = accessToken; - this.locationSource = locationSource; + this.locationEngine = locationEngine; } /** @@ -143,7 +145,24 @@ public final class Mapbox { return (activeNetwork != null && activeNetwork.isConnected()); } + /** + * Returns a location source instance with empty methods. + * + * @return an empty location source implementation + * @deprecated Replaced by {@link Mapbox#getLocationEngine()} + */ + @Deprecated public static LocationSource getLocationSource() { - return INSTANCE.locationSource; + return new EmptyLocationSource(); + } + + + /** + * Returns the location engine used by the SDK. + * + * @return the location engine configured + */ + public static LocationEngine getLocationEngine() { + return INSTANCE.locationEngine; } } 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 index 6652142be3..5129db08e8 100644 --- 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 @@ -4,16 +4,17 @@ import android.content.Context; import android.location.Location; import android.support.annotation.Nullable; -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.mapbox.mapboxsdk.Mapbox; +import com.mapbox.services.android.core.location.LocationEngine; +import com.mapbox.services.android.core.location.LocationEngineListener; +import com.mapbox.services.android.core.location.LocationEnginePriority; 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; /** + * LocationEngine using the Open Source Lost library * Manages locational updates. Contains methods to register and unregister location listeners. *