[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:
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user