From 17b19b3b4a04302ee50ea9044c46cebe1fb8756d Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Fri, 28 Feb 2020 18:17:08 +0800 Subject: [PATCH] Add min and max pitch options (#199) * Add min and max pitch options * Add min and max pitch into attrs * Update gl-native submodule --- .../mapboxsdk/constants/MapboxConstants.java | 10 +++ .../com/mapbox/mapboxsdk/maps/MapboxMap.java | 60 ++++++++++++++++++ .../mapboxsdk/maps/MapboxMapOptions.java | 63 +++++++++++++++++++ .../com/mapbox/mapboxsdk/maps/NativeMap.java | 15 ++++- .../mapbox/mapboxsdk/maps/NativeMapView.java | 53 ++++++++++++++-- .../com/mapbox/mapboxsdk/maps/Transform.java | 26 ++++++++ .../src/main/res-public/values/public.xml | 4 ++ .../src/main/res/values/attrs.xml | 4 ++ .../mapboxsdk/maps/MapboxMapOptionsTest.java | 14 +++++ .../mapbox/mapboxsdk/maps/MapboxMapTest.kt | 12 ++++ .../mapbox/mapboxsdk/maps/TransformTest.kt | 14 +++++ .../mapboxsdk/maps/NativeMapViewTest.kt | 18 ++++++ vendor/mapbox-gl-native | 2 +- 13 files changed, 287 insertions(+), 8 deletions(-) diff --git a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java index 42aa9206e..ce7a919f3 100644 --- a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java +++ b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java @@ -144,6 +144,16 @@ public class MapboxConstants { */ public static final float MAXIMUM_ZOOM = 25.5f; + /** + * The currently supported minimum pitch level. + */ + public static final float MINIMUM_PITCH = 0.0f; + + /** + * The currently supported maximum pitch level. + */ + public static final float MAXIMUM_PITCH = 60.0f; + /** * The currently supported maximum tilt value. */ diff --git a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java index 970ea9801..286e48fe8 100644 --- a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java +++ b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java @@ -365,6 +365,66 @@ public final class MapboxMap { return transform.getMaxZoom(); } + // + // MinPitch + // + + /** + *

+ * Sets the minimum Pitch the map can be displayed at. + *

+ * + *

+ * The default and lower bound for minPitch Pitch is 0. + *

+ * @param minPitch The new minimum Pitch. + */ + public void setMinPitchPreference( + @FloatRange(from = MapboxConstants.MINIMUM_PITCH, to = MapboxConstants.MAXIMUM_PITCH) double minPitch) { + transform.setMinPitch(minPitch); + } + + /** + *

+ * Gets the minimum Pitch the map can be displayed at. + *

+ * + * @return The minimum Pitch. + */ + public double getMinPitch() { + return transform.getMinPitch(); + } + + // + // MaxPitch + // + + /** + *

+ * Sets the maximum Pitch the map can be displayed at. + *

+ *

+ * The default and upper bound for maximum Pitch is 60. + *

+ * + * @param maxPitch The new maximum Pitch. + */ + public void setMaxPitchPreference(@FloatRange(from = MapboxConstants.MINIMUM_PITCH, + to = MapboxConstants.MAXIMUM_PITCH) double maxPitch) { + transform.setMaxPitch(maxPitch); + } + + /** + *

+ * Gets the maximum Pitch the map can be displayed at. + *

+ * + * @return The maximum Pitch. + */ + public double getMaxPitch() { + return transform.getMaxPitch(); + } + // // UiSettings // diff --git a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java index 3a2040095..bb136bfbf 100644 --- a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java +++ b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java @@ -64,6 +64,8 @@ public class MapboxMapOptions implements Parcelable { private double minZoom = MapboxConstants.MINIMUM_ZOOM; private double maxZoom = MapboxConstants.MAXIMUM_ZOOM; + private double minPitch = MapboxConstants.MINIMUM_PITCH; + private double maxPitch = MapboxConstants.MAXIMUM_PITCH; private boolean rotateGesturesEnabled = true; private boolean scrollGesturesEnabled = true; @@ -127,6 +129,8 @@ public class MapboxMapOptions implements Parcelable { minZoom = in.readDouble(); maxZoom = in.readDouble(); + minPitch = in.readDouble(); + maxPitch = in.readDouble(); rotateGesturesEnabled = in.readByte() != 0; scrollGesturesEnabled = in.readByte() != 0; @@ -210,6 +214,10 @@ public class MapboxMapOptions implements Parcelable { MapboxConstants.MAXIMUM_ZOOM)); mapboxMapOptions.minZoomPreference(typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_cameraZoomMin, MapboxConstants.MINIMUM_ZOOM)); + mapboxMapOptions.maxPitchPreference(typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_cameraPitchMax, + MapboxConstants.MAXIMUM_PITCH)); + mapboxMapOptions.minPitchPreference(typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_cameraPitchMin, + MapboxConstants.MINIMUM_PITCH)); mapboxMapOptions.compassEnabled(typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_uiCompass, true)); mapboxMapOptions.compassGravity(typedArray.getInt(R.styleable.mapbox_MapView_mapbox_uiCompassGravity, @@ -378,6 +386,31 @@ public class MapboxMapOptions implements Parcelable { return this; } + + /** + * Specifies the used minimum pitch for a map view. + * + * @param minPitch Pitch to be used + * @return This + */ + @NonNull + public MapboxMapOptions minPitchPreference(double minPitch) { + this.minPitch = minPitch; + return this; + } + + /** + * Specifies the used maximum pitch for a map view. + * + * @param maxPitch Pitch to be used + * @return This + */ + @NonNull + public MapboxMapOptions maxPitchPreference(double maxPitch) { + this.maxPitch = maxPitch; + return this; + } + /** * Specifies the visibility state of a mapbox_compass_icon for a map view. * @@ -854,6 +887,24 @@ public class MapboxMapOptions implements Parcelable { return maxZoom; } + /** + * Get the current configured min pitch for a map view. + * + * @return Mininum pitch to be used. + */ + public double getMinPitchPreference() { + return minPitch; + } + + /** + * Get the current configured maximum pitch for a map view. + * + * @return Maximum pitch to be used. + */ + public double getMaxPitchPreference() { + return maxPitch; + } + /** * Get the current configured visibility state for mapbox_compass_icon for a map view. * @@ -1132,6 +1183,8 @@ public class MapboxMapOptions implements Parcelable { dest.writeDouble(minZoom); dest.writeDouble(maxZoom); + dest.writeDouble(minPitch); + dest.writeDouble(maxPitch); dest.writeByte((byte) (rotateGesturesEnabled ? 1 : 0)); dest.writeByte((byte) (scrollGesturesEnabled ? 1 : 0)); @@ -1204,6 +1257,12 @@ public class MapboxMapOptions implements Parcelable { if (Double.compare(options.maxZoom, maxZoom) != 0) { return false; } + if (Double.compare(options.minPitch, minPitch) != 0) { + return false; + } + if (Double.compare(options.maxPitch, maxPitch) != 0) { + return false; + } if (rotateGesturesEnabled != options.rotateGesturesEnabled) { return false; } @@ -1292,6 +1351,10 @@ public class MapboxMapOptions implements Parcelable { result = 31 * result + (int) (temp ^ (temp >>> 32)); temp = Double.doubleToLongBits(maxZoom); result = 31 * result + (int) (temp ^ (temp >>> 32)); + temp = Double.doubleToLongBits(minPitch); + result = 31 * result + (int) (temp ^ (temp >>> 32)); + temp = Double.doubleToLongBits(maxPitch); + result = 31 * result + (int) (temp ^ (temp >>> 32)); result = 31 * result + (rotateGesturesEnabled ? 1 : 0); result = 31 * result + (scrollGesturesEnabled ? 1 : 0); result = 31 * result + (horizontalScrollGesturesEnabled ? 1 : 0); diff --git a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMap.java b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMap.java index a601096a6..81ff438c6 100644 --- a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMap.java +++ b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMap.java @@ -3,9 +3,6 @@ package com.mapbox.mapboxsdk.maps; import android.graphics.Bitmap; import android.graphics.PointF; import android.graphics.RectF; -import androidx.annotation.IntRange; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import com.mapbox.geojson.Feature; import com.mapbox.geojson.Geometry; @@ -24,6 +21,10 @@ import com.mapbox.mapboxsdk.style.sources.Source; import java.util.List; +import androidx.annotation.IntRange; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + interface NativeMap { // @@ -85,6 +86,14 @@ interface NativeMap { double getMaxZoom(); + void setMinPitch(double pitch); + + double getMinPitch(); + + void setMaxPitch(double pitch); + + double getMaxPitch(); + void resetZoom(); void rotateBy(double sx, double sy, double ex, double ey, long duration); diff --git a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java index dfeac768c..05ebf36d6 100755 --- a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java +++ b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java @@ -5,10 +5,6 @@ import android.graphics.Bitmap; import android.graphics.PointF; import android.graphics.RectF; import android.os.Handler; -import androidx.annotation.IntRange; -import androidx.annotation.Keep; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import android.text.TextUtils; import com.mapbox.geojson.Feature; @@ -40,6 +36,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import androidx.annotation.IntRange; +import androidx.annotation.Keep; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + // Class that wraps the native methods for convenience final class NativeMapView implements NativeMap { @@ -370,6 +371,38 @@ final class NativeMapView implements NativeMap { return nativeGetMaxZoom(); } + @Override + public void setMinPitch(double pitch) { + if (checkState("setMinPitch")) { + return; + } + nativeSetMinPitch(pitch); + } + + @Override + public double getMinPitch() { + if (checkState("getMinPitch")) { + return 0; + } + return nativeGetMinPitch(); + } + + @Override + public void setMaxPitch(double pitch) { + if (checkState("setMaxPitch")) { + return; + } + nativeSetMaxPitch(pitch); + } + + @Override + public double getMaxPitch() { + if (checkState("getMaxPitch")) { + return 0; + } + return nativeGetMaxPitch(); + } + @Override public void rotateBy(double sx, double sy, double ex, double ey, long duration) { @@ -1205,6 +1238,18 @@ final class NativeMapView implements NativeMap { @Keep private native double nativeGetMaxZoom(); + @Keep + private native void nativeSetMinPitch(double pitch); + + @Keep + private native double nativeGetMinPitch(); + + @Keep + private native void nativeSetMaxPitch(double pitch); + + @Keep + private native double nativeGetMaxPitch(); + @Keep private native void nativeRotateBy(double sx, double sy, double ex, double ey, long duration); diff --git a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java index 9e8fb8420..efd3efe8c 100644 --- a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java +++ b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java @@ -61,6 +61,8 @@ public final class Transform implements MapView.OnCameraDidChangeListener { } setMinZoom(options.getMinZoomPreference()); setMaxZoom(options.getMaxZoomPreference()); + setMinPitch(options.getMinPitchPreference()); + setMaxPitch(options.getMaxPitchPreference()); } // @@ -338,4 +340,28 @@ public final class Transform implements MapView.OnCameraDidChangeListener { double getMaxZoom() { return nativeMap.getMaxZoom(); } + + void setMinPitch(double minPitch) { + if ((minPitch < MapboxConstants.MINIMUM_PITCH) || (minPitch > MapboxConstants.MAXIMUM_PITCH)) { + Logger.e(TAG, String.format("Not setting minPitchPreference, value is in unsupported range: %s", minPitch)); + return; + } + nativeMap.setMinPitch(minPitch); + } + + double getMinPitch() { + return nativeMap.getMinPitch(); + } + + void setMaxPitch(double maxPitch) { + if ((maxPitch < MapboxConstants.MINIMUM_PITCH) || (maxPitch > MapboxConstants.MAXIMUM_PITCH)) { + Logger.e(TAG, String.format("Not setting maxPitchPreference, value is in unsupported range: %s", maxPitch)); + return; + } + nativeMap.setMaxPitch(maxPitch); + } + + double getMaxPitch() { + return nativeMap.getMaxPitch(); + } } diff --git a/MapboxGLAndroidSDK/src/main/res-public/values/public.xml b/MapboxGLAndroidSDK/src/main/res-public/values/public.xml index 83c25432d..b79a5494d 100644 --- a/MapboxGLAndroidSDK/src/main/res-public/values/public.xml +++ b/MapboxGLAndroidSDK/src/main/res-public/values/public.xml @@ -28,6 +28,10 @@ + + + + diff --git a/MapboxGLAndroidSDK/src/main/res/values/attrs.xml b/MapboxGLAndroidSDK/src/main/res/values/attrs.xml index a38f6e9fb..2b9022c96 100644 --- a/MapboxGLAndroidSDK/src/main/res/values/attrs.xml +++ b/MapboxGLAndroidSDK/src/main/res/values/attrs.xml @@ -23,6 +23,10 @@ + + + + diff --git a/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapOptionsTest.java b/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapOptionsTest.java index b72b34210..ae98ee256 100644 --- a/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapOptionsTest.java +++ b/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapOptionsTest.java @@ -121,6 +121,20 @@ public class MapboxMapOptionsTest { assertNotEquals(2.0f, new MapboxMapOptions().maxZoomPreference(5.0f).getMaxZoomPreference(), DELTA); } + @Test + public void testMinPitch() { + assertEquals(MapboxConstants.MINIMUM_PITCH, new MapboxMapOptions().getMinPitchPreference(), DELTA); + assertEquals(5.0f, new MapboxMapOptions().minPitchPreference(5.0f).getMinPitchPreference(), DELTA); + assertNotEquals(2.0f, new MapboxMapOptions().minPitchPreference(5.0f).getMinPitchPreference(), DELTA); + } + + @Test + public void testMaxPitch() { + assertEquals(MapboxConstants.MAXIMUM_PITCH, new MapboxMapOptions().getMaxPitchPreference(), DELTA); + assertEquals(5.0f, new MapboxMapOptions().maxPitchPreference(5.0f).getMaxPitchPreference(), DELTA); + assertNotEquals(2.0f, new MapboxMapOptions().maxPitchPreference(5.0f).getMaxPitchPreference(), DELTA); + } + @Test public void testTiltGesturesEnabled() { assertTrue(new MapboxMapOptions().getTiltGesturesEnabled()); diff --git a/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.kt b/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.kt index 6647fe559..d78579223 100644 --- a/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.kt +++ b/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.kt @@ -113,6 +113,18 @@ class MapboxMapTest { verify { transform.maxZoom = 10.0 } } + @Test + fun testMinPitch() { + mapboxMap.setMinPitchPreference(10.0) + verify { transform.minPitch = 10.0 } + } + + @Test + fun testMaxPitch() { + mapboxMap.setMaxPitchPreference(10.0) + verify { transform.maxPitch = 10.0 } + } + @Test fun testFpsListener() { val fpsChangedListener = mockk() diff --git a/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/TransformTest.kt b/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/TransformTest.kt index fddf7eeaf..d157687e0 100644 --- a/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/TransformTest.kt +++ b/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/TransformTest.kt @@ -30,6 +30,8 @@ class TransformTest { every { nativeMapView.flyTo(any(), any(), any(), any(), any(), any()) } answers {} every { nativeMapView.minZoom = any() } answers {} every { nativeMapView.maxZoom = any() } answers {} + every { nativeMapView.minPitch = any() } answers {} + every { nativeMapView.maxPitch = any() } answers {} } @Test @@ -157,6 +159,18 @@ class TransformTest { verify { nativeMapView.maxZoom = 10.0 } } + @Test + fun testMinPitch() { + transform.minPitch = 10.0 + verify { nativeMapView.minPitch = 10.0 } + } + + @Test + fun testMaxPitch() { + transform.maxPitch = 10.0 + verify { nativeMapView.maxPitch = 10.0 } + } + @Test fun testCancelNotInvokedFromOnFinish() { val slot = slot() diff --git a/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/maps/NativeMapViewTest.kt b/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/maps/NativeMapViewTest.kt index fd4cb228d..cc614fbb9 100644 --- a/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/maps/NativeMapViewTest.kt +++ b/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/maps/NativeMapViewTest.kt @@ -268,6 +268,24 @@ class NativeMapViewTest : AppCenter() { assertEquals("Max zoom should match", expected, actual) } + @Test + @UiThreadTest + fun testSetMinPitch() { + val expected = 60.0 + nativeMapView.minPitch = expected + val actual = nativeMapView.minPitch + assertEquals("Min Pitch should match", expected, actual, 0.01) + } + + @Test + @UiThreadTest + fun testSetMaxPitch() { + val expected = 60.0 + nativeMapView.maxPitch = expected + val actual = nativeMapView.maxPitch + assertEquals("Max Pitch should match", expected, actual, 0.01) + } + @Test @UiThreadTest fun testGetProjectedMetersAtLatitude() { diff --git a/vendor/mapbox-gl-native b/vendor/mapbox-gl-native index 43c1aac7e..e0c2b3e77 160000 --- a/vendor/mapbox-gl-native +++ b/vendor/mapbox-gl-native @@ -1 +1 @@ -Subproject commit 43c1aac7e800d5f1695fd08639a2db5c1e1dd1af +Subproject commit e0c2b3e771bdd4a23bb7442240ccc3dbf1c1c57a