[android] Add a way to use a custom location source (#8710)

* add a way to use a custom location source

* add custom location engine example to test app
This commit is contained in:
Pablo Guardiola
2017-04-20 20:10:29 +02:00
committed by GitHub
parent 97f2a44859
commit c6be40b71b
8 changed files with 315 additions and 21 deletions

View File

@@ -37,10 +37,12 @@ import com.mapbox.mapboxsdk.constants.MyLocationTracking;
import com.mapbox.mapboxsdk.constants.Style;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.geometry.LatLngBounds;
import com.mapbox.mapboxsdk.location.LocationSource;
import com.mapbox.mapboxsdk.maps.widgets.MyLocationViewSettings;
import com.mapbox.mapboxsdk.style.layers.Filter;
import com.mapbox.mapboxsdk.style.layers.Layer;
import com.mapbox.mapboxsdk.style.sources.Source;
import com.mapbox.services.android.telemetry.location.LocationEngine;
import com.mapbox.services.commons.geojson.Feature;
import java.lang.reflect.ParameterizedType;
@@ -1772,6 +1774,18 @@ public final class MapboxMap {
trackingSettings.setOnMyLocationChangeListener(listener);
}
/**
* Replaces the location source of the my-location layer.
*
* @param locationSource A {@link LocationEngine} location source to use in the my-location layer.
* Set to null to use the default {@link LocationSource}
* location source.
*/
@UiThread
public void setLocationSource(@Nullable LocationEngine locationSource) {
trackingSettings.setLocationSource(locationSource);
}
/**
* Sets a callback that's invoked when the location tracking mode changes.
*

View File

@@ -12,6 +12,7 @@ import com.mapbox.mapboxsdk.constants.MyBearingTracking;
import com.mapbox.mapboxsdk.constants.MyLocationTracking;
import com.mapbox.mapboxsdk.location.LocationSource;
import com.mapbox.mapboxsdk.maps.widgets.MyLocationView;
import com.mapbox.services.android.telemetry.location.LocationEngine;
import com.mapbox.services.android.telemetry.location.LocationEngineListener;
import com.mapbox.services.android.telemetry.permissions.PermissionsManager;
@@ -26,6 +27,7 @@ public final class TrackingSettings {
private final UiSettings uiSettings;
private final FocalPointChangeListener focalPointChangedListener;
private final CameraZoomInvalidator zoomInvalidator;
private LocationEngine locationSource;
private LocationEngineListener myLocationListener;
private boolean myLocationEnabled;
@@ -45,6 +47,7 @@ public final class TrackingSettings {
}
void initialise(MapboxMapOptions options) {
locationSource = LocationSource.getLocationEngine(myLocationView.getContext());
setMyLocationEnabled(options.getLocationEnabled());
}
@@ -328,9 +331,9 @@ public final class TrackingSettings {
}
}
};
LocationSource.getLocationEngine(myLocationView.getContext()).addLocationEngineListener(myLocationListener);
locationSource.addLocationEngineListener(myLocationListener);
} else {
LocationSource.getLocationEngine(myLocationView.getContext()).removeLocationEngineListener(myLocationListener);
locationSource.removeLocationEngineListener(myLocationListener);
myLocationListener = null;
}
}
@@ -362,6 +365,11 @@ public final class TrackingSettings {
myLocationView.setEnabled(locationEnabled);
}
void setLocationSource(LocationEngine locationSource) {
this.locationSource = locationSource;
myLocationView.setLocationSource(locationSource);
}
void update() {
if (!myLocationView.isEnabled()) {
return;

View File

@@ -58,6 +58,7 @@ public class MyLocationView extends View {
private LatLng latLng;
private Location location;
private LocationEngine locationSource;
private long locationUpdateTimestamp;
private float previousDirection;
@@ -320,8 +321,7 @@ public class MyLocationView extends View {
if (location != null) {
setCompass(location.getBearing() - bearing);
}
} else if (myBearingTrackingMode == MyBearingTracking.COMPASS
&& compassListener.isSensorAvailable()) {
} else if (myBearingTrackingMode == MyBearingTracking.COMPASS && compassListener.isSensorAvailable()) {
setCompass(magneticHeading - bearing);
}
}
@@ -335,8 +335,7 @@ public class MyLocationView extends View {
}
public void onStart() {
if (myBearingTrackingMode == MyBearingTracking.COMPASS
&& compassListener.isSensorAvailable()) {
if (myBearingTrackingMode == MyBearingTracking.COMPASS && compassListener.isSensorAvailable()) {
compassListener.onResume();
}
if (isEnabled()) {
@@ -369,7 +368,8 @@ public class MyLocationView extends View {
}
if (userLocationListener != null) {
LocationSource.getLocationEngine(getContext()).removeLocationEngineListener(userLocationListener);
locationSource.removeLocationEngineListener(userLocationListener);
locationSource = null;
userLocationListener = null;
}
}
@@ -419,29 +419,32 @@ public class MyLocationView extends View {
* @param enableGps true if GPS is to be enabled, false if GPS is to be disabled
*/
private void toggleGps(boolean enableGps) {
LocationEngine locationEngine = LocationSource.getLocationEngine(getContext());
if (locationSource == null) {
locationSource = LocationSource.getLocationEngine(this.getContext());
}
if (enableGps) {
// Set an initial location if one available
Location lastLocation = locationEngine.getLastLocation();
Location lastLocation = locationSource.getLastLocation();
if (lastLocation != null) {
setLocation(lastLocation);
}
if (userLocationListener == null) {
userLocationListener = new GpsLocationListener(this);
userLocationListener = new GpsLocationListener(this, locationSource);
}
locationEngine.addLocationEngineListener(userLocationListener);
locationEngine.activate();
locationSource.addLocationEngineListener(userLocationListener);
locationSource.activate();
} else {
// Disable location and user dot
location = null;
locationEngine.removeLocationEngineListener(userLocationListener);
locationEngine.deactivate();
locationSource.removeLocationEngineListener(userLocationListener);
locationSource.deactivate();
}
locationEngine.setPriority(LocationEnginePriority.HIGH_ACCURACY);
locationSource.setPriority(LocationEnginePriority.HIGH_ACCURACY);
}
public Location getLocation() {
@@ -460,8 +463,7 @@ public class MyLocationView extends View {
public void setMyBearingTrackingMode(@MyBearingTracking.Mode int myBearingTrackingMode) {
this.myBearingTrackingMode = myBearingTrackingMode;
if (myBearingTrackingMode == MyBearingTracking.COMPASS
&& compassListener.isSensorAvailable()) {
if (myBearingTrackingMode == MyBearingTracking.COMPASS && compassListener.isSensorAvailable()) {
compassListener.onResume();
} else {
compassListener.onPause();
@@ -561,22 +563,28 @@ public class MyLocationView extends View {
contentPaddingY = (padding[1] - padding[3]) / 2;
}
public void setLocationSource(LocationEngine locationSource) {
this.locationSource = locationSource;
}
private static class GpsLocationListener implements LocationEngineListener {
private WeakReference<MyLocationView> userLocationView;
private WeakReference<LocationEngine> locationSource;
GpsLocationListener(MyLocationView myLocationView) {
GpsLocationListener(MyLocationView myLocationView, LocationEngine locationEngine) {
userLocationView = new WeakReference<>(myLocationView);
locationSource = new WeakReference<>(locationEngine);
}
@Override
public void onConnected() {
MyLocationView locationView = userLocationView.get();
if (locationView != null) {
LocationEngine locationSource = LocationSource.getLocationEngine(locationView.getContext());
Location location = locationSource.getLastLocation();
LocationEngine locationEngine = locationSource.get();
Location location = locationEngine.getLastLocation();
locationView.setLocation(location);
locationSource.requestLocationUpdates();
locationEngine.requestLocationUpdates();
}
}