From 8cd86fe1b40c45ac634cce4bb8f989e663ef6ea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Paczos?= Date: Wed, 5 Sep 2018 19:06:38 +0200 Subject: [android] improved gestures management while tracking location --- .../location/LocationCameraController.java | 78 +++--- .../mapboxsdk/location/LocationComponent.java | 1 + .../location/LocationComponentOptions.java | 55 +++- .../src/main/res/values/attrs.xml | 1 + .../src/main/res/values/dimens.xml | 2 +- .../src/main/res/values/styles.xml | 2 +- .../location/LocationAnimatorCoordinatorTest.kt | 284 +++++++++++++++++++++ .../location/LocationCameraControllerTest.java | 10 +- .../location/MapboxAnimatorCoordinatorTest.kt | 284 --------------------- .../activity/location/LocationModesActivity.java | 28 +- .../src/main/res/menu/menu_location_mode.xml | 13 +- 11 files changed, 425 insertions(+), 333 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinatorTest.kt delete mode 100644 platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/MapboxAnimatorCoordinatorTest.kt diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationCameraController.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationCameraController.java index 5b2209179e..50fb829fcc 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationCameraController.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationCameraController.java @@ -2,6 +2,7 @@ package com.mapbox.mapboxsdk.location; import android.content.Context; import android.graphics.PointF; +import android.support.annotation.NonNull; import android.view.MotionEvent; import com.mapbox.android.gestures.AndroidGesturesManager; @@ -9,11 +10,8 @@ import com.mapbox.android.gestures.MoveGestureDetector; import com.mapbox.android.gestures.RotateGestureDetector; import com.mapbox.mapboxsdk.camera.CameraUpdateFactory; import com.mapbox.mapboxsdk.geometry.LatLng; -import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.location.modes.CameraMode; - -import java.util.List; -import java.util.Set; +import com.mapbox.mapboxsdk.maps.MapboxMap; final class LocationCameraController implements MapboxAnimator.OnCameraAnimationsValuesChangeListener { @@ -28,6 +26,9 @@ final class LocationCameraController implements MapboxAnimator.OnCameraAnimation private final MoveGestureDetector moveGestureDetector; private final OnCameraMoveInvalidateListener onCameraMoveInvalidateListener; + private final AndroidGesturesManager initialGesturesManager; + private final AndroidGesturesManager internalGesturesManager; + LocationCameraController( Context context, MapboxMap mapboxMap, @@ -35,12 +36,13 @@ final class LocationCameraController implements MapboxAnimator.OnCameraAnimation LocationComponentOptions options, OnCameraMoveInvalidateListener onCameraMoveInvalidateListener) { this.mapboxMap = mapboxMap; - mapboxMap.setGesturesManager( - new LocationGesturesManager(context), true, true); - moveGestureDetector = mapboxMap.getGesturesManager().getMoveGestureDetector(); - mapboxMap.addOnMoveListener(onMoveListener); + + initialGesturesManager = mapboxMap.getGesturesManager(); + internalGesturesManager = new LocationGesturesManager(context); + moveGestureDetector = internalGesturesManager.getMoveGestureDetector(); mapboxMap.addOnRotateListener(onRotateListener); mapboxMap.addOnFlingListener(onFlingListener); + mapboxMap.addOnMoveListener(onMoveListener); this.internalCameraTrackingChangedListener = internalCameraTrackingChangedListener; this.onCameraMoveInvalidateListener = onCameraMoveInvalidateListener; @@ -51,15 +53,24 @@ final class LocationCameraController implements MapboxAnimator.OnCameraAnimation LocationCameraController(MapboxMap mapboxMap, MoveGestureDetector moveGestureDetector, OnCameraTrackingChangedListener internalCameraTrackingChangedListener, - OnCameraMoveInvalidateListener onCameraMoveInvalidateListener) { + OnCameraMoveInvalidateListener onCameraMoveInvalidateListener, + AndroidGesturesManager androidGesturesManager) { this.mapboxMap = mapboxMap; this.moveGestureDetector = moveGestureDetector; this.internalCameraTrackingChangedListener = internalCameraTrackingChangedListener; this.onCameraMoveInvalidateListener = onCameraMoveInvalidateListener; + this.internalGesturesManager = androidGesturesManager; + this.initialGesturesManager = androidGesturesManager; } void initializeOptions(LocationComponentOptions options) { this.options = options; + if (options.trackingGesturesManagement()) { + mapboxMap.setGesturesManager(internalGesturesManager, true, true); + adjustGesturesThresholds(); + } else { + mapboxMap.setGesturesManager(initialGesturesManager, true, true); + } } void setCameraMode(@CameraMode.Mode int cameraMode) { @@ -141,11 +152,13 @@ final class LocationCameraController implements MapboxAnimator.OnCameraAnimation } private void adjustGesturesThresholds() { - if (isLocationTracking()) { - adjustFocalPoint = true; - moveGestureDetector.setMoveThreshold(options.trackingInitialMoveThreshold()); - } else { - moveGestureDetector.setMoveThreshold(0f); + if (options.trackingGesturesManagement()) { + if (isLocationTracking()) { + adjustFocalPoint = true; + moveGestureDetector.setMoveThreshold(options.trackingInitialMoveThreshold()); + } else { + moveGestureDetector.setMoveThreshold(0f); + } } } @@ -176,29 +189,31 @@ final class LocationCameraController implements MapboxAnimator.OnCameraAnimation private boolean interrupt; @Override - public void onMoveBegin(MoveGestureDetector detector) { - if (detector.getPointersCount() > 1 + public void onMoveBegin(@NonNull MoveGestureDetector detector) { + if (options.trackingGesturesManagement() + && detector.getPointersCount() > 1 && detector.getMoveThreshold() != options.trackingMultiFingerMoveThreshold() && isLocationTracking()) { detector.setMoveThreshold(options.trackingMultiFingerMoveThreshold()); interrupt = true; + } else { + setCameraMode(CameraMode.NONE); } } @Override - public void onMove(MoveGestureDetector detector) { + public void onMove(@NonNull MoveGestureDetector detector) { if (interrupt) { detector.interrupt(); return; } - setCameraMode(CameraMode.NONE); } @Override - public void onMoveEnd(MoveGestureDetector detector) { - if (!interrupt && isLocationTracking()) { - moveGestureDetector.setMoveThreshold(options.trackingInitialMoveThreshold()); + public void onMoveEnd(@NonNull MoveGestureDetector detector) { + if (options.trackingGesturesManagement() && !interrupt && isLocationTracking()) { + detector.setMoveThreshold(options.trackingInitialMoveThreshold()); } interrupt = false; } @@ -206,19 +221,19 @@ final class LocationCameraController implements MapboxAnimator.OnCameraAnimation private MapboxMap.OnRotateListener onRotateListener = new MapboxMap.OnRotateListener() { @Override - public void onRotateBegin(RotateGestureDetector detector) { + public void onRotateBegin(@NonNull RotateGestureDetector detector) { if (isBearingTracking()) { setCameraMode(CameraMode.NONE); } } @Override - public void onRotate(RotateGestureDetector detector) { + public void onRotate(@NonNull RotateGestureDetector detector) { // no implementation } @Override - public void onRotateEnd(RotateGestureDetector detector) { + public void onRotateEnd(@NonNull RotateGestureDetector detector) { // no implementation } }; @@ -232,23 +247,10 @@ final class LocationCameraController implements MapboxAnimator.OnCameraAnimation private class LocationGesturesManager extends AndroidGesturesManager { - public LocationGesturesManager(Context context) { + LocationGesturesManager(Context context) { super(context); } - public LocationGesturesManager(Context context, boolean applyDefaultThresholds) { - super(context, applyDefaultThresholds); - } - - public LocationGesturesManager(Context context, Set[] exclusiveGestures) { - super(context, exclusiveGestures); - } - - public LocationGesturesManager(Context context, List> exclusiveGestures, - boolean applyDefaultThresholds) { - super(context, exclusiveGestures, applyDefaultThresholds); - } - @Override public boolean onTouchEvent(MotionEvent motionEvent) { if (motionEvent != null) { 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 4b0860998f..42c40634f9 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 @@ -351,6 +351,7 @@ public final class LocationComponent { public void applyStyle(LocationComponentOptions options) { this.options = options; locationLayerController.applyStyle(options); + locationCameraController.initializeOptions(options); staleStateManager.setEnabled(options.enableStaleState()); staleStateManager.setDelayTime(options.staleStateTimeout()); updateMapWithOptions(options); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponentOptions.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponentOptions.java index 9a50840926..fcca4764d4 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponentOptions.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponentOptions.java @@ -12,6 +12,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StyleRes; +import com.mapbox.android.gestures.AndroidGesturesManager; import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.constants.MapboxConstants; @@ -100,6 +101,7 @@ public class LocationComponentOptions implements Parcelable { private double minZoom; private float maxZoomIconScale; private float minZoomIconScale; + private boolean trackingGesturesManagement; private float trackingInitialMoveThreshold; private float trackingMultiFingerMoveThreshold; private String layerBelow; @@ -132,6 +134,7 @@ public class LocationComponentOptions implements Parcelable { double minZoom, float maxZoomIconScale, float minZoomIconScale, + boolean trackingGesturesManagement, float trackingInitialMoveThreshold, float trackingMultiFingerMoveThreshold, String layerBelow) { @@ -165,6 +168,7 @@ public class LocationComponentOptions implements Parcelable { this.minZoom = minZoom; this.maxZoomIconScale = maxZoomIconScale; this.minZoomIconScale = minZoomIconScale; + this.trackingGesturesManagement = trackingGesturesManagement; this.trackingInitialMoveThreshold = trackingInitialMoveThreshold; this.trackingMultiFingerMoveThreshold = trackingMultiFingerMoveThreshold; this.layerBelow = layerBelow; @@ -243,10 +247,11 @@ public class LocationComponentOptions implements Parcelable { R.styleable.mapbox_LocationComponent_mapbox_accuracyAlpha, ACCURACY_ALPHA_DEFAULT)); builder.elevation(elevation); + builder.trackingGesturesManagement(typedArray.getBoolean( + R.styleable.mapbox_LocationComponent_mapbox_trackingGesturesManagement, false)); builder.trackingInitialMoveThreshold(typedArray.getDimension( R.styleable.mapbox_LocationComponent_mapbox_trackingInitialMoveThreshold, context.getResources().getDimension(R.dimen.mapbox_locationComponentTrackingInitialMoveThreshold))); - builder.trackingMultiFingerMoveThreshold(typedArray.getDimension( R.styleable.mapbox_LocationComponent_mapbox_trackingMultiFingerMoveThreshold, context.getResources().getDimension(R.dimen.mapbox_locationComponentTrackingMultiFingerMoveThreshold))); @@ -653,6 +658,23 @@ public class LocationComponentOptions implements Parcelable { return minZoomIconScale; } + /** + * Returns whether gesture threshold should be adjusted when camera is in one of the tracking modes. + * This will adjust the focal point and increase thresholds to enable camera manipulation, + * like zooming in and out, without breaking tracking. + *

+ * Note: If set to true, this can overwrite some of the gesture thresholds + * and the custom {@link com.mapbox.android.gestures.AndroidGesturesManager} that was set with + * {@link com.mapbox.mapboxsdk.maps.MapboxMap#setGesturesManager(AndroidGesturesManager, boolean, boolean)}. + * + * @return true if gestures are adjusted when in one of the camera tracking modes, false otherwise + * @see Builder#trackingInitialMoveThreshold(float) + * @see Builder#trackingMultiFingerMoveThreshold(float) + */ + public boolean trackingGesturesManagement() { + return trackingGesturesManagement; + } + /** * Minimum single pointer movement in pixels required to break camera tracking. * @@ -710,6 +732,7 @@ public class LocationComponentOptions implements Parcelable { + "minZoom=" + minZoom + ", " + "maxZoomIconScale=" + maxZoomIconScale + ", " + "minZoomIconScale=" + minZoomIconScale + ", " + + "trackingGesturesManagement=" + trackingGesturesManagement + ", " + "trackingInitialMoveThreshold=" + trackingInitialMoveThreshold + ", " + "trackingMultiFingerMoveThreshold=" + trackingMultiFingerMoveThreshold + ", " + "layerBelow=" + layerBelow @@ -760,6 +783,7 @@ public class LocationComponentOptions implements Parcelable { && (Double.doubleToLongBits(this.minZoom) == Double.doubleToLongBits(that.minZoom())) && (Float.floatToIntBits(this.maxZoomIconScale) == Float.floatToIntBits(that.maxZoomIconScale())) && (Float.floatToIntBits(this.minZoomIconScale) == Float.floatToIntBits(that.minZoomIconScale())) + && (this.trackingGesturesManagement == that.trackingGesturesManagement()) && (Float.floatToIntBits(this.trackingInitialMoveThreshold) == Float.floatToIntBits(that.trackingInitialMoveThreshold())) && (Float.floatToIntBits(this.trackingMultiFingerMoveThreshold) @@ -827,6 +851,8 @@ public class LocationComponentOptions implements Parcelable { h$ *= 1000003; h$ ^= Float.floatToIntBits(minZoomIconScale); h$ *= 1000003; + h$ ^= trackingGesturesManagement ? 1231 : 1237; + h$ *= 1000003; h$ ^= Float.floatToIntBits(trackingInitialMoveThreshold); h$ *= 1000003; h$ ^= Float.floatToIntBits(trackingMultiFingerMoveThreshold); @@ -865,6 +891,7 @@ public class LocationComponentOptions implements Parcelable { in.readDouble(), in.readFloat(), in.readFloat(), + in.readInt() == 1, in.readFloat(), in.readFloat(), in.readString() @@ -961,6 +988,7 @@ public class LocationComponentOptions implements Parcelable { dest.writeDouble(minZoom()); dest.writeFloat(maxZoomIconScale()); dest.writeFloat(minZoomIconScale()); + dest.writeInt(trackingGesturesManagement() ? 1 : 0); dest.writeFloat(trackingInitialMoveThreshold()); dest.writeFloat(trackingMultiFingerMoveThreshold()); dest.writeString(layerBelow()); @@ -1023,6 +1051,7 @@ public class LocationComponentOptions implements Parcelable { private Double minZoom; private Float maxZoomIconScale; private Float minZoomIconScale; + private Boolean trackingGesturesManagement; private Float trackingInitialMoveThreshold; private Float trackingMultiFingerMoveThreshold; private String layerBelow; @@ -1058,6 +1087,7 @@ public class LocationComponentOptions implements Parcelable { this.minZoom = source.minZoom(); this.maxZoomIconScale = source.maxZoomIconScale(); this.minZoomIconScale = source.minZoomIconScale(); + this.trackingGesturesManagement = source.trackingGesturesManagement(); this.trackingInitialMoveThreshold = source.trackingInitialMoveThreshold(); this.trackingMultiFingerMoveThreshold = source.trackingMultiFingerMoveThreshold(); this.layerBelow = source.layerBelow(); @@ -1435,6 +1465,25 @@ public class LocationComponentOptions implements Parcelable { return this; } + /** + * Set whether gesture threshold should be adjusted when camera is in one of the tracking modes. + * This will adjust the focal point and increase thresholds to enable camera manipulation, + * like zooming in and out, without breaking tracking. + *

+ * Note: This can overwrite some of the gesture thresholds + * and the custom {@link com.mapbox.android.gestures.AndroidGesturesManager} that was set with + * {@link com.mapbox.mapboxsdk.maps.MapboxMap#setGesturesManager(AndroidGesturesManager, boolean, boolean)}. + * + * @param trackingGesturesManagement true if gestures should be adjusted when in one of the camera tracking modes, + * false otherwise + * @see Builder#trackingInitialMoveThreshold(float) + * @see Builder#trackingMultiFingerMoveThreshold(float) + */ + public LocationComponentOptions.Builder trackingGesturesManagement(boolean trackingGesturesManagement) { + this.trackingGesturesManagement = trackingGesturesManagement; + return this; + } + /** * Sets minimum single pointer movement (map pan) in pixels required to break camera tracking. * @@ -1516,6 +1565,9 @@ public class LocationComponentOptions implements Parcelable { if (this.minZoomIconScale == null) { missing += " minZoomIconScale"; } + if (this.trackingGesturesManagement == null) { + missing += " trackingGesturesManagement"; + } if (this.trackingInitialMoveThreshold == null) { missing += " trackingInitialMoveThreshold"; } @@ -1553,6 +1605,7 @@ public class LocationComponentOptions implements Parcelable { this.minZoom, this.maxZoomIconScale, this.minZoomIconScale, + trackingGesturesManagement, this.trackingInitialMoveThreshold, this.trackingMultiFingerMoveThreshold, this.layerBelow); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml b/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml index 62cc066bd6..b279252c41 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml +++ b/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml @@ -170,6 +170,7 @@ + diff --git a/platform/android/MapboxGLAndroidSDK/src/main/res/values/dimens.xml b/platform/android/MapboxGLAndroidSDK/src/main/res/values/dimens.xml index 453079d195..d2428d8d8f 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/res/values/dimens.xml +++ b/platform/android/MapboxGLAndroidSDK/src/main/res/values/dimens.xml @@ -17,5 +17,5 @@ 0.025dp 25dp - 125dp + 400dp diff --git a/platform/android/MapboxGLAndroidSDK/src/main/res/values/styles.xml b/platform/android/MapboxGLAndroidSDK/src/main/res/values/styles.xml index ac29065f24..122b76ba3f 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/res/values/styles.xml +++ b/platform/android/MapboxGLAndroidSDK/src/main/res/values/styles.xml @@ -18,7 +18,6 @@ true 30000 - 0 0 @@ -34,6 +33,7 @@ 0.6 + false @dimen/mapbox_locationComponentTrackingInitialMoveThreshold @dimen/mapbox_locationComponentTrackingMultiFingerMoveThreshold diff --git a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinatorTest.kt b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinatorTest.kt new file mode 100644 index 0000000000..a3ac653e81 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationAnimatorCoordinatorTest.kt @@ -0,0 +1,284 @@ +package com.mapbox.mapboxsdk.location + +import android.location.Location +import com.mapbox.mapboxsdk.camera.CameraPosition +import com.mapbox.mapboxsdk.geometry.LatLng +import com.mapbox.mapboxsdk.location.LocationComponentConstants.DEFAULT_TRACKING_TILT_ANIM_DURATION +import com.mapbox.mapboxsdk.location.LocationComponentConstants.DEFAULT_TRACKING_ZOOM_ANIM_DURATION +import com.mapbox.mapboxsdk.location.MapboxAnimator.* +import junit.framework.Assert.assertEquals +import junit.framework.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +class LocationAnimatorCoordinatorTest { + + private lateinit var locationAnimatorCoordinator: LocationAnimatorCoordinator + private val cameraPosition: CameraPosition = CameraPosition.DEFAULT + + @Before + fun setUp() { + locationAnimatorCoordinator = LocationAnimatorCoordinator() + } + + @Test + fun feedNewLocation_animatorsAreCreated() { + locationAnimatorCoordinator.feedNewLocation(Location(""), cameraPosition, false) + + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_LATLNG] != null) + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_GPS_BEARING] != null) + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_LATLNG] != null) + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_GPS_BEARING] != null) + } + + @Test + fun feedNewLocation_animatorValue() { + val location = Location("") + location.latitude = 51.0 + location.longitude = 17.0 + location.bearing = 35f + locationAnimatorCoordinator.feedNewLocation(location, cameraPosition, false) + + val cameraLatLngTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_LATLNG]?.target as LatLng + assertEquals(cameraLatLngTarget.latitude, cameraLatLngTarget.latitude) + + val layerLatLngTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_LATLNG]?.target as LatLng + assertEquals(layerLatLngTarget.latitude, layerLatLngTarget.latitude) + + val cameraBearingTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_GPS_BEARING]?.target as Float + assertEquals(location.bearing, cameraBearingTarget) + + val layerBearingTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_GPS_BEARING]?.target as Float + assertEquals(location.bearing, layerBearingTarget) + } + + @Test + fun feedNewLocation_isNorth_animatorsAreCreated() { + val location = Location("") + location.latitude = 51.0 + location.longitude = 17.0 + location.bearing = 35f + locationAnimatorCoordinator.feedNewLocation(location, cameraPosition, false) + + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_LATLNG] != null) + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_GPS_BEARING] != null) + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_LATLNG] != null) + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_GPS_BEARING] != null) + } + + @Test + fun feedNewLocation_isNorth_animatorValue() { + val location = Location("") + location.latitude = 51.0 + location.longitude = 17.0 + location.bearing = 35f + locationAnimatorCoordinator.feedNewLocation(location, cameraPosition, true) + + val cameraLatLngTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_LATLNG]?.target as LatLng + assertEquals(cameraLatLngTarget.latitude, cameraLatLngTarget.latitude) + + val layerLatLngTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_LATLNG]?.target as LatLng + assertEquals(layerLatLngTarget.latitude, layerLatLngTarget.latitude) + + val cameraBearingTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_GPS_BEARING]?.target as Float + assertEquals(0f, cameraBearingTarget) + + val layerBearingTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_GPS_BEARING]?.target as Float + assertEquals(location.bearing, layerBearingTarget) + } + + @Test + fun feedNewCompassBearing_animatorsAreCreated() { + locationAnimatorCoordinator.feedNewCompassBearing(77f, cameraPosition) + + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_COMPASS_BEARING] != null) + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_COMPASS_BEARING] != null) + } + + @Test + fun feedNewCompassBearing_animatorValue() { + val bearing = 77f + locationAnimatorCoordinator.feedNewCompassBearing(bearing, cameraPosition) + + val cameraBearingTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_COMPASS_BEARING]?.target as Float + assertEquals(bearing, cameraBearingTarget) + + val layerBearingTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_COMPASS_BEARING]?.target as Float + assertEquals(bearing, layerBearingTarget) + } + + @Test + fun feedNewAccuracyRadius_animatorsCreated() { + locationAnimatorCoordinator.feedNewAccuracyRadius(150f, false) + + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_ACCURACY] != null) + } + + @Test + fun feedNewAccuracyRadius_animatorValue() { + val accuracy = 150f + locationAnimatorCoordinator.feedNewAccuracyRadius(accuracy, false) + + val layerAccuracy = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_ACCURACY]?.target as Float + assertEquals(layerAccuracy, accuracy) + + val animationDuration = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_ACCURACY]?.duration as Long + assertEquals(LocationComponentConstants.ACCURACY_RADIUS_ANIMATION_DURATION, animationDuration) + } + + @Test + fun feedNewAccuracyRadius_noAnimation_animatorsCreated() { + locationAnimatorCoordinator.feedNewAccuracyRadius(150f, true) + + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_ACCURACY] != null) + } + + @Test + fun feedNewAccuracyRadius_noAnimation_animatorValue() { + val accuracy = 150f + locationAnimatorCoordinator.feedNewAccuracyRadius(accuracy, true) + + val layerAccuracy = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_ACCURACY]?.target as Float + assertEquals(layerAccuracy, accuracy) + + val animationDuration = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_ACCURACY]?.duration as Long + assertEquals(0L, animationDuration) + } + + @Test + fun feedNewZoomLevel_animatorsCreated() { + locationAnimatorCoordinator.feedNewZoomLevel( + 15.0, + cameraPosition, + DEFAULT_TRACKING_ZOOM_ANIM_DURATION, + null + ) + + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_ZOOM] != null) + } + + @Test + fun feedNewZoomLevel_animatorValue() { + val zoom = 15.0f + locationAnimatorCoordinator.feedNewZoomLevel( + zoom.toDouble(), + cameraPosition, + DEFAULT_TRACKING_ZOOM_ANIM_DURATION, + null + ) + + val animationDuration = locationAnimatorCoordinator.animatorMap[ANIMATOR_ZOOM]?.duration as Long + assertEquals(DEFAULT_TRACKING_ZOOM_ANIM_DURATION, animationDuration) + + val target = locationAnimatorCoordinator.animatorMap[ANIMATOR_ZOOM]?.target as Float + assertEquals(zoom, target) + } + + @Test + fun feedNewTiltLevel_animatorsCreated() { + locationAnimatorCoordinator.feedNewTilt( + 30.0, + cameraPosition, + DEFAULT_TRACKING_TILT_ANIM_DURATION, + null + ) + + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_TILT] != null) + } + + @Test + fun feedNewTiltLevel_animatorValue() { + val tilt = 30.0f + locationAnimatorCoordinator.feedNewTilt( + tilt.toDouble(), + cameraPosition, + DEFAULT_TRACKING_TILT_ANIM_DURATION, + null + ) + + val animationDuration = locationAnimatorCoordinator.animatorMap[ANIMATOR_TILT]?.duration as Long + assertEquals(DEFAULT_TRACKING_TILT_ANIM_DURATION, animationDuration) + + val target = locationAnimatorCoordinator.animatorMap[ANIMATOR_TILT]?.target as Float + assertEquals(tilt, target) + } + + @Test + fun cancelAllAnimators() { + locationAnimatorCoordinator.feedNewLocation(Location(""), cameraPosition, true) + locationAnimatorCoordinator.cancelAllAnimations() + + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_LATLNG] == null) + } + + @Test + fun cancelZoomAnimators() { + locationAnimatorCoordinator.feedNewZoomLevel( + 15.0, + cameraPosition, + DEFAULT_TRACKING_ZOOM_ANIM_DURATION, + null + ) + locationAnimatorCoordinator.cancelZoomAnimation() + + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_ZOOM] == null) + } + + @Test + fun cancelTiltAnimation() { + locationAnimatorCoordinator.feedNewTilt( + 30.0, + cameraPosition, + DEFAULT_TRACKING_TILT_ANIM_DURATION, + null + ) + + locationAnimatorCoordinator.cancelTiltAnimation() + + assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_TILT] == null) + } + + @Test + fun resetAllCameraAnimations_empty() { + locationAnimatorCoordinator.resetAllCameraAnimations(cameraPosition, false) + assertTrue(locationAnimatorCoordinator.animatorMap.isEmpty()) + } + + @Test + fun addLayerListener() { + val layerListener = Mockito.mock(OnLayerAnimationsValuesChangeListener::class.java) + locationAnimatorCoordinator.addLayerListener(layerListener) + + assertTrue(locationAnimatorCoordinator.layerListeners.contains(layerListener)) + } + + @Test + fun removeLayerListener() { + val layerListener = Mockito.mock(OnLayerAnimationsValuesChangeListener::class.java) + locationAnimatorCoordinator.addLayerListener(layerListener) + locationAnimatorCoordinator.removeLayerListener(layerListener) + + assertTrue(locationAnimatorCoordinator.layerListeners.isEmpty()) + } + + @Test + fun addCameraListener() { + val cameraListener = Mockito.mock(OnCameraAnimationsValuesChangeListener::class.java) + locationAnimatorCoordinator.addCameraListener(cameraListener) + + assertTrue(locationAnimatorCoordinator.cameraListeners.contains(cameraListener)) + } + + @Test + fun removeCameraListener() { + val cameraListener = Mockito.mock(OnCameraAnimationsValuesChangeListener::class.java) + locationAnimatorCoordinator.addCameraListener(cameraListener) + locationAnimatorCoordinator.removeCameraListener(cameraListener) + + assertTrue(locationAnimatorCoordinator.cameraListeners.isEmpty()) + } +} \ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationCameraControllerTest.java b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationCameraControllerTest.java index de0d67613e..bcd9e68509 100644 --- a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationCameraControllerTest.java +++ b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/LocationCameraControllerTest.java @@ -2,6 +2,7 @@ package com.mapbox.mapboxsdk.location; import android.graphics.PointF; +import com.mapbox.android.gestures.AndroidGesturesManager; import com.mapbox.android.gestures.MoveGestureDetector; import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.camera.CameraUpdate; @@ -314,8 +315,9 @@ public class LocationCameraControllerTest { when(mapboxMap.getUiSettings()).thenReturn(mock(UiSettings.class)); MoveGestureDetector moveGestureDetector = mock(MoveGestureDetector.class); OnCameraMoveInvalidateListener onCameraMoveInvalidateListener = mock(OnCameraMoveInvalidateListener.class); + AndroidGesturesManager androidGesturesManager = mock(AndroidGesturesManager.class); return new LocationCameraController(mapboxMap, moveGestureDetector, - onCameraTrackingChangedListener, onCameraMoveInvalidateListener); + onCameraTrackingChangedListener, onCameraMoveInvalidateListener, androidGesturesManager); } private LocationCameraController buildCamera(MoveGestureDetector moveGestureDetector) { @@ -323,15 +325,17 @@ public class LocationCameraControllerTest { when(mapboxMap.getUiSettings()).thenReturn(mock(UiSettings.class)); OnCameraTrackingChangedListener onCameraTrackingChangedListener = mock(OnCameraTrackingChangedListener.class); OnCameraMoveInvalidateListener onCameraMoveInvalidateListener = mock(OnCameraMoveInvalidateListener.class); + AndroidGesturesManager androidGesturesManager = mock(AndroidGesturesManager.class); return new LocationCameraController(mapboxMap, moveGestureDetector, - onCameraTrackingChangedListener, onCameraMoveInvalidateListener); + onCameraTrackingChangedListener, onCameraMoveInvalidateListener, androidGesturesManager); } private LocationCameraController buildCamera(MapboxMap mapboxMap) { MoveGestureDetector moveGestureDetector = mock(MoveGestureDetector.class); OnCameraTrackingChangedListener onCameraTrackingChangedListener = mock(OnCameraTrackingChangedListener.class); OnCameraMoveInvalidateListener onCameraMoveInvalidateListener = mock(OnCameraMoveInvalidateListener.class); + AndroidGesturesManager androidGesturesManager = mock(AndroidGesturesManager.class); return new LocationCameraController(mapboxMap, moveGestureDetector, - onCameraTrackingChangedListener, onCameraMoveInvalidateListener); + onCameraTrackingChangedListener, onCameraMoveInvalidateListener, androidGesturesManager); } } diff --git a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/MapboxAnimatorCoordinatorTest.kt b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/MapboxAnimatorCoordinatorTest.kt deleted file mode 100644 index fb4dcd580c..0000000000 --- a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/location/MapboxAnimatorCoordinatorTest.kt +++ /dev/null @@ -1,284 +0,0 @@ -package com.mapbox.mapboxsdk.location - -import android.location.Location -import com.mapbox.mapboxsdk.camera.CameraPosition -import com.mapbox.mapboxsdk.geometry.LatLng -import com.mapbox.mapboxsdk.location.LocationComponentConstants.DEFAULT_TRACKING_TILT_ANIM_DURATION -import com.mapbox.mapboxsdk.location.LocationComponentConstants.DEFAULT_TRACKING_ZOOM_ANIM_DURATION -import com.mapbox.mapboxsdk.location.MapboxAnimator.* -import junit.framework.Assert.assertEquals -import junit.framework.Assert.assertTrue -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.Mockito -import org.robolectric.RobolectricTestRunner - -@RunWith(RobolectricTestRunner::class) -class MapboxAnimatorCoordinatorTest { - - private lateinit var locationAnimatorCoordinator: LocationAnimatorCoordinator - private val cameraPosition: CameraPosition = CameraPosition.DEFAULT - - @Before - fun setUp() { - locationAnimatorCoordinator = LocationAnimatorCoordinator() - } - - @Test - fun feedNewLocation_animatorsAreCreated() { - locationAnimatorCoordinator.feedNewLocation(Location(""), cameraPosition, false) - - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_LATLNG] != null) - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_GPS_BEARING] != null) - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_LATLNG] != null) - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_GPS_BEARING] != null) - } - - @Test - fun feedNewLocation_animatorValue() { - val location = Location("") - location.latitude = 51.0 - location.longitude = 17.0 - location.bearing = 35f - locationAnimatorCoordinator.feedNewLocation(location, cameraPosition, false) - - val cameraLatLngTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_LATLNG]?.target as LatLng - assertEquals(cameraLatLngTarget.latitude, cameraLatLngTarget.latitude) - - val layerLatLngTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_LATLNG]?.target as LatLng - assertEquals(layerLatLngTarget.latitude, layerLatLngTarget.latitude) - - val cameraBearingTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_GPS_BEARING]?.target as Float - assertEquals(location.bearing, cameraBearingTarget) - - val layerBearingTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_GPS_BEARING]?.target as Float - assertEquals(location.bearing, layerBearingTarget) - } - - @Test - fun feedNewLocation_isNorth_animatorsAreCreated() { - val location = Location("") - location.latitude = 51.0 - location.longitude = 17.0 - location.bearing = 35f - locationAnimatorCoordinator.feedNewLocation(location, cameraPosition, false) - - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_LATLNG] != null) - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_GPS_BEARING] != null) - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_LATLNG] != null) - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_GPS_BEARING] != null) - } - - @Test - fun feedNewLocation_isNorth_animatorValue() { - val location = Location("") - location.latitude = 51.0 - location.longitude = 17.0 - location.bearing = 35f - locationAnimatorCoordinator.feedNewLocation(location, cameraPosition, true) - - val cameraLatLngTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_LATLNG]?.target as LatLng - assertEquals(cameraLatLngTarget.latitude, cameraLatLngTarget.latitude) - - val layerLatLngTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_LATLNG]?.target as LatLng - assertEquals(layerLatLngTarget.latitude, layerLatLngTarget.latitude) - - val cameraBearingTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_GPS_BEARING]?.target as Float - assertEquals(0f, cameraBearingTarget) - - val layerBearingTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_GPS_BEARING]?.target as Float - assertEquals(location.bearing, layerBearingTarget) - } - - @Test - fun feedNewCompassBearing_animatorsAreCreated() { - locationAnimatorCoordinator.feedNewCompassBearing(77f, cameraPosition) - - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_COMPASS_BEARING] != null) - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_COMPASS_BEARING] != null) - } - - @Test - fun feedNewCompassBearing_animatorValue() { - val bearing = 77f - locationAnimatorCoordinator.feedNewCompassBearing(bearing, cameraPosition) - - val cameraBearingTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_COMPASS_BEARING]?.target as Float - assertEquals(bearing, cameraBearingTarget) - - val layerBearingTarget = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_COMPASS_BEARING]?.target as Float - assertEquals(bearing, layerBearingTarget) - } - - @Test - fun feedNewAccuracyRadius_animatorsCreated() { - locationAnimatorCoordinator.feedNewAccuracyRadius(150f, false) - - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_ACCURACY] != null) - } - - @Test - fun feedNewAccuracyRadius_animatorValue() { - val accuracy = 150f - locationAnimatorCoordinator.feedNewAccuracyRadius(accuracy, false) - - val layerAccuracy = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_ACCURACY]?.target as Float - assertEquals(layerAccuracy, accuracy) - - val animationDuration = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_ACCURACY]?.duration as Long - assertEquals(LocationComponentConstants.ACCURACY_RADIUS_ANIMATION_DURATION, animationDuration) - } - - @Test - fun feedNewAccuracyRadius_noAnimation_animatorsCreated() { - locationAnimatorCoordinator.feedNewAccuracyRadius(150f, true) - - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_ACCURACY] != null) - } - - @Test - fun feedNewAccuracyRadius_noAnimation_animatorValue() { - val accuracy = 150f - locationAnimatorCoordinator.feedNewAccuracyRadius(accuracy, true) - - val layerAccuracy = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_ACCURACY]?.target as Float - assertEquals(layerAccuracy, accuracy) - - val animationDuration = locationAnimatorCoordinator.animatorMap[ANIMATOR_LAYER_ACCURACY]?.duration as Long - assertEquals(0L, animationDuration) - } - - @Test - fun feedNewZoomLevel_animatorsCreated() { - locationAnimatorCoordinator.feedNewZoomLevel( - 15.0, - cameraPosition, - DEFAULT_TRACKING_ZOOM_ANIM_DURATION, - null - ) - - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_ZOOM] != null) - } - - @Test - fun feedNewZoomLevel_animatorValue() { - val zoom = 15.0f - locationAnimatorCoordinator.feedNewZoomLevel( - zoom.toDouble(), - cameraPosition, - DEFAULT_TRACKING_ZOOM_ANIM_DURATION, - null - ) - - val animationDuration = locationAnimatorCoordinator.animatorMap[ANIMATOR_ZOOM]?.duration as Long - assertEquals(DEFAULT_TRACKING_ZOOM_ANIM_DURATION, animationDuration) - - val target = locationAnimatorCoordinator.animatorMap[ANIMATOR_ZOOM]?.target as Float - assertEquals(zoom, target) - } - - @Test - fun feedNewTiltLevel_animatorsCreated() { - locationAnimatorCoordinator.feedNewTilt( - 30.0, - cameraPosition, - DEFAULT_TRACKING_TILT_ANIM_DURATION, - null - ) - - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_TILT] != null) - } - - @Test - fun feedNewTiltLevel_animatorValue() { - val tilt = 30.0f - locationAnimatorCoordinator.feedNewTilt( - tilt.toDouble(), - cameraPosition, - DEFAULT_TRACKING_TILT_ANIM_DURATION, - null - ) - - val animationDuration = locationAnimatorCoordinator.animatorMap[ANIMATOR_TILT]?.duration as Long - assertEquals(DEFAULT_TRACKING_TILT_ANIM_DURATION, animationDuration) - - val target = locationAnimatorCoordinator.animatorMap[ANIMATOR_TILT]?.target as Float - assertEquals(tilt, target) - } - - @Test - fun cancelAllAnimators() { - locationAnimatorCoordinator.feedNewLocation(Location(""), cameraPosition, true) - locationAnimatorCoordinator.cancelAllAnimations() - - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_CAMERA_LATLNG] == null) - } - - @Test - fun cancelZoomAnimators() { - locationAnimatorCoordinator.feedNewZoomLevel( - 15.0, - cameraPosition, - DEFAULT_TRACKING_ZOOM_ANIM_DURATION, - null - ) - locationAnimatorCoordinator.cancelZoomAnimation() - - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_ZOOM] == null) - } - - @Test - fun cancelTiltAnimation() { - locationAnimatorCoordinator.feedNewTilt( - 30.0, - cameraPosition, - DEFAULT_TRACKING_TILT_ANIM_DURATION, - null - ) - - locationAnimatorCoordinator.cancelTiltAnimation() - - assertTrue(locationAnimatorCoordinator.animatorMap[ANIMATOR_TILT] == null) - } - - @Test - fun resetAllCameraAnimations_empty() { - locationAnimatorCoordinator.resetAllCameraAnimations(cameraPosition, false) - assertTrue(locationAnimatorCoordinator.animatorMap.isEmpty()) - } - - @Test - fun addLayerListener() { - val layerListener = Mockito.mock(OnLayerAnimationsValuesChangeListener::class.java) - locationAnimatorCoordinator.addLayerListener(layerListener) - - assertTrue(locationAnimatorCoordinator.layerListeners.contains(layerListener)) - } - - @Test - fun removeLayerListener() { - val layerListener = Mockito.mock(OnLayerAnimationsValuesChangeListener::class.java) - locationAnimatorCoordinator.addLayerListener(layerListener) - locationAnimatorCoordinator.removeLayerListener(layerListener) - - assertTrue(locationAnimatorCoordinator.layerListeners.isEmpty()) - } - - @Test - fun addCameraListener() { - val cameraListener = Mockito.mock(OnCameraAnimationsValuesChangeListener::class.java) - locationAnimatorCoordinator.addCameraListener(cameraListener) - - assertTrue(locationAnimatorCoordinator.cameraListeners.contains(cameraListener)) - } - - @Test - fun removeCameraListener() { - val cameraListener = Mockito.mock(OnCameraAnimationsValuesChangeListener::class.java) - locationAnimatorCoordinator.addCameraListener(cameraListener) - locationAnimatorCoordinator.removeCameraListener(cameraListener) - - assertTrue(locationAnimatorCoordinator.cameraListeners.isEmpty()) - } -} \ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationModesActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationModesActivity.java index f2f57c854d..72bd91108a 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationModesActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/location/LocationModesActivity.java @@ -158,6 +158,12 @@ public class LocationModesActivity extends AppCompatActivity implements OnMapRea } else if (id == R.id.action_component_enabled) { activateLocationComponent(); return true; + } else if (id == R.id.action_gestures_management_disabled) { + disableGesturesManagement(); + return true; + } else if (id == R.id.action_gestures_management_enabled) { + enableGesturesManagement(); + return true; } return super.onOptionsItemSelected(item); @@ -192,18 +198,36 @@ public class LocationModesActivity extends AppCompatActivity implements OnMapRea } } - public void toggleStyle() { + private void toggleStyle() { customStyle = !customStyle; locationComponent.applyStyle( this, customStyle ? R.style.CustomLocationComponent : R.style.mapbox_LocationComponent); } - public void toggleMapStyle() { + private void toggleMapStyle() { String styleUrl = mapboxMap.getStyleUrl().contentEquals(Style.DARK) ? Style.LIGHT : Style.DARK; mapboxMap.setStyle(styleUrl); } + private void disableGesturesManagement() { + LocationComponentOptions options = locationComponent + .getLocationComponentOptions() + .toBuilder() + .trackingGesturesManagement(false) + .build(); + locationComponent.applyStyle(options); + } + + private void enableGesturesManagement() { + LocationComponentOptions options = locationComponent + .getLocationComponentOptions() + .toBuilder() + .trackingGesturesManagement(true) + .build(); + locationComponent.applyStyle(options); + } + @Override @SuppressWarnings( {"MissingPermission"}) protected void onStart() { diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_location_mode.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_location_mode.xml index 7004999f88..302ab33bc2 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_location_mode.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_location_mode.xml @@ -10,11 +10,18 @@ app:showAsAction="never"/> - + + + + \ No newline at end of file -- cgit v1.2.1