summaryrefslogtreecommitdiff
path: root/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java79
1 files changed, 67 insertions, 12 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java
index 7e312a8158..b6246f4abc 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java
@@ -107,6 +107,7 @@ public final class LocationComponent {
private LocationEngineCallback<LocationEngineResult> lastLocationEngineListener
= new LastLocationEngineCallback(this);
+ @Nullable
private CompassEngine compassEngine;
private LocationLayerController locationLayerController;
@@ -146,6 +147,11 @@ public final class LocationComponent {
*/
private boolean isLayerReady;
+ /**
+ * Indicates whether we are listening for compass updates.
+ */
+ private boolean isListeningToCompass;
+
private StaleStateManager staleStateManager;
private final CopyOnWriteArrayList<OnLocationStaleListener> onLocationStaleListeners
= new CopyOnWriteArrayList<>();
@@ -439,6 +445,7 @@ public final class LocationComponent {
public void setCameraMode(@CameraMode.Mode int cameraMode,
@Nullable OnLocationCameraTransitionListener transitionListener) {
locationCameraController.setCameraMode(cameraMode, lastLocation, new CameraTransitionListener(transitionListener));
+ updateCompassListenerState(true);
}
/**
@@ -498,6 +505,7 @@ public final class LocationComponent {
public void setRenderMode(@RenderMode.Mode int renderMode) {
locationLayerController.setRenderMode(renderMode);
updateLayerOffsets(true);
+ updateCompassListenerState(true);
}
/**
@@ -734,10 +742,12 @@ public final class LocationComponent {
*
* @param compassEngine to be used
*/
- public void setCompassEngine(@NonNull CompassEngine compassEngine) {
- this.compassEngine.removeCompassListener(compassListener);
+ public void setCompassEngine(@Nullable CompassEngine compassEngine) {
+ if (this.compassEngine != null) {
+ updateCompassListenerState(false);
+ }
this.compassEngine = compassEngine;
- compassEngine.addCompassListener(compassListener);
+ updateCompassListenerState(true);
}
/**
@@ -745,7 +755,7 @@ public final class LocationComponent {
*
* @return compass engine currently being used
*/
- @NonNull
+ @Nullable
public CompassEngine getCompassEngine() {
return compassEngine;
}
@@ -767,9 +777,11 @@ public final class LocationComponent {
* The last known accuracy of the compass sensor, one of SensorManager.SENSOR_STATUS_*
*
* @return the last know compass accuracy bearing
+ * @deprecated Use {@link #getCompassEngine()}
*/
+ @Deprecated
public float getLastKnownCompassAccuracyStatus() {
- return compassEngine.getLastAccuracySensorStatus();
+ return compassEngine != null ? compassEngine.getLastAccuracySensorStatus() : 0;
}
/**
@@ -778,9 +790,13 @@ public final class LocationComponent {
*
* @param compassListener a {@link CompassListener} for listening into compass heading and
* accuracy changes
+ * @deprecated Use {@link #getCompassEngine()}
*/
+ @Deprecated
public void addCompassListener(@NonNull CompassListener compassListener) {
- compassEngine.addCompassListener(compassListener);
+ if (compassEngine != null) {
+ compassEngine.addCompassListener(compassListener);
+ }
}
/**
@@ -788,9 +804,13 @@ public final class LocationComponent {
*
* @param compassListener the {@link CompassListener} which you'd like to remove from the listener
* list.
+ * @deprecated Use {@link #getCompassEngine()}
*/
+ @Deprecated
public void removeCompassListener(@NonNull CompassListener compassListener) {
- compassEngine.removeCompassListener(compassListener);
+ if (compassEngine != null) {
+ compassEngine.removeCompassListener(compassListener);
+ }
}
/**
@@ -934,7 +954,6 @@ public final class LocationComponent {
if (options.enableStaleState()) {
staleStateManager.onStart();
}
- compassEngine.onStart();
}
if (isEnabled) {
@@ -948,6 +967,7 @@ public final class LocationComponent {
}
setCameraMode(locationCameraController.getCameraMode());
setLastLocation();
+ updateCompassListenerState(true);
setLastCompassHeading();
}
}
@@ -960,7 +980,9 @@ public final class LocationComponent {
isLayerReady = false;
locationLayerController.hide();
staleStateManager.onStop();
- compassEngine.onStop();
+ if (compassEngine != null) {
+ updateCompassListenerState(false);
+ }
locationAnimatorCoordinator.cancelAllAnimations();
if (locationEngine != null) {
locationEngine.removeLocationUpdates(currentLocationEngineListener);
@@ -1001,8 +1023,9 @@ public final class LocationComponent {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
- compassEngine = new LocationComponentCompassEngine(windowManager, sensorManager);
- compassEngine.addCompassListener(compassListener);
+ if (windowManager != null && sensorManager != null) {
+ compassEngine = new LocationComponentCompassEngine(windowManager, sensorManager);
+ }
staleStateManager = new StaleStateManager(onLocationStaleListener, options);
updateMapWithOptions(options);
@@ -1022,6 +1045,38 @@ public final class LocationComponent {
locationEngine = internalLocationEngineProvider.getBestLocationEngine(context, false);
}
+ private void updateCompassListenerState(boolean canListen) {
+ if (compassEngine != null) {
+ if (!canListen) {
+ // We shouldn't listen, simply unregistering
+ removeCompassListener(compassEngine);
+ return;
+ }
+
+ if (!isComponentInitialized || !isComponentStarted || !isEnabled) {
+ return;
+ }
+
+ if (locationCameraController.isConsumingCompass() || locationLayerController.isConsumingCompass()) {
+ // If we have a consumer, and not yet listening, then start listening
+ if (!isListeningToCompass) {
+ isListeningToCompass = true;
+ compassEngine.addCompassListener(compassListener);
+ }
+ } else {
+ // If we have no consumers, stop listening
+ removeCompassListener(compassEngine);
+ }
+ }
+ }
+
+ private void removeCompassListener(@NonNull CompassEngine engine) {
+ if (isListeningToCompass) {
+ isListeningToCompass = false;
+ engine.removeCompassListener(compassListener);
+ }
+ }
+
private void enableLocationComponent() {
isEnabled = true;
onLocationLayerStart();
@@ -1091,7 +1146,7 @@ public final class LocationComponent {
}
private void setLastCompassHeading() {
- updateCompassHeading(compassEngine.getLastHeading());
+ updateCompassHeading(compassEngine != null ? compassEngine.getLastHeading() : 0);
}
@SuppressLint("MissingPermission")