diff options
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main')
24 files changed, 3441 insertions, 228 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/LibraryLoader.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/LibraryLoader.java index a024f0ab70..6633d5d952 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/LibraryLoader.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/LibraryLoader.java @@ -3,18 +3,46 @@ package com.mapbox.mapboxsdk; import timber.log.Timber; /** - * Centralises the knowledge about "mapbox-gl" library loading. + * Loads the mapbox-gl shared library + * <p> + * By default uses the {@link System#loadLibrary(String)}, + * use {@link #setLibraryLoader(LibraryLoader)} to provide an alternative library loading hook. + * </p> */ -public class LibraryLoader { +public abstract class LibraryLoader { + + private static final LibraryLoader DEFAULT = new LibraryLoader() { + @Override + public void load(String name) { + System.loadLibrary(name); + } + }; + + private static volatile LibraryLoader loader = DEFAULT; + + /** + * Set the library loader that loads the shared library. + * + * @param libraryLoader the library loader + */ + public static void setLibraryLoader(LibraryLoader libraryLoader) { + loader = libraryLoader; + } /** * Loads "libmapbox-gl.so" native shared library. + * <p> + * Catches UnsatisfiedLinkErrors and prints a warning to logcat. + * </p> */ public static void load() { try { - System.loadLibrary("mapbox-gl"); + loader.load("mapbox-gl"); } catch (UnsatisfiedLinkError error) { Timber.e(error, "Failed to load native shared library."); } } + + public abstract void load(String name); } + diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/Mapbox.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/Mapbox.java index 357bcd5f99..b67b6e96f2 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/Mapbox.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/Mapbox.java @@ -12,10 +12,10 @@ import com.mapbox.mapboxsdk.constants.MapboxConstants; import com.mapbox.mapboxsdk.exceptions.MapboxConfigurationException; import com.mapbox.mapboxsdk.location.LocationSource; import com.mapbox.mapboxsdk.net.ConnectivityReceiver; +import com.mapbox.services.android.telemetry.MapboxTelemetry; import com.mapbox.services.android.telemetry.location.LocationEngine; import com.mapbox.services.android.telemetry.location.LocationEnginePriority; import com.mapbox.services.android.telemetry.location.LocationEngineProvider; -import com.mapbox.services.android.telemetry.MapboxTelemetry; import timber.log.Timber; diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/GeometryConstants.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/GeometryConstants.java new file mode 100644 index 0000000000..1a7544d33a --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/GeometryConstants.java @@ -0,0 +1,63 @@ +package com.mapbox.mapboxsdk.constants; + +/** + * Contains constants used throughout the sdk classes. + * + * @since 6.0.0 + */ +public class GeometryConstants { + + /** + * The <a href='http://en.wikipedia.org/wiki/Earth_radius#Equatorial_radius'>equatorial radius</a> + * value in meters + * + * @since 6.0.0 + */ + public static final int RADIUS_EARTH_METERS = 6378137; + + /** + * This constant represents the lowest longitude value available to represent a geolocation. + * + * @since 6.0.0 + */ + public static final double MIN_LONGITUDE = -180; + + /** + * This constant represents the highest longitude value available to represent a geolocation. + * + * @since 6.0.0 + */ + public static final double MAX_LONGITUDE = 180; + + /** + * This constant represents the lowest latitude value available to represent a geolocation. + * + * @since 6.0.0 + */ + public static final double MIN_LATITUDE = -90; + + /** + * This constant represents the highest latitude value available to represent a geolocation. + * + * @since 6.0.0 + */ + public static final double MAX_LATITUDE = 90; + + /** + * Maximum latitude value in Mercator projection. + * + * @since 6.0.0 + */ + public static final double MAX_MERCATOR_LATITUDE = 85.05112877980659; + + /** + * Minimum latitude value in Mercator projection. + * + * @since 6.0.0 + */ + public static final double MIN_MERCATOR_LATITUDE = -85.05112877980659; + + private GeometryConstants() { + // Private constructor to prevent initializing of this class. + } +} diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java index 3b35df4f4b..60362dd2e9 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java @@ -146,4 +146,7 @@ public class MapboxConstants { public static final String STATE_LOCATION_VIEW_ACCURACY_TINT_COLOR = "mapbox_locViewAccuracyTintColor"; public static final String STATE_LOCATION_VIEW_ACCURACY_THRESHOLD = "mapbox_locViewAccuracyThreshold"; public static final String STATE_LOCATION_VIEW_PADDING = "mapbox_locViewPadding"; + public static final String STATE_DESELECT_MARKER_ON_TAP = "mapbox_deselectMarkerOnTap"; + public static final String STATE_USER_FOCAL_POINT = "mapbox_userFocalPoint"; + } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/geometry/LatLng.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/geometry/LatLng.java index eb57241196..79023e2fd9 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/geometry/LatLng.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/geometry/LatLng.java @@ -5,8 +5,8 @@ import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.FloatRange; -import com.mapbox.services.android.telemetry.constants.GeoConstants; -import com.mapbox.services.android.telemetry.utils.MathUtils; +import com.mapbox.mapboxsdk.constants.GeometryConstants; + /** * A geographical location which contains a single latitude, longitude pair, with @@ -105,20 +105,20 @@ public class LatLng implements ILatLng, Parcelable { /** * Set the latitude, in degrees. * <p> - * This value is in the range of [-85.05112878, 85.05112878], see {@link GeoConstants#MIN_LATITUDE} and - * {@link GeoConstants#MAX_LATITUDE} + * This value is in the range of [-90, 90], see {@link GeometryConstants#MIN_LATITUDE} and + * {@link GeometryConstants#MAX_LATITUDE} * </p> * * @param latitude the latitude value in degrees - * @see GeoConstants#MIN_LATITUDE - * @see GeoConstants#MAX_LATITUDE + * @see GeometryConstants#MIN_LATITUDE + * @see GeometryConstants#MAX_LATITUDE */ public void setLatitude( - @FloatRange(from = GeoConstants.MIN_LATITUDE, to = GeoConstants.MAX_LATITUDE) double latitude) { + @FloatRange(from = GeometryConstants.MIN_LATITUDE, to = GeometryConstants.MAX_LATITUDE) double latitude) { if (Double.isNaN(latitude)) { throw new IllegalArgumentException("latitude must not be NaN"); } - if (Math.abs(latitude) > 90.0) { + if (Math.abs(latitude) > GeometryConstants.MAX_LATITUDE) { throw new IllegalArgumentException("latitude must be between -90 and 90"); } this.latitude = latitude; @@ -127,13 +127,13 @@ public class LatLng implements ILatLng, Parcelable { /** * Get the latitude, in degrees. * <p> - * This value is in the range of [-85.05112878, 85.05112878], see {@link GeoConstants#MIN_LATITUDE} and - * {@link GeoConstants#MAX_LATITUDE} + * This value is in the range of [-90, 90], see {@link GeometryConstants#MIN_LATITUDE} and + * {@link GeometryConstants#MAX_LATITUDE} * </p> * * @return the latitude value in degrees - * @see GeoConstants#MIN_LATITUDE - * @see GeoConstants#MAX_LATITUDE + * @see GeometryConstants#MIN_LATITUDE + * @see GeometryConstants#MAX_LATITUDE */ @Override public double getLatitude() { @@ -143,15 +143,15 @@ public class LatLng implements ILatLng, Parcelable { /** * Set the longitude, in degrees. * <p> - * This value is in the range of [-180, 180], see {@link GeoConstants#MIN_LONGITUDE} and - * {@link GeoConstants#MAX_LONGITUDE} + * This value is in the range of [-180, 180], see {@link GeometryConstants#MIN_LONGITUDE} and + * {@link GeometryConstants#MAX_LONGITUDE} * </p> * * @param longitude the longitude value in degrees - * @see GeoConstants#MIN_LONGITUDE - * @see GeoConstants#MAX_LONGITUDE + * @see GeometryConstants#MIN_LONGITUDE + * @see GeometryConstants#MAX_LONGITUDE */ - public void setLongitude(@FloatRange(from = GeoConstants.MIN_LONGITUDE, to = GeoConstants.MAX_LONGITUDE) + public void setLongitude(@FloatRange(from = GeometryConstants.MIN_LONGITUDE, to = GeometryConstants.MAX_LONGITUDE) double longitude) { if (Double.isNaN(longitude)) { throw new IllegalArgumentException("longitude must not be NaN"); @@ -165,13 +165,13 @@ public class LatLng implements ILatLng, Parcelable { /** * Get the longitude, in degrees. * <p> - * This value is in the range of [-180, 180], see {@link GeoConstants#MIN_LONGITUDE} and - * {@link GeoConstants#MAX_LONGITUDE} + * This value is in the range of [-180, 180], see {@link GeometryConstants#MIN_LONGITUDE} and + * {@link GeometryConstants#MAX_LONGITUDE} * </p> * * @return the longitude value in degrees - * @see GeoConstants#MIN_LONGITUDE - * @see GeoConstants#MAX_LONGITUDE + * @see GeometryConstants#MIN_LONGITUDE + * @see GeometryConstants#MAX_LONGITUDE */ @Override public double getLongitude() { @@ -204,8 +204,33 @@ public class LatLng implements ILatLng, Parcelable { * @return new LatLng object with wrapped Longitude */ public LatLng wrap() { - longitude = MathUtils.wrap(longitude, GeoConstants.MIN_LONGITUDE, GeoConstants.MAX_LONGITUDE); - return this; + return new LatLng(latitude, wrap(longitude, GeometryConstants.MIN_LONGITUDE, GeometryConstants.MAX_LONGITUDE)); + } + + + /** + * Constrains value to the given range (including min & max) via modular arithmetic. + * <p> + * Same formula as used in Core GL (wrap.hpp) + * std::fmod((std::fmod((value - min), d) + d), d) + min; + * + * Multiples of max value will be wrapped to max. + * + * @param value Value to wrap + * @param min Minimum value + * @param max Maximum value + * @return Wrapped value + */ + static double wrap(double value, double min, double max) { + double delta = max - min; + + double firstMod = (value - min) % delta; + double secondMod = (firstMod + delta) % delta; + + if (value >= max && secondMod == 0) { + return max; + } + return secondMod + min; } /** @@ -305,6 +330,6 @@ public class LatLng implements ILatLng, Parcelable { final double t3 = Math.sin(a1) * Math.sin(b1); final double tt = Math.acos(t1 + t2 + t3); - return GeoConstants.RADIUS_EARTH_METERS * tt; + return GeometryConstants.RADIUS_EARTH_METERS * tt; } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/geometry/LatLngBounds.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/geometry/LatLngBounds.java index 4fcb91033c..cf647224ae 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/geometry/LatLngBounds.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/geometry/LatLngBounds.java @@ -2,11 +2,12 @@ package com.mapbox.mapboxsdk.geometry; import android.os.Parcel; import android.os.Parcelable; +import android.support.annotation.FloatRange; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import com.mapbox.mapboxsdk.constants.GeometryConstants; import com.mapbox.mapboxsdk.exceptions.InvalidLatLngBoundsException; -import com.mapbox.services.android.telemetry.constants.GeoConstants; import java.util.ArrayList; import java.util.List; @@ -48,8 +49,8 @@ public class LatLngBounds implements Parcelable { */ public static LatLngBounds world() { return new LatLngBounds.Builder() - .include(new LatLng(GeoConstants.MAX_LATITUDE, GeoConstants.MAX_LONGITUDE)) - .include(new LatLng(GeoConstants.MIN_LATITUDE, GeoConstants.MIN_LONGITUDE)) + .include(new LatLng(GeometryConstants.MAX_LATITUDE, GeometryConstants.MAX_LONGITUDE)) + .include(new LatLng(GeometryConstants.MIN_LATITUDE, GeometryConstants.MIN_LONGITUDE)) .build(); } @@ -194,10 +195,10 @@ public class LatLngBounds implements Parcelable { * @return LatLngBounds */ static LatLngBounds fromLatLngs(final List<? extends ILatLng> latLngs) { - double minLat = 90; - double minLon = 180; - double maxLat = -90; - double maxLon = -180; + double minLat = GeometryConstants.MAX_LATITUDE; + double minLon = GeometryConstants.MAX_LONGITUDE; + double maxLat = GeometryConstants.MIN_LATITUDE; + double maxLon = GeometryConstants.MIN_LONGITUDE; for (final ILatLng gp : latLngs) { final double latitude = gp.getLatitude(); @@ -223,14 +224,69 @@ public class LatLngBounds implements Parcelable { /** * Constructs a LatLngBounds from doubles representing a LatLng pair. + * + * This values of latNorth and latSouth should be in the range of [-90, 90], + * see {@link GeometryConstants#MIN_LATITUDE} and {@link GeometryConstants#MAX_LATITUDE}, + * otherwise IllegalArgumentException will be thrown. * <p> * This method doesn't recalculate most east or most west boundaries. + * Note that lonEast and lonWest will be wrapped to be in the range of [-180, 180], + * see {@link GeometryConstants#MIN_LONGITUDE} and {@link GeometryConstants#MAX_LONGITUDE} * </p> */ - public static LatLngBounds from(double latNorth, double lonEast, double latSouth, double lonWest) { + public static LatLngBounds from( + @FloatRange(from = GeometryConstants.MIN_LATITUDE, to = GeometryConstants.MAX_LATITUDE) double latNorth, + double lonEast, + @FloatRange(from = GeometryConstants.MIN_LATITUDE, to = GeometryConstants.MAX_LATITUDE) double latSouth, + double lonWest) { + + if (Double.isNaN(latNorth) || Double.isNaN(latSouth)) { + throw new IllegalArgumentException("latitude must not be NaN"); + } + + if (Double.isNaN(lonEast) || Double.isNaN(lonWest)) { + throw new IllegalArgumentException("longitude must not be NaN"); + } + + if (Double.isInfinite(lonEast) || Double.isInfinite(lonWest)) { + throw new IllegalArgumentException("longitude must not be infinite"); + } + + if (latNorth > GeometryConstants.MAX_LATITUDE || latNorth < GeometryConstants.MIN_LATITUDE + || latSouth > GeometryConstants.MAX_LATITUDE || latSouth < GeometryConstants.MIN_LATITUDE) { + throw new IllegalArgumentException("latitude must be between -90 and 90"); + } + + lonEast = LatLng.wrap(lonEast, GeometryConstants.MIN_LONGITUDE, GeometryConstants.MAX_LONGITUDE); + lonWest = LatLng.wrap(lonWest, GeometryConstants.MIN_LONGITUDE, GeometryConstants.MAX_LONGITUDE); + return new LatLngBounds(latNorth, lonEast, latSouth, lonWest); } + private static double lat_(int z, int y) { + double n = Math.PI - 2.0 * Math.PI * y / Math.pow(2.0, z); + return Math.toDegrees(Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)))); + } + + private static double lon_(int z, int x) { + return x / Math.pow(2.0, z) * 360.0 - GeometryConstants.MAX_LONGITUDE; + } + + /** + * Constructs a LatLngBounds from a Tile identifier. + * + * Returned bounds will have latitude in the range of Mercator projection. + * @see GeometryConstants#MIN_MERCATOR_LATITUDE + * @see GeometryConstants#MAX_MERCATOR_LATITUDE + * + * @param z Tile zoom level. + * @param x Tile X coordinate. + * @param y Tile Y coordinate. + */ + public static LatLngBounds from(int z, int x, int y) { + return new LatLngBounds(lat_(z, y), lon_(z, x + 1), lat_(z, y + 1), lon_(z, x)); + } + /** * Constructs a LatLngBounds from current bounds with an additional latitude-longitude pair. * @@ -305,17 +361,17 @@ public class LatLngBounds implements Parcelable { * Returns a new LatLngBounds that stretches to include another LatLngBounds, * given by corner points. * - * @param lonNorth Northern Longitude - * @param latEast Eastern Latitude - * @param lonSouth Southern Longitude - * @param latWest Western Longitude + * @param latNorth Northern Latitude + * @param lonEast Eastern Longitude + * @param latSouth Southern Latitude + * @param lonWest Western Longitude * @return BoundingBox */ - public LatLngBounds union(final double lonNorth, final double latEast, final double lonSouth, final double latWest) { - return new LatLngBounds((this.latitudeNorth < lonNorth) ? lonNorth : this.latitudeNorth, - (this.longitudeEast < latEast) ? latEast : this.longitudeEast, - (this.latitudeSouth > lonSouth) ? lonSouth : this.latitudeSouth, - (this.longitudeWest > latWest) ? latWest : this.longitudeWest); + public LatLngBounds union(final double latNorth, final double lonEast, final double latSouth, final double lonWest) { + return new LatLngBounds((this.latitudeNorth < latNorth) ? latNorth : this.latitudeNorth, + (this.longitudeEast < lonEast) ? lonEast : this.longitudeEast, + (this.latitudeSouth > latSouth) ? latSouth : this.latitudeSouth, + (this.longitudeWest > lonWest) ? lonWest : this.longitudeWest); } /** @@ -326,13 +382,13 @@ public class LatLngBounds implements Parcelable { */ @Nullable public LatLngBounds intersect(LatLngBounds box) { - double minLatWest = Math.max(getLonWest(), box.getLonWest()); - double maxLatEast = Math.min(getLonEast(), box.getLonEast()); - if (maxLatEast > minLatWest) { - double minLonSouth = Math.max(getLatSouth(), box.getLatSouth()); - double maxLonNorth = Math.min(getLatNorth(), box.getLatNorth()); - if (maxLonNorth > minLonSouth) { - return new LatLngBounds(maxLonNorth, maxLatEast, minLonSouth, minLatWest); + double minLonWest = Math.max(getLonWest(), box.getLonWest()); + double maxLonEast = Math.min(getLonEast(), box.getLonEast()); + if (maxLonEast > minLonWest) { + double minLatSouth = Math.max(getLatSouth(), box.getLatSouth()); + double maxLatNorth = Math.min(getLatNorth(), box.getLatNorth()); + if (maxLatNorth > minLatSouth) { + return new LatLngBounds(maxLatNorth, maxLonEast, minLatSouth, minLonWest); } } return null; diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraChangeDispatcher.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraChangeDispatcher.java index 605c8912e2..e558a5d707 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraChangeDispatcher.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraChangeDispatcher.java @@ -34,6 +34,11 @@ class CameraChangeDispatcher implements MapboxMap.OnCameraMoveStartedListener, M private final Runnable onCameraMoveStartedRunnable = new Runnable() { @Override public void run() { + if (!idle) { + return; + } + idle = false; + // deprecated API if (onCameraMoveStartedListener != null) { onCameraMoveStartedListener.onCameraMoveStarted(moveStartedReason); @@ -85,6 +90,11 @@ class CameraChangeDispatcher implements MapboxMap.OnCameraMoveStartedListener, M private final Runnable onCameraIdleRunnable = new Runnable() { @Override public void run() { + if (idle) { + return; + } + idle = true; + // deprecated API if (onCameraIdleListener != null) { onCameraIdleListener.onCameraIdle(); @@ -121,10 +131,6 @@ class CameraChangeDispatcher implements MapboxMap.OnCameraMoveStartedListener, M @Override public void onCameraMoveStarted(final int reason) { - if (!idle) { - return; - } - idle = false; moveStartedReason = reason; handler.post(onCameraMoveStartedRunnable); } @@ -141,10 +147,7 @@ class CameraChangeDispatcher implements MapboxMap.OnCameraMoveStartedListener, M @Override public void onCameraIdle() { - if (!idle) { - idle = true; - handler.post(onCameraIdleRunnable); - } + handler.post(onCameraIdleRunnable); } void addOnCameraIdleListener(@NonNull OnCameraIdleListener listener) { diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java index 214fa22795..1788cb4428 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java @@ -28,6 +28,7 @@ import com.mapbox.services.android.telemetry.utils.TelemetryUtils; import java.util.concurrent.CopyOnWriteArrayList; +import static com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraMoveStartedListener.REASON_API_ANIMATION; import static com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraMoveStartedListener.REASON_API_GESTURE; /** @@ -78,9 +79,11 @@ final class MapGestureDetector { private boolean scaleGestureOccurred; private boolean recentScaleGestureOccurred; - private boolean scaleAnimating; private long scaleBeginTime; + private boolean scaleAnimating; + private boolean rotateAnimating; + private VelocityTracker velocityTracker; private boolean wasZoomingIn; private boolean wasClockwiseRotating; @@ -233,7 +236,10 @@ final class MapGestureDetector { MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapDragEndEvent( getLocationFromGesture(event.getX(), event.getY()), transform)); scrollGestureOccurred = false; - cameraChangeDispatcher.onCameraIdle(); + + if (!scaleAnimating && !rotateAnimating) { + cameraChangeDispatcher.onCameraIdle(); + } } twoTap = false; @@ -615,7 +621,6 @@ final class MapGestureDetector { return; } - if (rotateGestureOccurred || quickZoom) { reset(); return; @@ -657,13 +662,23 @@ final class MapGestureDetector { @Override public void onAnimationUpdate(ValueAnimator animation) { - transform.setZoom((Float) animation.getAnimatedValue(), scalePointBegin); + transform.setZoom((Float) animation.getAnimatedValue(), scalePointBegin, 0, true); } }); animator.addListener(new AnimatorListenerAdapter() { + + @Override + public void onAnimationStart(Animator animation) { + cameraChangeDispatcher.onCameraMoveStarted(REASON_API_ANIMATION); + } + + @Override + public void onAnimationCancel(Animator animation) { + reset(); + } + @Override public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); reset(); } }); @@ -682,7 +697,6 @@ final class MapGestureDetector { private long beginTime = 0; private boolean started = false; - private boolean animating = false; // Called when two fingers first touch the screen @Override @@ -753,9 +767,9 @@ final class MapGestureDetector { } double angularVelocity = calculateVelocityVector(detector); - if (Math.abs(angularVelocity) > 0.001 && rotateGestureOccurred && !animating) { + if (Math.abs(angularVelocity) > 0.001 && rotateGestureOccurred && !rotateAnimating) { animateRotateVelocity(); - } else if (!animating) { + } else if (!rotateAnimating) { reset(); } } @@ -763,12 +777,16 @@ final class MapGestureDetector { private void reset() { beginTime = 0; started = false; - animating = false; + rotateAnimating = false; rotateGestureOccurred = false; + + if (!twoTap) { + cameraChangeDispatcher.onCameraIdle(); + } } private void animateRotateVelocity() { - animating = true; + rotateAnimating = true; double currentRotation = transform.getRawBearing(); double rotateAdditionDegrees = calculateVelocityInDegrees(); createAnimator(currentRotation, rotateAdditionDegrees).start(); @@ -811,9 +829,19 @@ final class MapGestureDetector { } }); animator.addListener(new AnimatorListenerAdapter() { + + @Override + public void onAnimationStart(Animator animation) { + cameraChangeDispatcher.onCameraMoveStarted(REASON_API_ANIMATION); + } + + @Override + public void onAnimationCancel(Animator animation) { + reset(); + } + @Override public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); reset(); } }); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java index d03882b5c7..0534f6cf69 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java @@ -22,7 +22,6 @@ import android.view.ViewTreeObserver; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.ZoomButtonsController; - import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.annotations.Annotation; import com.mapbox.mapboxsdk.annotations.MarkerViewManager; @@ -37,7 +36,10 @@ import com.mapbox.mapboxsdk.maps.widgets.MyLocationViewSettings; import com.mapbox.mapboxsdk.net.ConnectivityReceiver; import com.mapbox.mapboxsdk.storage.FileSource; import com.mapbox.services.android.telemetry.MapboxTelemetry; +import timber.log.Timber; +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -45,11 +47,6 @@ import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.opengles.GL10; - -import timber.log.Timber; - import static com.mapbox.mapboxsdk.maps.widgets.CompassView.TIME_MAP_NORTH_ANIMATION; import static com.mapbox.mapboxsdk.maps.widgets.CompassView.TIME_WAIT_IDLE; @@ -75,6 +72,7 @@ public class MapView extends FrameLayout { private NativeMapView nativeMapView; private MapboxMapOptions mapboxMapOptions; private boolean destroyed; + private boolean hasSurface; private MyLocationView myLocationView; private CompassView compassView; @@ -273,7 +271,7 @@ public class MapView extends FrameLayout { /** * <p> * You must call this method from the parent's Activity#onCreate(Bundle)} or - * Fragment#onCreate(Bundle). + * Fragment#onViewCreated(View, Bundle). * </p> * You must set a valid access token with {@link com.mapbox.mapboxsdk.Mapbox#getInstance(Context, String)} * before you call this method or an exception will be thrown. @@ -321,6 +319,7 @@ public class MapView extends FrameLayout { } private void initRenderSurface() { + hasSurface = true; post(new Runnable() { @Override public void run() { @@ -409,7 +408,7 @@ public class MapView extends FrameLayout { destroyed = true; mapCallback.clearOnMapReadyCallbacks(); - if (nativeMapView != null) { + if (nativeMapView != null && hasSurface) { // null when destroying an activity programmatically mapbox-navigation-android/issues/503 nativeMapView.destroy(); nativeMapView = null; diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java index ba116e1278..509e784e58 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java @@ -563,7 +563,7 @@ public final class MapboxMap { * * @return the TrackingSettings asssociated with this map * @deprecated use location layer plugin from - * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugins/locationlayer instead. + * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugin-locationlayer instead. */ @Deprecated public TrackingSettings getTrackingSettings() { @@ -579,7 +579,7 @@ public final class MapboxMap { * * @return the MyLocationViewSettings associated with this map * @deprecated use location layer plugin from - * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugins/locationlayer instead. + * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugin-locationlayer instead. */ @Deprecated public MyLocationViewSettings getMyLocationViewSettings() { @@ -2077,7 +2077,7 @@ public final class MapboxMap { * * @return True if the my-location layer is enabled, false otherwise. * @deprecated use location layer plugin from - * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugins/locationlayer instead. + * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugin-locationlayer instead. */ @Deprecated public boolean isMyLocationEnabled() { @@ -2095,7 +2095,7 @@ public final class MapboxMap { * * @param enabled True to enable; false to disable. * @deprecated use location layer plugin from - * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugins/locationlayer instead. + * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugin-locationlayer instead. */ @Deprecated public void setMyLocationEnabled(boolean enabled) { @@ -2107,7 +2107,7 @@ public final class MapboxMap { * * @return The currently displayed user location. * @deprecated use location layer plugin from - * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugins/locationlayer instead. + * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugin-locationlayer instead. */ @Nullable @Deprecated @@ -2122,7 +2122,7 @@ public final class MapboxMap { * @param listener The callback that's invoked when the user clicks on a marker. * To unset the callback, use null. * @deprecated use location layer plugin from - * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugins/locationlayer instead. + * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugin-locationlayer instead. */ @Deprecated public void setOnMyLocationChangeListener(@Nullable MapboxMap.OnMyLocationChangeListener @@ -2135,7 +2135,7 @@ public final class MapboxMap { * * @param locationSource A {@link LocationEngine} location source to use in the my-location layer. * @deprecated use location layer plugin from - * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugins/locationlayer instead. + * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugin-locationlayer instead. */ @Deprecated public void setLocationSource(@Nullable LocationEngine locationSource) { @@ -2148,7 +2148,7 @@ public final class MapboxMap { * @param listener The callback that's invoked when the location tracking mode changes. * To unset the callback, use null. * @deprecated use location layer plugin from - * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugins/locationlayer instead. + * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugin-locationlayer instead. */ @Deprecated public void setOnMyLocationTrackingModeChangeListener( @@ -2162,7 +2162,7 @@ public final class MapboxMap { * @param listener The callback that's invoked when the bearing tracking mode changes. * To unset the callback, use null. * @deprecated use location layer plugin from - * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugins/locationlayer instead. + * https://github.com/mapbox/mapbox-plugins-android/tree/master/plugin-locationlayer instead. */ @Deprecated public void setOnMyBearingTrackingModeChangeListener(@Nullable OnMyBearingTrackingModeChangeListener listener) { diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java index e8eb7e8718..f1635c898f 100755 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java @@ -733,7 +733,7 @@ final class NativeMapView { if (isDestroyedOn("addSource")) { return; } - nativeAddSource(source.getNativePtr()); + nativeAddSource(source, source.getNativePtr()); } @Nullable @@ -741,14 +741,15 @@ final class NativeMapView { if (isDestroyedOn("removeSource")) { return null; } - return nativeRemoveSourceById(sourceId); + Source source = getSource(sourceId); + return removeSource(source); } public Source removeSource(@NonNull Source source) { if (isDestroyedOn("removeSource")) { return null; } - nativeRemoveSource(source.getNativePtr()); + nativeRemoveSource(source, source.getNativePtr()); return source; } @@ -1027,11 +1028,9 @@ final class NativeMapView { private native Source nativeGetSource(String sourceId); - private native void nativeAddSource(long nativeSourcePtr) throws CannotAddSourceException; + private native void nativeAddSource(Source source, long sourcePtr) throws CannotAddSourceException; - private native Source nativeRemoveSourceById(String sourceId); - - private native void nativeRemoveSource(long sourcePtr); + private native void nativeRemoveSource(Source source, long sourcePtr); private native void nativeAddImage(String name, int width, int height, float pixelRatio, byte[] array); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java index b0cc92c62b..7fa85ae550 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/Transform.java @@ -239,7 +239,7 @@ final class Transform implements MapView.OnMapChangedListener { CameraPosition cameraPosition = invalidateCameraPosition(); if (cameraPosition != null) { int newZoom = (int) Math.round(cameraPosition.zoom + (zoomIn ? 1 : -1)); - setZoom(newZoom, focalPoint, MapboxConstants.ANIMATION_DURATION); + setZoom(newZoom, focalPoint, MapboxConstants.ANIMATION_DURATION, false); } else { // we are not transforming, notify about being idle cameraChangeDispatcher.onCameraIdle(); @@ -250,7 +250,7 @@ final class Transform implements MapView.OnMapChangedListener { CameraPosition cameraPosition = invalidateCameraPosition(); if (cameraPosition != null) { int newZoom = (int) Math.round(cameraPosition.zoom + zoomAddition); - setZoom(newZoom, focalPoint, duration); + setZoom(newZoom, focalPoint, duration, false); } else { // we are not transforming, notify about being idle cameraChangeDispatcher.onCameraIdle(); @@ -258,16 +258,18 @@ final class Transform implements MapView.OnMapChangedListener { } void setZoom(double zoom, @NonNull PointF focalPoint) { - setZoom(zoom, focalPoint, 0); + setZoom(zoom, focalPoint, 0, false); } - void setZoom(double zoom, @NonNull PointF focalPoint, long duration) { + void setZoom(double zoom, @NonNull PointF focalPoint, long duration, boolean isAnimator) { if (mapView != null) { mapView.addOnMapChangedListener(new MapView.OnMapChangedListener() { @Override public void onMapChanged(int change) { if (change == MapView.REGION_DID_CHANGE_ANIMATED) { - cameraChangeDispatcher.onCameraIdle(); + if (!isAnimator) { + cameraChangeDispatcher.onCameraIdle(); + } mapView.removeOnMapChangedListener(this); } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java index 4f37dd6f36..3fd3e1220a 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/UiSettings.java @@ -91,6 +91,8 @@ public final class UiSettings { saveLogo(outState); saveAttribution(outState); saveZoomControl(outState); + saveDeselectMarkersOnTap(outState); + saveFocalPoint(outState); } void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { @@ -99,6 +101,8 @@ public final class UiSettings { restoreLogo(savedInstanceState); restoreAttribution(savedInstanceState); restoreZoomControl(savedInstanceState); + restoreDeselectMarkersOnTap(savedInstanceState); + restoreFocalPoint(savedInstanceState); } private void initialiseGestures(MapboxMapOptions options) { @@ -783,6 +787,14 @@ public final class UiSettings { return doubleTapGestureChangeAllowed; } + private void restoreDeselectMarkersOnTap(Bundle savedInstanceState) { + setDeselectMarkersOnTap(savedInstanceState.getBoolean(MapboxConstants.STATE_DESELECT_MARKER_ON_TAP)); + } + + private void saveDeselectMarkersOnTap(Bundle outState) { + outState.putBoolean(MapboxConstants.STATE_DESELECT_MARKER_ON_TAP, isDeselectMarkersOnTap()); + } + /** * Gets whether the markers are automatically deselected (and therefore, their infowindows * closed) when a map tap is detected. @@ -862,6 +874,17 @@ public final class UiSettings { setDoubleTapGesturesEnabled(enabled); } + private void saveFocalPoint(Bundle outState) { + outState.putParcelable(MapboxConstants.STATE_USER_FOCAL_POINT, getFocalPoint()); + } + + private void restoreFocalPoint(Bundle savedInstanceState) { + PointF pointF = savedInstanceState.getParcelable(MapboxConstants.STATE_USER_FOCAL_POINT); + if (pointF != null) { + setFocalPoint(pointF); + } + } + /** * Sets the focal point used as center for a gesture * diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationView.java index 3fe3c7b40d..4f27e0ada8 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationView.java @@ -372,9 +372,6 @@ public class MyLocationView extends View { */ public void setTilt(@FloatRange(from = 0, to = 60.0f) double tilt) { this.tilt = tilt; - if (myLocationTrackingMode == MyLocationTracking.TRACKING_FOLLOW) { - mapboxMap.getUiSettings().setFocalPoint(getCenter()); - } invalidate(); } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java index bc9438ee93..29dc581ea3 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java @@ -1,12 +1,12 @@ package com.mapbox.mapboxsdk.offline; import android.os.Handler; -import android.os.Looper; import android.support.annotation.IntDef; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.mapbox.mapboxsdk.LibraryLoader; +import com.mapbox.mapboxsdk.Mapbox; import com.mapbox.mapboxsdk.storage.FileSource; import java.lang.annotation.Retention; @@ -51,7 +51,7 @@ public class OfflineRegion { private byte[] metadata; // Makes sure callbacks come back to the main thread - private Handler handler; + private final Handler handler = new Handler(); /** * A region can have a single observer, which gets notified whenever a change @@ -239,14 +239,6 @@ public class OfflineRegion { return metadata; } - private Handler getHandler() { - if (handler == null) { - handler = new Handler(Looper.getMainLooper()); - } - - return handler; - } - /** * Register an observer to be notified when the state of the region changes. * @@ -257,12 +249,9 @@ public class OfflineRegion { @Override public void onStatusChanged(final OfflineRegionStatus status) { if (deliverMessages()) { - getHandler().post(new Runnable() { - @Override - public void run() { - if (observer != null) { - observer.onStatusChanged(status); - } + handler.post(() -> { + if (observer != null) { + observer.onStatusChanged(status); } }); } @@ -271,12 +260,9 @@ public class OfflineRegion { @Override public void onError(final OfflineRegionError error) { if (deliverMessages()) { - getHandler().post(new Runnable() { - @Override - public void run() { - if (observer != null) { - observer.onError(error); - } + handler.post(() -> { + if (observer != null) { + observer.onError(error); } }); } @@ -285,12 +271,9 @@ public class OfflineRegion { @Override public void mapboxTileCountLimitExceeded(final long limit) { if (deliverMessages()) { - getHandler().post(new Runnable() { - @Override - public void run() { - if (observer != null) { - observer.mapboxTileCountLimitExceeded(limit); - } + handler.post(() -> { + if (observer != null) { + observer.mapboxTileCountLimitExceeded(limit); } }); } @@ -325,24 +308,21 @@ public class OfflineRegion { * @param callback the callback to invoked. */ public void getStatus(@NonNull final OfflineRegionStatusCallback callback) { + FileSource.getInstance(Mapbox.getApplicationContext()).activate(); getOfflineRegionStatus(new OfflineRegionStatusCallback() { @Override public void onStatus(final OfflineRegionStatus status) { - getHandler().post(new Runnable() { - @Override - public void run() { - callback.onStatus(status); - } + handler.post(() -> { + callback.onStatus(status); + FileSource.getInstance(Mapbox.getApplicationContext()).deactivate(); }); } @Override public void onError(final String error) { - getHandler().post(new Runnable() { - @Override - public void run() { - callback.onError(error); - } + handler.post(() -> { + callback.onError(error); + FileSource.getInstance(Mapbox.getApplicationContext()).deactivate(); }); } }); @@ -368,26 +348,23 @@ public class OfflineRegion { public void delete(@NonNull final OfflineRegionDeleteCallback callback) { if (!isDeleted) { isDeleted = true; + FileSource.getInstance(Mapbox.getApplicationContext()).activate(); deleteOfflineRegion(new OfflineRegionDeleteCallback() { @Override public void onDelete() { - getHandler().post(new Runnable() { - @Override - public void run() { - callback.onDelete(); - OfflineRegion.this.finalize(); - } + handler.post((Runnable) () -> { + callback.onDelete(); + FileSource.getInstance(Mapbox.getApplicationContext()).deactivate(); + OfflineRegion.this.finalize(); }); } @Override public void onError(final String error) { - getHandler().post(new Runnable() { - @Override - public void run() { - isDeleted = false; - callback.onError(error); - } + handler.post(() -> { + isDeleted = false; + FileSource.getInstance(Mapbox.getApplicationContext()).deactivate(); + callback.onError(error); }); } }); @@ -408,23 +385,15 @@ public class OfflineRegion { updateOfflineRegionMetadata(bytes, new OfflineRegionUpdateMetadataCallback() { @Override public void onUpdate(final byte[] metadata) { - getHandler().post(new Runnable() { - @Override - public void run() { - OfflineRegion.this.metadata = metadata; - callback.onUpdate(metadata); - } + handler.post(() -> { + OfflineRegion.this.metadata = metadata; + callback.onUpdate(metadata); }); } @Override public void onError(final String error) { - getHandler().post(new Runnable() { - @Override - public void run() { - callback.onError(error); - } - }); + handler.post(() -> callback.onError(error)); } }); } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/expressions/Expression.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/expressions/Expression.java new file mode 100644 index 0000000000..4d09fcaac6 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/expressions/Expression.java @@ -0,0 +1,1761 @@ +package com.mapbox.mapboxsdk.style.expressions; + +import android.support.annotation.ColorInt; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.Size; + +import com.mapbox.mapboxsdk.style.layers.PropertyFactory; + +import java.util.ArrayList; +import java.util.List; + +/** + * The value for any layout property, paint property, or filter may be specified as an expression. + * An expression defines a formula for computing the value of the property using the operators described below. + * The set of expression operators provided by Mapbox GL includes: + * <p> + * <ul> + * <li>Element</li> + * <li>Mathematical operators for performing arithmetic and other operations on numeric values</li> + * <li>Logical operators for manipulating boolean values and making conditional decisions</li> + * <li>String operators for manipulating strings</li> + * <li>Data operators, providing access to the properties of source features</li> + * <li>Camera operators, providing access to the parameters defining the current map view</li> + * </ul> + * </p> + * <p> + * Expressions are represented as JSON arrays. + * The first element of an expression array is a string naming the expression operator, + * e.g. "*"or "case". Subsequent elements (if any) are the arguments to the expression. + * Each argument is either a literal value (a string, number, boolean, or null), or another expression array. + * </p> + * <p> + * Data expression: a data expression is any expression that access feature data -- that is, + * any expression that uses one of the data operators:get,has,id,geometry-type, or properties. + * Data expressions allow a feature's properties to determine its appearance. + * They can be used to differentiate features within the same layer and to create data visualizations. + * </p> + * <p> + * Camera expression: a camera expression is any expression that uses the zoom operator. + * Such expressions allow the the appearance of a layer to change with the map's zoom level. + * Camera expressions can be used to create the appearance of depth and to control data density. + * </p> + * <p> + * Composition: a single expression may use a mix of data operators, camera operators, and other operators. + * Such composite expressions allows a layer's appearance to be determined by + * a combination of the zoom level and individual feature properties. + * </p> + * + * @param <T> the type of the expression + */ +public class Expression<T> { + + private final String operator; + private final Expression[] arguments; + + /** + * Creates an empty expression for expression literals + */ + Expression() { + operator = null; + arguments = null; + } + + /** + * Creates an expression from its operator and varargs expressions. + * + * @param operator the expression operator + * @param arguments expressions input + */ + public Expression(@NonNull String operator, @Nullable Expression... arguments) { + this.operator = operator; + this.arguments = arguments; + } + + /** + * Converts the expression to Object array representation. + * <p> + * The output will later be converted to a JSON Object array. + * </p> + * + * @return the converted object array expression + */ + @NonNull + public Object[] toArray() { + List<Object> array = new ArrayList<>(); + array.add(operator); + if (arguments != null) { + for (Expression argument : arguments) { + if (argument instanceof Expression.ExpressionLiteral) { + array.add(toValue((ExpressionLiteral) argument)); + } else { + array.add(argument.toArray()); + } + } + } + return array.toArray(); + } + + /** + * Converts the expression value to an Object. + * + * @param expressionValue the expression value to convert + * @return the converted object expression + */ + private Object toValue(ExpressionLiteral expressionValue) { + Object value = expressionValue.toValue(); + if (value instanceof Expression.Color) { + return ((Expression.Color) value).convertColor(); + } else if (value instanceof Expression.ExpressionLiteral) { + return toValue((ExpressionLiteral) value); + } else if (value instanceof Expression) { + return ((Expression) value).toArray(); + } + return value; + } + + /** + * ExpressionLiteral wraps an object to be used as a literal in an expression. + * <p> + * ExpressionLiteral is created with {@link #literal(Number)}, {@link #literal(boolean)}, + * {@link #literal(String)} and {@link #literal(Object)}. + * </p> + * + * @param <T> + */ + private static class ExpressionLiteral<T> extends Expression<T> { + + protected T object; + + /** + * Create an ExpressionValue wrapper. + * + * @param object the object to be wrapped + */ + ExpressionLiteral(@NonNull T object) { + this.object = object; + } + + /** + * Get the wrapped object. + * + * @return the wrapped object + */ + Object toValue() { + return object; + } + } + + // + // Types + // + + /** + * Expression interpolator type. + * <p> + * Is used for first parameter of {@link #interpolate(Expression, Expression, Stop...)}. + * </p> + */ + private static class Interpolator { + } + + /** + * Expression color type. + */ + public static class Color { + + private int color; + + /** + * Creates a color color type from a color int. + * + * @param color the int color + */ + public Color(@ColorInt int color) { + this.color = color; + } + + /** + * Converts the int color to rgba(d, d, d, d) string representation + * + * @return + */ + public String convertColor() { + return PropertyFactory.colorToRgbaString(color); + } + } + + /** + * Expression array type. + */ + public static class Array { + } + + /** + * Expression stop type. + * <p> + * Can be used for {@link #stop(Object, Object)} as part of varargs parameter in + * {@link #step(Number, Expression, Stop...)} or {@link #interpolate(Expression, Expression, Stop...)}. + * </p> + */ + public static class Stop { + + private Object value; + private Object output; + + public Stop(Object value, Object output) { + this.value = value; + this.output = output; + } + } + + // + // Literals + // + + /** + * Create a literal number expression. + * + * @param number the number + * @return the expression + */ + public static Expression<Number> literal(@NonNull Number number) { + return new ExpressionLiteral<>(number); + } + + /** + * Create a literal string expression. + * + * @param string the string + * @return the expression + */ + public static Expression<String> literal(@NonNull String string) { + return new ExpressionLiteral<>(string); + } + + /** + * Create a literal boolean expression. + * + * @param bool the boolean + * @return the expression + */ + public static Expression<Boolean> literal(boolean bool) { + return new ExpressionLiteral<>(bool); + } + + /** + * Create a literal object expression + * + * @param object the object + * @return the expression + */ + public static Expression<Object> literal(@NonNull Object object) { + return new ExpressionLiteral<>(object); + } + + // + // Color + // + + /** + * Expression literal utility method to convert a color int to an color expression + * + * @param color the int color + * @return the color expression + */ + public static Expression<Color> color(@ColorInt int color) { + return new ExpressionLiteral<>(new Color(color)); + } + + /** + * Creates a color value from red, green, and blue components, which must range between 0 and 255, + * and an alpha component of 1. + * <p> + * If any component is out of range, the expression is an error. + * </p> + * + * @param red red color expression + * @param green green color expression + * @param blue blue color expression + * @return expression + */ + public static Expression<Color> rgb(@NonNull Expression<Number> red, @NonNull Expression<Number> green, + @NonNull Expression<Number> blue) { + return new Expression<>("rgb", red, green, blue); + } + + /** + * Creates a color value from red, green, and blue components, which must range between 0 and 255, + * and an alpha component of 1. + * <p> + * If any component is out of range, the expression is an error. + * </p> + * + * @param red red color value + * @param green green color value + * @param blue blue color value + * @return expression + */ + public static Expression<Color> rgb(@NonNull Number red, @NonNull Number green, @NonNull Number blue) { + return rgb(literal(red), literal(green), literal(blue)); + } + + /** + * Creates a color value from red, green, blue components, which must range between 0 and 255, + * and an alpha component which must range between 0 and 1. + * <p> + * If any component is out of range, the expression is an error. + * </p> + * + * @param red red color value + * @param green green color value + * @param blue blue color value + * @param alpha alpha color value + * @return expression + */ + public static Expression<Color> rgba(@NonNull Expression<Number> red, @NonNull Expression<Number> green, + @NonNull Expression<Number> blue, @NonNull Expression<Number> alpha) { + return new Expression<>("rgba", red, green, blue, alpha); + } + + /** + * Creates a color value from red, green, blue components, which must range between 0 and 255, + * and an alpha component which must range between 0 and 1. + * <p> + * If any component is out of range, the expression is an error. + * </p> + * + * @param red red color value + * @param green green color value + * @param blue blue color value + * @param alpha alpha color value + * @return expression + */ + public static Expression<Color> rgba(@NonNull Number red, @NonNull Number green, @NonNull Number blue, @NonNull Number alpha) { + return rgba(literal(red), literal(green), literal(blue), literal(alpha)); + } + + /** + * Returns a four-element array containing the input color's red, green, blue, and alpha components, in that order. + * + * @param expression an expression to convert to a color + * @return expression + */ + public static Expression<Array> toRgba(@NonNull Expression<Color> expression) { + return new Expression<>("to-rgba", expression); + } + + // + // Decision + // + + /** + * Returns true if the input values are equal, false otherwise. + * The inputs must be numbers, strings, or booleans, and both of the same type. + * + * @param compareOne the first expression + * @param compareTwo the second expression + * @return expression + */ + public static Expression<Boolean> eq(@NonNull Expression compareOne, @NonNull Expression compareTwo) { + return new Expression<>("==", compareOne, compareTwo); + } + + /** + * Returns true if the input values are equal, false otherwise. + * + * @param compareOne the first boolean + * @param compareTwo the second boolean + * @return expression + */ + public static Expression<Boolean> eq(boolean compareOne, boolean compareTwo) { + return eq(literal(compareOne), literal(compareTwo)); + } + + /** + * Returns true if the input values are equal, false otherwise. + * + * @param compareOne the first number + * @param compareTwo the second number + * @return expression + */ + public static Expression<Boolean> eq(@NonNull String compareOne, @NonNull String compareTwo) { + return eq(literal(compareOne), literal(compareTwo)); + } + + /** + * Returns true if the input values are equal, false otherwise. + * + * @param compareOne the first number + * @param compareTwo the second number + * @return expression + */ + public static Expression<Boolean> eq(@NonNull Number compareOne, @NonNull Number compareTwo) { + return eq(literal(compareOne), literal(compareTwo)); + } + + /** + * Returns true if the input values are not equal, false otherwise. + * The inputs must be numbers, strings, or booleans, and both of the same type. + * + * @param compareOne the first expression + * @param compareTwo the second expression + * @return expression + */ + public static Expression<Boolean> neq(@NonNull Expression compareOne, @NonNull Expression compareTwo) { + return new Expression<>("!=", compareOne, compareTwo); + } + + /** + * Returns true if the input values are equal, false otherwise. + * + * @param compareOne the first boolean + * @param compareTwo the second boolean + * @return expression + */ + public static Expression<Boolean> neq(boolean compareOne, boolean compareTwo) { + return new Expression<>("!=", literal(compareOne), literal(compareTwo)); + } + + /** + * Returns `true` if the input values are not equal, `false` otherwise. + * + * @param compareOne the first string + * @param compareTwo the second string + * @return expression + */ + public static Expression<Boolean> neq(@NonNull String compareOne, @NonNull String compareTwo) { + return new Expression<>("!=", literal(compareOne), literal(compareTwo)); + } + + /** + * Returns `true` if the input values are not equal, `false` otherwise. + * + * @param compareOne the first number + * @param compareTwo the second number + * @return expression + */ + public static Expression<Boolean> neq(@NonNull Number compareOne, @NonNull Number compareTwo) { + return new Expression<>("!=", literal(compareOne), literal(compareTwo)); + } + + /** + * Returns true if the first input is strictly greater than the second, false otherwise. + * The inputs must be numbers or strings, and both of the same type. + * + * @param compareOne the first expression + * @param compareTwo the second expression + * @return expression + */ + public static Expression<Boolean> gt(@NonNull Expression compareOne, @NonNull Expression compareTwo) { + return new Expression<>(">", compareOne, compareTwo); + } + + /** + * Returns true if the first input is strictly greater than the second, false otherwise. + * + * @param compareOne the first number + * @param compareTwo the second number + * @return expression + */ + public static Expression<Boolean> gt(@NonNull Number compareOne, @NonNull Number compareTwo) { + return new Expression<>(">", literal(compareOne), literal(compareTwo)); + } + + /** + * Returns true if the first input is strictly greater than the second, false otherwise. + * + * @param compareOne the first string + * @param compareTwo the second string + * @return expression + */ + public static Expression<Boolean> gt(@NonNull String compareOne, @NonNull String compareTwo) { + return new Expression<>(">", literal(compareOne), literal(compareTwo)); + } + + /** + * Returns true if the first input is strictly less than the second, false otherwise. + * The inputs must be numbers or strings, and both of the same type. + * + * @param compareOne the first number + * @param compareTwo the second number + * @return expression + */ + public static Expression<Boolean> lt(@NonNull Expression compareOne, @NonNull Expression compareTwo) { + return new Expression<>("<", compareOne, compareTwo); + } + + /** + * Returns true if the first input is strictly less than the second, false otherwise. + * + * @param compareOne the first number + * @param compareTwo the second number + * @return expression + */ + public static Expression<Boolean> lt(@NonNull Number compareOne, @NonNull Number compareTwo) { + return new Expression<>("<", literal(compareOne), literal(compareTwo)); + } + + /** + * Returns true if the first input is strictly less than the second, false otherwise. + * + * @param compareOne the first string + * @param compareTwo the second string + * @return expression + */ + public static Expression<Boolean> lt(@NonNull String compareOne, @NonNull String compareTwo) { + return new Expression<>("<", literal(compareOne), literal(compareTwo)); + } + + /** + * Returns true if the first input is greater than or equal to the second, false otherwise. + * The inputs must be numbers or strings, and both of the same type. + * + * @param compareOne the first expression + * @param compareTwo the second expression + * @return expression + */ + public static Expression<Boolean> gte(@NonNull Expression compareOne, @NonNull Expression compareTwo) { + return new Expression<>(">=", compareOne, compareTwo); + } + + /** + * Returns true if the first input is greater than or equal to the second, false otherwise. + * + * @param compareOne the first number + * @param compareTwo the second number + * @return expression + */ + public static Expression<Boolean> gte(@NonNull Number compareOne, @NonNull Number compareTwo) { + return new Expression<>(">=", literal(compareOne), literal(compareTwo)); + } + + /** + * Returns true if the first input is greater than or equal to the second, false otherwise. + * + * @param compareOne the first string + * @param compareTwo the second string + * @return expression + */ + public static Expression<Boolean> gte(@NonNull String compareOne, @NonNull String compareTwo) { + return new Expression<>(">=", literal(compareOne), literal(compareTwo)); + } + + /** + * Returns true if the first input is less than or equal to the second, false otherwise. + * The inputs must be numbers or strings, and both of the same type. + * + * @param compareOne the first expression + * @param compareTwo the second expression + * @return expression + */ + public static Expression<Boolean> lte(@NonNull Expression compareOne, @NonNull Expression compareTwo) { + return new Expression<>("<=", compareOne, compareTwo); + } + + /** + * Returns true if the first input is less than or equal to the second, false otherwise. + * + * @param compareOne the first number + * @param compareTwo the second number + * @return expression + */ + public static Expression<Boolean> lte(@NonNull Number compareOne, @NonNull Number compareTwo) { + return new Expression<>("<=", literal(compareOne), literal(compareTwo)); + } + + /** + * Returns true if the first input is less than or equal to the second, false otherwise. + * + * @param compareOne the first string + * @param compareTwo the second string + * @return expression + */ + public static Expression<Boolean> lte(@NonNull String compareOne, @NonNull String compareTwo) { + return new Expression<>("<=", literal(compareOne), literal(compareTwo)); + } + + /** + * Returns `true` if all the inputs are `true`, `false` otherwise. + * <p> + * The inputs are evaluated in order, and evaluation is short-circuiting: + * once an input expression evaluates to `false`, + * the result is `false` and no further input expressions are evaluated. + * </p> + * + * @param input expression input + * @return expression + */ + public static Expression<Boolean> all(@NonNull Expression<Boolean>... input) { + return new Expression<>("all", input); + } + + /** + * Returns `true` if any of the inputs are `true`, `false` otherwise. + * <p> + * The inputs are evaluated in order, and evaluation is short-circuiting: + * once an input expression evaluates to `true`, + * the result is `true` and no further input expressions are evaluated. + * </p> + * + * @param input expression input + * @return expression + */ + public static Expression<Boolean> any(@NonNull Expression<Boolean>... input) { + return new Expression<>("any", input); + } + + /** + * Logical negation. Returns `true` if the input is `false`, and `false` if the input is `true`. + * + * @param input expression input + * @return expression + */ + public static Expression<Boolean> not(@NonNull Expression<Boolean> input) { + return new Expression<>("!", input); + } + + /** + * Logical negation. Returns `true` if the input is `false`, and `false` if the input is `true`. + * + * @param input boolean input + * @return expression + */ + public static Expression<Boolean> not(boolean input) { + return not(literal(input)); + } + + /** + * Selects the first output whose corresponding test condition evaluates to true. + * + * @param input expression input + * @return expression + */ + public static Expression switchCase(@NonNull @Size(min = 1) Expression... input) { + return new Expression("case", input); + } + + /** + * Selects the output whose label value matches the input value, or the fallback value if no match is found. + * The `input` can be any string or number expression. + * Each label can either be a single literal value or an array of values. + * + * @param input expression input + * @return expression + */ + public static Expression match(@NonNull @Size(min = 2) Expression... input) { + return new Expression("match", input); + } + + /** + * Selects the output whose label value matches the input value, or the fallback value if no match is found. + * The `input` can be any string or number expression. + * Each label can either be a single literal value or an array of values. + * + * @param input expression input + * @return expression + */ + public static Expression match(@NonNull Expression input, @NonNull Stop... stops) { + Expression[] expressions = new Expression[stops.length * 2]; + for (int i = 0; i < stops.length; i++) { + expressions[i * 2] = literal(stops[i].value); + expressions[i * 2 + 1] = literal(stops[i].output); + } + return match(join(new Expression[] {input}, expressions)); + } + + /** + * Evaluates each expression in turn until the first non-null value is obtained, and returns that value. + * + * @param input expression input + * @return expression + */ + public static Expression coalesce(@NonNull Expression... input) { + return new Expression("coalesce", input); + } + + // + // FeatureData + // + + /** + * Gets the feature properties object. + * <p> + * Note that in some cases, it may be more efficient to use {@link #get(Expression)}} instead. + * </p> + * + * @return expression + */ + public static Expression<Object> properties() { + return new Expression<>("properties"); + } + + /** + * Gets the feature's geometry type: Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon. + * + * @return expression + */ + public static Expression<String> geometryType() { + return new Expression<>("geometry-type"); + } + + /** + * Gets the feature's id, if it has one. + * + * @return expression + */ + public static Expression<Number> id() { + return new Expression<>("id"); + } + + // + // Heatmap + // + + /** + * Gets the kernel density estimation of a pixel in a heatmap layer, + * which is a relative measure of how many data points are crowded around a particular pixel. + * Can only be used in the `heatmap-color` property. + * + * @return expression + */ + public static Expression<Number> heatmapDensity() { + return new Expression<>("heatmap-density"); + } + + // + // Lookup + // + + /** + * Retrieves an item from an array. + * + * @param number the index expression + * @param expression the array expression + * @return expression + */ + public static Expression<Object> at(@NonNull Expression<Number> number, @NonNull Expression expression) { + return new Expression<>("at", number, expression); + } + + /** + * Retrieves an item from an array. + * + * @param number the index expression + * @param expression the array expression + * @return expression + */ + public static Expression<Object> at(@NonNull Number number, @NonNull Expression expression) { + return at(literal(number), expression); + } + + /** + * Retrieves a property value from the current feature's properties, + * or from another object if a second argument is provided. + * Returns null if the requested property is missing. + * + * @param input expression input + * @return expression + */ + public static Expression get(@NonNull Expression<String> input) { + return new Expression<>("get", input); + } + + /** + * Retrieves a property value from the current feature's properties, + * or from another object if a second argument is provided. + * Returns null if the requested property is missing. + * + * @param input string input + * @return expression + */ + public static Expression get(@NonNull String input) { + return get(literal(input)); + } + + /** + * Retrieves a property value from another object. + * Returns null if the requested property is missing. + * + * @param key a property value key + * @param object an expression object + * @return expression + */ + public static Expression get(@NonNull Expression<String> key, @NonNull Expression<Object> object) { + return new Expression<>("get", key, object); + } + + /** + * Retrieves a property value from another object. + * Returns null if the requested property is missing. + * + * @param key a property value key + * @param object an expression object + * @return expression + */ + public static Expression get(@NonNull String key, @NonNull Expression<Object> object) { + return get(literal(key), object); + } + + /** + * Tests for the presence of an property value in the current feature's properties. + * + * @param key the expression property value key + * @return expression + */ + public static Expression<Boolean> has(@NonNull Expression<String> key) { + return new Expression<>("has", key); + } + + /** + * Tests for the presence of an property value in the current feature's properties. + * + * @param key the property value key + * @return expression + */ + public static Expression<Boolean> has(@NonNull String key) { + return has(literal(key)); + } + + /** + * Tests for the presence of an property value from another object. + * + * @param key the expression property value key + * @param object an expression object + * @return expression + */ + public static Expression<Boolean> has(@NonNull Expression<String> key, @NonNull Expression<Object> object) { + return new Expression<>("has", key, object); + } + + /** + * Tests for the presence of an property value from another object. + * + * @param key the property value key + * @param object an expression object + * @return expression + */ + public static Expression<Boolean> has(@NonNull String key, @NonNull Expression<Object> object) { + return has(literal(key), object); + } + + /** + * Gets the length of an array or string. + * + * @param expression an expression object or expression string + * @return expression + */ + public static Expression<Number> length(@NonNull Expression<?> expression) { + return new Expression<>("length", expression); + } + + /** + * Gets the length of an array or string. + * + * @param input a string + * @return expression + */ + public static Expression<Number> length(@NonNull String input) { + return length(literal(input)); + } + + // + // Math + // + + /** + * Returns mathematical constant ln(2). + * + * @return expression + */ + public static Expression<Number> ln2() { + return new Expression<>("ln2"); + } + + /** + * Returns the mathematical constant pi. + * + * @return expression + */ + public static Expression<Number> pi() { + return new Expression<>("pi"); + } + + /** + * Returns the mathematical constant e. + * + * @return expression + */ + public static Expression<Number> e() { + return new Expression<>("e"); + } + + /** + * Returns the sum of the inputs. + * + * @param numbers the numbers to calculate the sum for + * @return expression + */ + public static Expression<Number> sum(@Size(min = 2) Expression<Number>... numbers) { + return new Expression<>("+", numbers); + } + + /** + * Returns the sum of the inputs. + * + * @param numbers the numbers to calculate the sum for + * @return expression + */ + @SuppressWarnings("unchecked") + public static Expression<Number> sum(@Size(min = 2) Number... numbers) { + Expression<Number>[] numberExpression = (Expression<Number>[]) new Expression<?>[numbers.length]; + for (int i = 0; i < numbers.length; i++) { + numberExpression[i] = literal(numbers[i]); + } + return sum(numberExpression); + } + + /** + * Returns the product of the inputs. + * + * @param numbers the numbers to calculate the product for + * @return expression + */ + public static Expression<Number> product(@Size(min = 2) Expression<Number>... numbers) { + return new Expression<>("*", numbers); + } + + /** + * Returns the product of the inputs. + * + * @param numbers the numbers to calculate the product for + * @return expression + */ + @SuppressWarnings("unchecked") + public static Expression<Number> product(@Size(min = 2) Number... numbers) { + Expression<Number>[] numberExpression = (Expression<Number>[]) new Expression<?>[numbers.length]; + for (int i = 0; i < numbers.length; i++) { + numberExpression[i] = literal(numbers[i]); + } + return product(numberExpression); + } + + /** + * Returns the result of subtracting a number from 0. + * + * @param number the number subtract from 0 + * @return expression + */ + public static Expression<Number> subtract(@NonNull Expression<Number> number) { + return new Expression<>("-", number); + } + + /** + * Returns the result of subtracting a number from 0. + * + * @param number the number subtract from 0 + * @return expression + */ + public static Expression<Number> subtract(@NonNull Number number) { + return subtract(literal(number)); + } + + /** + * Returns the result of subtracting the second input from the first. + * + * @param first the first number + * @param second the second number + * @return expression + */ + public static Expression<Number> subtract(@NonNull Expression<Number> first, @NonNull Expression<Number> second) { + return new Expression<>("-", first, second); + } + + /** + * Returns the result of subtracting the second input from the first. + * + * @param first the first number + * @param second the second number + * @return expression + */ + public static Expression<Number> subtract(@NonNull Number first, @NonNull Number second) { + return subtract(literal(first), literal(second)); + } + + /** + * Returns the result of floating point division of the first input by the second. + * + * @param first the first number + * @param second the second number + * @return expression + */ + public static Expression<Number> division(@NonNull Expression<Number> first, @NonNull Expression<Number> second) { + return new Expression<>("/", first, second); + } + + /** + * Returns the result of floating point division of the first input by the second. + * + * @param first the first number + * @param second the second number + * @return expression + */ + public static Expression<Number> division(@NonNull Number first, @NonNull Number second) { + return division(literal(first), literal(second)); + } + + /** + * Returns the remainder after integer division of the first input by the second. + * + * @param first the first number + * @param second the second number + * @return expression + */ + public static Expression<Number> mod(@NonNull Expression<Number> first, @NonNull Expression<Number> second) { + return new Expression<>("%", first, second); + } + + /** + * Returns the remainder after integer division of the first input by the second. + * + * @param first the first number + * @param second the second number + * @return expression + */ + public static Expression<Number> mod(@NonNull Number first, @NonNull Number second) { + return mod(literal(first), literal(second)); + } + + /** + * Returns the result of raising the first input to the power specified by the second. + * + * @param first the first number + * @param second the second number + * @return expression + */ + public static Expression<Number> pow(@NonNull Expression<Number> first, @NonNull Expression<Number> second) { + return new Expression<>("^", first, second); + } + + /** + * Returns the result of raising the first input to the power specified by the second. + * + * @param first the first number + * @param second the second number + * @return expression + */ + public static Expression<Number> pow(@NonNull Number first, @NonNull Number second) { + return pow(literal(first), literal(second)); + } + + /** + * Returns the square root of the input + * + * @param number the number to take the square root from + * @return expression + */ + public static Expression<Number> sqrt(@NonNull Expression<Number> number) { + return new Expression<>("sqrt", number); + } + + /** + * Returns the square root of the input + * + * @param number the number to take the square root from + * @return expression + */ + public static Expression<Number> sqrt(@NonNull Number number) { + return sqrt(literal(number)); + } + + /** + * Returns the base-ten logarithm of the input. + * + * @param number the number to take base-ten logarithm from + * @return expression + */ + public static Expression<Number> log10(@NonNull Expression<Number> number) { + return new Expression<>("log10", number); + } + + /** + * Returns the base-ten logarithm of the input. + * + * @param number the number to take base-ten logarithm from + * @return expression + */ + public static Expression<Number> log10(@NonNull Number number) { + return log10(literal(number)); + } + + /** + * Returns the natural logarithm of the input. + * + * @param number the number to take natural logarithm from + * @return expression + */ + public static Expression<Number> ln(Expression<Number> number) { + return new Expression<>("ln", number); + } + + /** + * Returns the natural logarithm of the input. + * + * @param number the number to take natural logarithm from + * @return expression + */ + public static Expression<Number> ln(Number number) { + return ln(literal(number)); + } + + /** + * Returns the base-two logarithm of the input. + * + * @param number the number to take base-two logarithm from + * @return expression + */ + public static Expression<Number> log2(@NonNull Expression<Number> number) { + return new Expression<>("log2", number); + } + + /** + * Returns the base-two logarithm of the input. + * + * @param number the number to take base-two logarithm from + * @return expression + */ + public static Expression<Number> log2(@NonNull Number number) { + return log2(literal(number)); + } + + /** + * Returns the sine of the input. + * + * @param number the number to calculate the sine for + * @return expression + */ + public static Expression<Number> sin(@NonNull Expression<Number> number) { + return new Expression<>("sin", number); + } + + /** + * Returns the sine of the input. + * + * @param number the number to calculate the sine for + * @return expression + */ + public static Expression<Number> sin(@NonNull Number number) { + return sin(literal(number)); + } + + /** + * Returns the cosine of the input. + * + * @param number the number to calculate the cosine for + * @return expression + */ + public static Expression<Number> cos(@NonNull Expression<Number> number) { + return new Expression<>("cos", number); + } + + /** + * Returns the cosine of the input. + * + * @param number the number to calculate the cosine for + * @return expression + */ + public static Expression<Number> cos(@NonNull Number number) { + return new Expression<>("cos", literal(number)); + } + + /** + * Returns the tangent of the input. + * + * @param number the number to calculate the tangent for + * @return expression + */ + public static Expression<Number> tan(@NonNull Expression<Number> number) { + return new Expression<>("tan", number); + } + + /** + * Returns the tangent of the input. + * + * @param number the number to calculate the tangent for + * @return expression + */ + public static Expression<Number> tan(@NonNull Number number) { + return new Expression<>("tan", literal(number)); + } + + /** + * Returns the arcsine of the input. + * + * @param number the number to calculate the arcsine for + * @return expression + */ + public static Expression<Number> asin(@NonNull Expression<Number> number) { + return new Expression<>("asin", number); + } + + /** + * Returns the arcsine of the input. + * + * @param number the number to calculate the arcsine for + * @return expression + */ + public static Expression<Number> asin(@NonNull Number number) { + return asin(literal(number)); + } + + /** + * Returns the arccosine of the input. + * + * @param number the number to calculate the arccosine for + * @return expression + */ + public static Expression<Number> acos(@NonNull Expression<Number> number) { + return new Expression<>("acos", number); + } + + /** + * Returns the arccosine of the input. + * + * @param number the number to calculate the arccosine for + * @return expression + */ + public static Expression<Number> acos(@NonNull Number number) { + return acos(literal(number)); + } + + /** + * Returns the arctangent of the input. + * + * @param number the number to calculate the arctangent for + * @return expression + */ + public static Expression<Number> atan(@NonNull Expression<Number> number) { + return new Expression("atan", number); + } + + /** + * Returns the arctangent of the input. + * + * @param number the number to calculate the arctangent for + * @return expression + */ + public static Expression<Number> atan(@NonNull Number number) { + return atan(literal(number)); + } + + /** + * Returns the minimum value of the inputs. + * + * @param numbers varargs of numbers to get the minimum from + * @return expression + */ + public static Expression<Number> min(@Size(min = 1) Expression<Number>... numbers) { + return new Expression<>("min", numbers); + } + + /** + * Returns the minimum value of the inputs. + * + * @param numbers varargs of numbers to get the minimum from + * @return expression + */ + @SuppressWarnings("unchecked") + public static Expression<Number> min(@Size(min = 1) Number... numbers) { + Expression<Number>[] numberExpression = (Expression<Number>[]) new Expression<?>[numbers.length]; + for (int i = 0; i < numbers.length; i++) { + numberExpression[i] = literal(numbers[i]); + } + return min(numberExpression); + } + + /** + * Returns the maximum value of the inputs. + * + * @param numbers varargs of numbers to get the maximum from + * @return expression + */ + public static Expression<Number> max(@Size(min = 1) Expression<Number>... numbers) { + return new Expression<>("max", numbers); + } + + /** + * Returns the maximum value of the inputs. + * + * @param numbers varargs of numbers to get the maximum from + * @return expression + */ + @SuppressWarnings("unchecked") + public static Expression<Number> max(@Size(min = 1) Number... numbers) { + Expression<Number>[] numberExpression = (Expression<Number>[]) new Expression<?>[numbers.length]; + for (int i = 0; i < numbers.length; i++) { + numberExpression[i] = literal(numbers[i]); + } + return max(numberExpression); + } + + // + // String + // + + /** + * Returns the input string converted to uppercase. + * <p> + * Follows the Unicode Default Case Conversion algorithm + * and the locale-insensitive case mappings in the Unicode Character Database. + * </p> + * + * @param string the string to upcase + * @return expression + */ + public static Expression<String> upcase(@NonNull Expression<String> string) { + return new Expression<>("upcase", string); + } + + /** + * Returns the input string converted to uppercase. + * <p> + * Follows the Unicode Default Case Conversion algorithm + * and the locale-insensitive case mappings in the Unicode Character Database. + * </p> + * + * @param string string to upcase + * @return expression + */ + public static Expression<String> upcase(@NonNull String string) { + return upcase(literal(string)); + } + + /** + * Returns the input string converted to lowercase. + * <p> + * Follows the Unicode Default Case Conversion algorithm + * and the locale-insensitive case mappings in the Unicode Character Database. + * </p> + * + * @param input expression input + * @return expression + */ + public static Expression<String> downcase(@NonNull Expression<String> input) { + return new Expression<>("downcase", input); + } + + /** + * Returns the input string converted to lowercase. + * <p> + * Follows the Unicode Default Case Conversion algorithm + * and the locale-insensitive case mappings in the Unicode Character Database. + * </p> + * + * @param input string to downcase + * @return expression + */ + public static Expression<String> downcase(@NonNull String input) { + return downcase(literal(input)); + } + + /** + * Returns a string consisting of the concatenation of the inputs. + * + * @param input expression input + * @return expression + */ + public static Expression<String> concat(@NonNull Expression<String>... input) { + return new Expression<>("concat", input); + } + + /** + * Returns a string consisting of the concatenation of the inputs. + * + * @param input expression input + * @return expression + */ + @SuppressWarnings("unchecked") + public static Expression<String> concat(@NonNull String... input) { + Expression<String>[] stringExpression = (Expression<String>[]) new Expression<?>[input.length]; + for (int i = 0; i < input.length; i++) { + stringExpression[i] = literal(input[i]); + } + return concat(stringExpression); + } + + // + // Types + // + + /** + * Asserts that the input is an array (optionally with a specific item type and length). + * If, when the input expression is evaluated, it is not of the asserted type, + * then this assertion will cause the whole expression to be aborted. + * + * @param input expression input + * @return expression + */ + public static Expression<Boolean> array(@NonNull Expression input) { + return new Expression<>("array", input); + } + + /** + * Returns a string describing the type of the given value. + * + * @param input expression input + * @return expression + */ + public static Expression<String> typeOf(@NonNull Expression input) { + return new Expression<>("typeof", input); + } + + /** + * Asserts that the input value is a string. + * If multiple values are provided, each one is evaluated in order until a string value is obtained. + * If none of the inputs are strings, the expression is an error. + * + * @param input expression input + * @return expression + */ + public static Expression<Boolean> string(@NonNull Expression input) { + return new Expression<>("string", input); + } + + /** + * Asserts that the input value is a number. + * If multiple values are provided, each one is evaluated in order until a number value is obtained. + * If none of the inputs are numbers, the expression is an error. + * + * @param input expression input + * @return expression + */ + public static Expression<Boolean> number(@NonNull Expression input) { + return new Expression<>("number", input); + } + + /** + * Asserts that the input value is a boolean. + * If multiple values are provided, each one is evaluated in order until a boolean value is obtained. + * If none of the inputs are booleans, the expression is an error. + * + * @param input expression input + * @return expression + */ + public static Expression<Boolean> bool(@NonNull Expression input) { + return new Expression<>("boolean", input); + } + + /** + * Asserts that the input value is an object. If it is not, the expression is an error + * + * @param input expression input + * @return expression + */ + public static Expression<Boolean> object(@NonNull Expression input) { + return new Expression<>("object", input); + } + + /** + * Converts the input value to a string. + * If the input is null, the result is null. + * If the input is a boolean, the result is true or false. + * If the input is a number, it is converted to a string by NumberToString in the ECMAScript Language Specification. + * If the input is a color, it is converted to a string of the form "rgba(r,g,b,a)", + * where `r`, `g`, and `b` are numerals ranging from 0 to 255, and `a` ranges from 0 to 1. + * Otherwise, the input is converted to a string in the format specified by the JSON.stringify in the ECMAScript + * Language Specification. + * + * @param input expression input + * @return expression + */ + public static Expression<String> toString(@NonNull Expression input) { + return new Expression<>("to-string", input); + } + + /** + * Converts the input value to a number, if possible. + * If the input is null or false, the result is 0. + * If the input is true, the result is 1. + * If the input is a string, it is converted to a number as specified by the ECMAScript Language Specification. + * If multiple values are provided, each one is evaluated in order until the first successful conversion is obtained. + * If none of the inputs can be converted, the expression is an error. + * + * @param input expression input + * @return expression + */ + public static Expression<Number> toNumber(@NonNull Expression input) { + return new Expression<>("to-number", input); + } + + /** + * "Converts the input value to a boolean. The result is `false` when then input is an empty string, 0, false, + * null, or NaN; otherwise it is true. + * + * @param input expression input + * @return expression + */ + public static Expression<Boolean> toBool(@NonNull Expression input) { + return new Expression<>("to-boolean", input); + } + + /** + * Converts the input value to a color. If multiple values are provided, + * each one is evaluated in order until the first successful conversion is obtained. + * If none of the inputs can be converted, the expression is an error. + * + * @param input expression input + * @return expression + */ + public static Expression<Color> toColor(@NonNull Expression input) { + return new Expression<>("to-color", input); + } + + // + // Variable binding + // + + /** + * Binds input to named variables, + * which can then be referenced in the result expression using {@link #var(String)} or {@link #var(Expression)}. + * + * @param input expression input + * @return expression + */ + public static Expression let(@Size(min = 1) Expression... input) { + return new Expression<>("let", input); + } + + /** + * References variable bound using let. + * + * @param expression the variable naming expression that was bound with using let + * @return expression + */ + public static Expression<Object> var(@NonNull Expression<String> expression) { + return new Expression<>("var", expression); + } + + /** + * References variable bound using let. + * + * @param variableName the variable naming that was bound with using let + * @return expression + */ + public static Expression var(@NonNull String variableName) { + return var(literal(variableName)); + } + + // + // Zoom + // + + /** + * Gets the current zoom level. + * <p> + * Note that in style layout and paint properties, + * zoom may only appear as the input to a top-level step or interpolate expression. + * </p> + * + * @return expression + */ + public static Expression<Number> zoom() { + return new Expression<>("zoom"); + } + + // + // Ramps, scales, curves + // + + public static Stop stop(@NonNull Object stop, @NonNull Object value) { + return new Stop(stop, value); + } + + /** + * Produces discrete, stepped results by evaluating a piecewise-constant function defined by pairs of + * input and output values (\"stops\"). The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`). + * Stop inputs must be numeric literals in strictly ascending order. + * Returns the output value of the stop just less than the input, + * or the first input if the input is less than the first stop. + * + * @param input the input value + * @param stops pair of input and output values + * @return expression + */ + public static Expression step(@NonNull Number input, @NonNull Expression expression, Expression... stops) { + return step(literal(input), expression, stops); + } + + /** + * Produces discrete, stepped results by evaluating a piecewise-constant function defined by pairs of + * input and output values (\"stops\"). The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`). + * Stop inputs must be numeric literals in strictly ascending order. + * Returns the output value of the stop just less than the input, + * or the first input if the input is less than the first stop. + * + * @param expression the input expression + * @param stops pair of input and output values + * @return expression + */ + public static Expression step(@NonNull Expression<Number> input, @NonNull Expression expression, Expression... stops) { + return new Expression("step", join(new Expression[] {input, expression}, stops)); + } + + /** + * Produces discrete, stepped results by evaluating a piecewise-constant function defined by pairs of + * input and output values (\"stops\"). The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`). + * Stop inputs must be numeric literals in strictly ascending order. + * Returns the output value of the stop just less than the input, + * or the first input if the input is less than the first stop. + * + * @param input the input value + * @param stops pair of input and output values + * @return expression + */ + public static Expression step(@NonNull Number input, @NonNull Expression expression, Stop... stops) { + Expression[] expressions = new Expression[stops.length * 2]; + for (int i = 0; i < stops.length; i++) { + expressions[i * 2] = literal(stops[i].value); + expressions[i * 2 + 1] = literal(stops[i].output); + } + return step(literal(input), expression, expressions); + } + + /** + * Produces discrete, stepped results by evaluating a piecewise-constant function defined by pairs of + * input and output values (\"stops\"). The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`). + * Stop inputs must be numeric literals in strictly ascending order. + * Returns the output value of the stop just less than the input, + * or the first input if the input is less than the first stop. + * + * @param input the input value + * @param stops pair of input and output values + * @return expression + */ + public static Expression step(@NonNull Expression<Number> input, @NonNull Expression expression, Stop... stops) { + Expression[] expressions = new Expression[stops.length * 2]; + for (int i = 0; i < stops.length; i++) { + expressions[i * 2] = literal(stops[i].value); + expressions[i * 2 + 1] = literal(stops[i].output); + } + return step(input, expression, expressions); + } + + /** + * Produces continuous, smooth results by interpolating between pairs of input and output values (\"stops\"). + * The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`). + * Stop inputs must be numeric literals in strictly ascending order. + * The output type must be `number`, `array<number>`, or `color`. + * + * @param interpolation type of interpolation + * @param number the input expression + * @param stops pair of input and output values + * @return expression + */ + public static Expression interpolate(@NonNull Expression<Interpolator> interpolation, + @NonNull Expression<Number> number, Expression... stops) { + return new Expression("interpolate", join(new Expression[] {interpolation, number}, stops)); + } + + /** + * Produces continuous, smooth results by interpolating between pairs of input and output values (\"stops\"). + * The `input` may be any numeric expression (e.g., `[\"get\", \"population\"]`). + * Stop inputs must be numeric literals in strictly ascending order. + * The output type must be `number`, `array<number>`, or `color`. + * + * @param interpolation type of interpolation + * @param number the input expression + * @param stops pair of input and output values + * @return expression + */ + public static Expression interpolate(@NonNull Expression<Interpolator> interpolation, + @NonNull Expression<Number> number, Stop... stops) { + Expression[] expressions = new Expression[stops.length * 2]; + for (int i = 0; i < stops.length; i++) { + expressions[i * 2] = literal(stops[i].value); + expressions[i * 2 + 1] = literal(stops[i].output); + } + return interpolate(interpolation, number, expressions); + } + + /** + * interpolates linearly between the pair of stops just less than and just greater than the input. + * + * @return expression + */ + public static Expression<Interpolator> linear() { + return new Expression<>("linear"); + } + + /** + * Interpolates exponentially between the stops just less than and just greater than the input. + * `base` controls the rate at which the output increases: + * higher values make the output increase more towards the high end of the range. + * With values close to 1 the output increases linearly. + * + * @param base value controlling the route at which the output increases + * @return expression + */ + public static Expression<Interpolator> exponential(@NonNull Number base) { + return exponential(literal(base)); + } + + /** + * Interpolates exponentially between the stops just less than and just greater than the input. + * The parameter controls the rate at which the output increases: + * higher values make the output increase more towards the high end of the range. + * With values close to 1 the output increases linearly. + * + * @param expression base number expression + * @return expression + */ + public static Expression<Interpolator> exponential(@NonNull Expression<Number> expression) { + return new Expression<>("exponential", expression); + } + + /** + * Interpolates using the cubic bezier curve defined by the given control points. + * + * @param x1 x value of the first point of a cubic bezier, ranges from 0 to 1 + * @param y1 y value of the first point of a cubic bezier, ranges from 0 to 1 + * @param x2 x value of the second point of a cubic bezier, ranges from 0 to 1 + * @param y2 y value fo the second point of a cubic bezier, ranges from 0 to 1 + * @return expression + */ + public static Expression<Interpolator> cubicBezier(@NonNull Expression<Number> x1, @NonNull Expression<Number> y1, + @NonNull Expression<Number> x2, @NonNull Expression<Number> y2) { + return new Expression<>("cubic-bezier", x1, y1, x2, y2); + } + + /** + * Interpolates using the cubic bezier curve defined by the given control points. + * + * @param x1 x value of the first point of a cubic bezier, ranges from 0 to 1 + * @param y1 y value of the first point of a cubic bezier, ranges from 0 to 1 + * @param x2 x value of the second point of a cubic bezier, ranges from 0 to 1 + * @param y2 y value fo the second point of a cubic bezier, ranges from 0 to 1 + * @return expression + */ + public static Expression<Interpolator> cubicBezier(@NonNull Number x1, @NonNull Number y1, + @NonNull Number x2, @NonNull Number y2) { + return cubicBezier(literal(x1), literal(y1), literal(x2), literal(y2)); + } + + /** + * Joins two expressions arrays. + * <p> + * This flattens the object array output of an expression from a nested expression hierarchy. + * </p> + * + * @param left the left part of an expression + * @param right the right part of an expression + * @return the joined expression + */ + private static Expression[] join(Expression[] left, Expression[] right) { + Expression[] output = new Expression[left.length + right.length]; + System.arraycopy(left, 0, output, 0, left.length); + System.arraycopy(right, 0, output, left.length, right.length); + return output; + } + +}
\ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Layer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Layer.java index 5015dd009d..5400e04589 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Layer.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Layer.java @@ -2,6 +2,7 @@ package com.mapbox.mapboxsdk.style.layers; import android.support.annotation.NonNull; +import com.mapbox.mapboxsdk.style.expressions.Expression; import com.mapbox.mapboxsdk.style.functions.Function; /** @@ -88,6 +89,14 @@ public abstract class Layer { } private Object convertValue(Object value) { - return value != null && value instanceof Function ? ((Function) value).toValueObject() : value; + if (value != null) { + if (value instanceof Function) { + return ((Function) value).toValueObject(); + } else if (value instanceof Expression) { + return ((Expression) value).toArray(); + } + } + return value; } -} + +}
\ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Property.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Property.java index 8d5858217b..8d6c7dd055 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Property.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/Property.java @@ -402,7 +402,7 @@ public final class Property { @Retention(RetentionPolicy.SOURCE) public @interface TEXT_TRANSFORM {} - // FILL_TRANSLATE_ANCHOR: Controls the translation reference point. + // FILL_TRANSLATE_ANCHOR: Controls the frame of reference for `fill-translate`. /** * The fill is translated relative to the map. @@ -414,7 +414,7 @@ public final class Property { public static final String FILL_TRANSLATE_ANCHOR_VIEWPORT = "viewport"; /** - * Controls the translation reference point. + * Controls the frame of reference for `fill-translate`. */ @StringDef({ FILL_TRANSLATE_ANCHOR_MAP, @@ -423,7 +423,7 @@ public final class Property { @Retention(RetentionPolicy.SOURCE) public @interface FILL_TRANSLATE_ANCHOR {} - // LINE_TRANSLATE_ANCHOR: Controls the translation reference point. + // LINE_TRANSLATE_ANCHOR: Controls the frame of reference for `line-translate`. /** * The line is translated relative to the map. @@ -435,7 +435,7 @@ public final class Property { public static final String LINE_TRANSLATE_ANCHOR_VIEWPORT = "viewport"; /** - * Controls the translation reference point. + * Controls the frame of reference for `line-translate`. */ @StringDef({ LINE_TRANSLATE_ANCHOR_MAP, @@ -444,7 +444,7 @@ public final class Property { @Retention(RetentionPolicy.SOURCE) public @interface LINE_TRANSLATE_ANCHOR {} - // ICON_TRANSLATE_ANCHOR: Controls the translation reference point. + // ICON_TRANSLATE_ANCHOR: Controls the frame of reference for `icon-translate`. /** * Icons are translated relative to the map. @@ -456,7 +456,7 @@ public final class Property { public static final String ICON_TRANSLATE_ANCHOR_VIEWPORT = "viewport"; /** - * Controls the translation reference point. + * Controls the frame of reference for `icon-translate`. */ @StringDef({ ICON_TRANSLATE_ANCHOR_MAP, @@ -465,7 +465,7 @@ public final class Property { @Retention(RetentionPolicy.SOURCE) public @interface ICON_TRANSLATE_ANCHOR {} - // TEXT_TRANSLATE_ANCHOR: Controls the translation reference point. + // TEXT_TRANSLATE_ANCHOR: Controls the frame of reference for `text-translate`. /** * The text is translated relative to the map. @@ -477,7 +477,7 @@ public final class Property { public static final String TEXT_TRANSLATE_ANCHOR_VIEWPORT = "viewport"; /** - * Controls the translation reference point. + * Controls the frame of reference for `text-translate`. */ @StringDef({ TEXT_TRANSLATE_ANCHOR_MAP, @@ -486,7 +486,7 @@ public final class Property { @Retention(RetentionPolicy.SOURCE) public @interface TEXT_TRANSLATE_ANCHOR {} - // CIRCLE_TRANSLATE_ANCHOR: Controls the translation reference point. + // CIRCLE_TRANSLATE_ANCHOR: Controls the frame of reference for `circle-translate`. /** * The circle is translated relative to the map. @@ -498,7 +498,7 @@ public final class Property { public static final String CIRCLE_TRANSLATE_ANCHOR_VIEWPORT = "viewport"; /** - * Controls the translation reference point. + * Controls the frame of reference for `circle-translate`. */ @StringDef({ CIRCLE_TRANSLATE_ANCHOR_MAP, @@ -549,7 +549,7 @@ public final class Property { @Retention(RetentionPolicy.SOURCE) public @interface CIRCLE_PITCH_ALIGNMENT {} - // FILL_EXTRUSION_TRANSLATE_ANCHOR: Controls the translation reference point. + // FILL_EXTRUSION_TRANSLATE_ANCHOR: Controls the frame of reference for `fill-extrusion-translate`. /** * The fill extrusion is translated relative to the map. @@ -561,7 +561,7 @@ public final class Property { public static final String FILL_EXTRUSION_TRANSLATE_ANCHOR_VIEWPORT = "viewport"; /** - * Controls the translation reference point. + * Controls the frame of reference for `fill-extrusion-translate`. */ @StringDef({ FILL_EXTRUSION_TRANSLATE_ANCHOR_MAP, diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java index c43977aec6..93d4cfa1b7 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java @@ -2,11 +2,11 @@ package com.mapbox.mapboxsdk.style.layers; -import android.annotation.SuppressLint; import android.support.annotation.ColorInt; -import com.mapbox.mapboxsdk.style.functions.Function; import com.mapbox.mapboxsdk.style.functions.CameraFunction; +import com.mapbox.mapboxsdk.style.expressions.Expression; +import com.mapbox.mapboxsdk.style.functions.Function; import java.util.Locale; @@ -34,6 +34,7 @@ public class PropertyFactory { * @param function the visibility function * @return property wrapper around a String function */ + @Deprecated public static <T> PropertyValue<Function<T, String>> visibility(Function<T, String> function) { return new LayoutPropertyValue<>("visibility", function); } @@ -48,6 +49,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("fill-antialias", value); } + /** + * Whether or not the fill should be antialiased. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> fillAntialias(Expression expression) { + return new PaintPropertyValue<>("fill-antialias", expression); + } + /** * Whether or not the fill should be antialiased. @@ -56,6 +67,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Boolean * @return property wrapper around a Boolean function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Boolean>> fillAntialias(CameraFunction<Z, Boolean> function) { return new PaintPropertyValue<>("fill-antialias", function); } @@ -70,6 +82,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("fill-opacity", value); } + /** + * The opacity of the entire fill layer. In contrast to the {@link PropertyFactory#fillColor}, this value will also affect the 1px stroke around the fill, if the stroke is used. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> fillOpacity(Expression expression) { + return new PaintPropertyValue<>("fill-opacity", expression); + } + /** * The opacity of the entire fill layer. In contrast to the {@link PropertyFactory#fillColor}, this value will also affect the 1px stroke around the fill, if the stroke is used. @@ -78,6 +100,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> fillOpacity(Function<T, Float> function) { return new PaintPropertyValue<>("fill-opacity", function); } @@ -102,6 +125,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("fill-color", value); } + /** + * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> fillColor(Expression expression) { + return new PaintPropertyValue<>("fill-color", expression); + } + /** * The color of the filled part of this layer. This color can be specified as `rgba` with an alpha component and the color's opacity will not affect the opacity of the 1px stroke, if it is used. @@ -110,6 +143,7 @@ public class PropertyFactory { * @param function a wrapper function for String * @return property wrapper around a String function */ + @Deprecated public static <T> PropertyValue<Function<T, String>> fillColor(Function<T, String> function) { return new PaintPropertyValue<>("fill-color", function); } @@ -134,6 +168,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("fill-outline-color", value); } + /** + * The outline color of the fill. Matches the value of {@link PropertyFactory#fillColor} if unspecified. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> fillOutlineColor(Expression expression) { + return new PaintPropertyValue<>("fill-outline-color", expression); + } + /** * The outline color of the fill. Matches the value of {@link PropertyFactory#fillColor} if unspecified. @@ -142,6 +186,7 @@ public class PropertyFactory { * @param function a wrapper function for String * @return property wrapper around a String function */ + @Deprecated public static <T> PropertyValue<Function<T, String>> fillOutlineColor(Function<T, String> function) { return new PaintPropertyValue<>("fill-outline-color", function); } @@ -156,6 +201,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("fill-translate", value); } + /** + * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> fillTranslate(Expression expression) { + return new PaintPropertyValue<>("fill-translate", expression); + } + /** * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. @@ -164,12 +219,13 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Float[] * @return property wrapper around a Float[] function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Float[]>> fillTranslate(CameraFunction<Z, Float[]> function) { return new PaintPropertyValue<>("fill-translate", function); } /** - * Controls the translation reference point. + * Controls the frame of reference for {@link PropertyFactory#fillTranslate}. * * @param value a String value * @return property wrapper around String @@ -178,14 +234,25 @@ public class PropertyFactory { return new PaintPropertyValue<>("fill-translate-anchor", value); } + /** + * Controls the frame of reference for {@link PropertyFactory#fillTranslate}. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> fillTranslateAnchor(Expression expression) { + return new PaintPropertyValue<>("fill-translate-anchor", expression); + } + /** - * Controls the translation reference point. + * Controls the frame of reference for {@link PropertyFactory#fillTranslate}. * * @param <Z> the zoom parameter type * @param function a wrapper {@link CameraFunction} for String * @return property wrapper around a String function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, String>> fillTranslateAnchor(CameraFunction<Z, String> function) { return new PaintPropertyValue<>("fill-translate-anchor", function); } @@ -200,6 +267,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("fill-pattern", value); } + /** + * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> fillPattern(Expression expression) { + return new PaintPropertyValue<>("fill-pattern", expression); + } + /** * Name of image in sprite to use for drawing image fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). @@ -208,6 +285,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for String * @return property wrapper around a String function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, String>> fillPattern(CameraFunction<Z, String> function) { return new PaintPropertyValue<>("fill-pattern", function); } @@ -222,6 +300,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("line-opacity", value); } + /** + * The opacity at which the line will be drawn. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> lineOpacity(Expression expression) { + return new PaintPropertyValue<>("line-opacity", expression); + } + /** * The opacity at which the line will be drawn. @@ -230,6 +318,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> lineOpacity(Function<T, Float> function) { return new PaintPropertyValue<>("line-opacity", function); } @@ -254,6 +343,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("line-color", value); } + /** + * The color with which the line will be drawn. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> lineColor(Expression expression) { + return new PaintPropertyValue<>("line-color", expression); + } + /** * The color with which the line will be drawn. @@ -262,6 +361,7 @@ public class PropertyFactory { * @param function a wrapper function for String * @return property wrapper around a String function */ + @Deprecated public static <T> PropertyValue<Function<T, String>> lineColor(Function<T, String> function) { return new PaintPropertyValue<>("line-color", function); } @@ -276,6 +376,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("line-translate", value); } + /** + * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> lineTranslate(Expression expression) { + return new PaintPropertyValue<>("line-translate", expression); + } + /** * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. @@ -284,12 +394,13 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Float[] * @return property wrapper around a Float[] function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Float[]>> lineTranslate(CameraFunction<Z, Float[]> function) { return new PaintPropertyValue<>("line-translate", function); } /** - * Controls the translation reference point. + * Controls the frame of reference for {@link PropertyFactory#lineTranslate}. * * @param value a String value * @return property wrapper around String @@ -298,14 +409,25 @@ public class PropertyFactory { return new PaintPropertyValue<>("line-translate-anchor", value); } + /** + * Controls the frame of reference for {@link PropertyFactory#lineTranslate}. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> lineTranslateAnchor(Expression expression) { + return new PaintPropertyValue<>("line-translate-anchor", expression); + } + /** - * Controls the translation reference point. + * Controls the frame of reference for {@link PropertyFactory#lineTranslate}. * * @param <Z> the zoom parameter type * @param function a wrapper {@link CameraFunction} for String * @return property wrapper around a String function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, String>> lineTranslateAnchor(CameraFunction<Z, String> function) { return new PaintPropertyValue<>("line-translate-anchor", function); } @@ -320,6 +442,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("line-width", value); } + /** + * Stroke thickness. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> lineWidth(Expression expression) { + return new PaintPropertyValue<>("line-width", expression); + } + /** * Stroke thickness. @@ -328,6 +460,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> lineWidth(Function<T, Float> function) { return new PaintPropertyValue<>("line-width", function); } @@ -342,6 +475,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("line-gap-width", value); } + /** + * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> lineGapWidth(Expression expression) { + return new PaintPropertyValue<>("line-gap-width", expression); + } + /** * Draws a line casing outside of a line's actual path. Value indicates the width of the inner gap. @@ -350,6 +493,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> lineGapWidth(Function<T, Float> function) { return new PaintPropertyValue<>("line-gap-width", function); } @@ -364,6 +508,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("line-offset", value); } + /** + * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> lineOffset(Expression expression) { + return new PaintPropertyValue<>("line-offset", expression); + } + /** * The line's offset. For linear features, a positive value offsets the line to the right, relative to the direction of the line, and a negative value to the left. For polygon features, a positive value results in an inset, and a negative value results in an outset. @@ -372,6 +526,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> lineOffset(Function<T, Float> function) { return new PaintPropertyValue<>("line-offset", function); } @@ -386,6 +541,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("line-blur", value); } + /** + * Blur applied to the line, in density-independent pixels. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> lineBlur(Expression expression) { + return new PaintPropertyValue<>("line-blur", expression); + } + /** * Blur applied to the line, in density-independent pixels. @@ -394,6 +559,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> lineBlur(Function<T, Float> function) { return new PaintPropertyValue<>("line-blur", function); } @@ -408,6 +574,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("line-dasharray", value); } + /** + * Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to density-independent pixels, multiply the length by the current line width. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> lineDasharray(Expression expression) { + return new PaintPropertyValue<>("line-dasharray", expression); + } + /** * Specifies the lengths of the alternating dashes and gaps that form the dash pattern. The lengths are later scaled by the line width. To convert a dash length to density-independent pixels, multiply the length by the current line width. @@ -416,6 +592,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Float[] * @return property wrapper around a Float[] function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Float[]>> lineDasharray(CameraFunction<Z, Float[]> function) { return new PaintPropertyValue<>("line-dasharray", function); } @@ -430,6 +607,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("line-pattern", value); } + /** + * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> linePattern(Expression expression) { + return new PaintPropertyValue<>("line-pattern", expression); + } + /** * Name of image in sprite to use for drawing image lines. For seamless patterns, image width must be a factor of two (2, 4, 8, ..., 512). @@ -438,6 +625,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for String * @return property wrapper around a String function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, String>> linePattern(CameraFunction<Z, String> function) { return new PaintPropertyValue<>("line-pattern", function); } @@ -452,6 +640,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("icon-opacity", value); } + /** + * The opacity at which the icon will be drawn. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> iconOpacity(Expression expression) { + return new PaintPropertyValue<>("icon-opacity", expression); + } + /** * The opacity at which the icon will be drawn. @@ -460,6 +658,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> iconOpacity(Function<T, Float> function) { return new PaintPropertyValue<>("icon-opacity", function); } @@ -484,6 +683,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("icon-color", value); } + /** + * The color of the icon. This can only be used with sdf icons. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> iconColor(Expression expression) { + return new PaintPropertyValue<>("icon-color", expression); + } + /** * The color of the icon. This can only be used with sdf icons. @@ -492,6 +701,7 @@ public class PropertyFactory { * @param function a wrapper function for String * @return property wrapper around a String function */ + @Deprecated public static <T> PropertyValue<Function<T, String>> iconColor(Function<T, String> function) { return new PaintPropertyValue<>("icon-color", function); } @@ -516,6 +726,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("icon-halo-color", value); } + /** + * The color of the icon's halo. Icon halos can only be used with SDF icons. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> iconHaloColor(Expression expression) { + return new PaintPropertyValue<>("icon-halo-color", expression); + } + /** * The color of the icon's halo. Icon halos can only be used with SDF icons. @@ -524,6 +744,7 @@ public class PropertyFactory { * @param function a wrapper function for String * @return property wrapper around a String function */ + @Deprecated public static <T> PropertyValue<Function<T, String>> iconHaloColor(Function<T, String> function) { return new PaintPropertyValue<>("icon-halo-color", function); } @@ -538,6 +759,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("icon-halo-width", value); } + /** + * Distance of halo to the icon outline. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> iconHaloWidth(Expression expression) { + return new PaintPropertyValue<>("icon-halo-width", expression); + } + /** * Distance of halo to the icon outline. @@ -546,6 +777,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> iconHaloWidth(Function<T, Float> function) { return new PaintPropertyValue<>("icon-halo-width", function); } @@ -560,6 +792,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("icon-halo-blur", value); } + /** + * Fade out the halo towards the outside. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> iconHaloBlur(Expression expression) { + return new PaintPropertyValue<>("icon-halo-blur", expression); + } + /** * Fade out the halo towards the outside. @@ -568,6 +810,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> iconHaloBlur(Function<T, Float> function) { return new PaintPropertyValue<>("icon-halo-blur", function); } @@ -582,6 +825,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("icon-translate", value); } + /** + * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> iconTranslate(Expression expression) { + return new PaintPropertyValue<>("icon-translate", expression); + } + /** * Distance that the icon's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. @@ -590,12 +843,13 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Float[] * @return property wrapper around a Float[] function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Float[]>> iconTranslate(CameraFunction<Z, Float[]> function) { return new PaintPropertyValue<>("icon-translate", function); } /** - * Controls the translation reference point. + * Controls the frame of reference for {@link PropertyFactory#iconTranslate}. * * @param value a String value * @return property wrapper around String @@ -604,14 +858,25 @@ public class PropertyFactory { return new PaintPropertyValue<>("icon-translate-anchor", value); } + /** + * Controls the frame of reference for {@link PropertyFactory#iconTranslate}. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> iconTranslateAnchor(Expression expression) { + return new PaintPropertyValue<>("icon-translate-anchor", expression); + } + /** - * Controls the translation reference point. + * Controls the frame of reference for {@link PropertyFactory#iconTranslate}. * * @param <Z> the zoom parameter type * @param function a wrapper {@link CameraFunction} for String * @return property wrapper around a String function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, String>> iconTranslateAnchor(CameraFunction<Z, String> function) { return new PaintPropertyValue<>("icon-translate-anchor", function); } @@ -626,6 +891,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("text-opacity", value); } + /** + * The opacity at which the text will be drawn. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> textOpacity(Expression expression) { + return new PaintPropertyValue<>("text-opacity", expression); + } + /** * The opacity at which the text will be drawn. @@ -634,6 +909,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> textOpacity(Function<T, Float> function) { return new PaintPropertyValue<>("text-opacity", function); } @@ -658,6 +934,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("text-color", value); } + /** + * The color with which the text will be drawn. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> textColor(Expression expression) { + return new PaintPropertyValue<>("text-color", expression); + } + /** * The color with which the text will be drawn. @@ -666,6 +952,7 @@ public class PropertyFactory { * @param function a wrapper function for String * @return property wrapper around a String function */ + @Deprecated public static <T> PropertyValue<Function<T, String>> textColor(Function<T, String> function) { return new PaintPropertyValue<>("text-color", function); } @@ -690,6 +977,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("text-halo-color", value); } + /** + * The color of the text's halo, which helps it stand out from backgrounds. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> textHaloColor(Expression expression) { + return new PaintPropertyValue<>("text-halo-color", expression); + } + /** * The color of the text's halo, which helps it stand out from backgrounds. @@ -698,6 +995,7 @@ public class PropertyFactory { * @param function a wrapper function for String * @return property wrapper around a String function */ + @Deprecated public static <T> PropertyValue<Function<T, String>> textHaloColor(Function<T, String> function) { return new PaintPropertyValue<>("text-halo-color", function); } @@ -712,6 +1010,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("text-halo-width", value); } + /** + * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> textHaloWidth(Expression expression) { + return new PaintPropertyValue<>("text-halo-width", expression); + } + /** * Distance of halo to the font outline. Max text halo width is 1/4 of the font-size. @@ -720,6 +1028,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> textHaloWidth(Function<T, Float> function) { return new PaintPropertyValue<>("text-halo-width", function); } @@ -734,6 +1043,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("text-halo-blur", value); } + /** + * The halo's fadeout distance towards the outside. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> textHaloBlur(Expression expression) { + return new PaintPropertyValue<>("text-halo-blur", expression); + } + /** * The halo's fadeout distance towards the outside. @@ -742,6 +1061,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> textHaloBlur(Function<T, Float> function) { return new PaintPropertyValue<>("text-halo-blur", function); } @@ -756,6 +1076,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("text-translate", value); } + /** + * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> textTranslate(Expression expression) { + return new PaintPropertyValue<>("text-translate", expression); + } + /** * Distance that the text's anchor is moved from its original placement. Positive values indicate right and down, while negative values indicate left and up. @@ -764,12 +1094,13 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Float[] * @return property wrapper around a Float[] function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Float[]>> textTranslate(CameraFunction<Z, Float[]> function) { return new PaintPropertyValue<>("text-translate", function); } /** - * Controls the translation reference point. + * Controls the frame of reference for {@link PropertyFactory#textTranslate}. * * @param value a String value * @return property wrapper around String @@ -778,14 +1109,25 @@ public class PropertyFactory { return new PaintPropertyValue<>("text-translate-anchor", value); } + /** + * Controls the frame of reference for {@link PropertyFactory#textTranslate}. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> textTranslateAnchor(Expression expression) { + return new PaintPropertyValue<>("text-translate-anchor", expression); + } + /** - * Controls the translation reference point. + * Controls the frame of reference for {@link PropertyFactory#textTranslate}. * * @param <Z> the zoom parameter type * @param function a wrapper {@link CameraFunction} for String * @return property wrapper around a String function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, String>> textTranslateAnchor(CameraFunction<Z, String> function) { return new PaintPropertyValue<>("text-translate-anchor", function); } @@ -800,6 +1142,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("circle-radius", value); } + /** + * Circle radius. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> circleRadius(Expression expression) { + return new PaintPropertyValue<>("circle-radius", expression); + } + /** * Circle radius. @@ -808,6 +1160,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> circleRadius(Function<T, Float> function) { return new PaintPropertyValue<>("circle-radius", function); } @@ -832,6 +1185,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("circle-color", value); } + /** + * The fill color of the circle. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> circleColor(Expression expression) { + return new PaintPropertyValue<>("circle-color", expression); + } + /** * The fill color of the circle. @@ -840,6 +1203,7 @@ public class PropertyFactory { * @param function a wrapper function for String * @return property wrapper around a String function */ + @Deprecated public static <T> PropertyValue<Function<T, String>> circleColor(Function<T, String> function) { return new PaintPropertyValue<>("circle-color", function); } @@ -854,6 +1218,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("circle-blur", value); } + /** + * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> circleBlur(Expression expression) { + return new PaintPropertyValue<>("circle-blur", expression); + } + /** * Amount to blur the circle. 1 blurs the circle such that only the centerpoint is full opacity. @@ -862,6 +1236,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> circleBlur(Function<T, Float> function) { return new PaintPropertyValue<>("circle-blur", function); } @@ -876,6 +1251,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("circle-opacity", value); } + /** + * The opacity at which the circle will be drawn. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> circleOpacity(Expression expression) { + return new PaintPropertyValue<>("circle-opacity", expression); + } + /** * The opacity at which the circle will be drawn. @@ -884,6 +1269,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> circleOpacity(Function<T, Float> function) { return new PaintPropertyValue<>("circle-opacity", function); } @@ -898,6 +1284,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("circle-translate", value); } + /** + * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> circleTranslate(Expression expression) { + return new PaintPropertyValue<>("circle-translate", expression); + } + /** * The geometry's offset. Values are [x, y] where negatives indicate left and up, respectively. @@ -906,12 +1302,13 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Float[] * @return property wrapper around a Float[] function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Float[]>> circleTranslate(CameraFunction<Z, Float[]> function) { return new PaintPropertyValue<>("circle-translate", function); } /** - * Controls the translation reference point. + * Controls the frame of reference for {@link PropertyFactory#circleTranslate}. * * @param value a String value * @return property wrapper around String @@ -920,14 +1317,25 @@ public class PropertyFactory { return new PaintPropertyValue<>("circle-translate-anchor", value); } + /** + * Controls the frame of reference for {@link PropertyFactory#circleTranslate}. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> circleTranslateAnchor(Expression expression) { + return new PaintPropertyValue<>("circle-translate-anchor", expression); + } + /** - * Controls the translation reference point. + * Controls the frame of reference for {@link PropertyFactory#circleTranslate}. * * @param <Z> the zoom parameter type * @param function a wrapper {@link CameraFunction} for String * @return property wrapper around a String function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, String>> circleTranslateAnchor(CameraFunction<Z, String> function) { return new PaintPropertyValue<>("circle-translate-anchor", function); } @@ -942,6 +1350,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("circle-pitch-scale", value); } + /** + * Controls the scaling behavior of the circle when the map is pitched. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> circlePitchScale(Expression expression) { + return new PaintPropertyValue<>("circle-pitch-scale", expression); + } + /** * Controls the scaling behavior of the circle when the map is pitched. @@ -950,6 +1368,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for String * @return property wrapper around a String function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, String>> circlePitchScale(CameraFunction<Z, String> function) { return new PaintPropertyValue<>("circle-pitch-scale", function); } @@ -964,6 +1383,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("circle-pitch-alignment", value); } + /** + * Orientation of circle when map is pitched. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> circlePitchAlignment(Expression expression) { + return new PaintPropertyValue<>("circle-pitch-alignment", expression); + } + /** * Orientation of circle when map is pitched. @@ -972,6 +1401,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for String * @return property wrapper around a String function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, String>> circlePitchAlignment(CameraFunction<Z, String> function) { return new PaintPropertyValue<>("circle-pitch-alignment", function); } @@ -986,6 +1416,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("circle-stroke-width", value); } + /** + * The width of the circle's stroke. Strokes are placed outside of the {@link PropertyFactory#circleRadius}. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> circleStrokeWidth(Expression expression) { + return new PaintPropertyValue<>("circle-stroke-width", expression); + } + /** * The width of the circle's stroke. Strokes are placed outside of the {@link PropertyFactory#circleRadius}. @@ -994,6 +1434,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> circleStrokeWidth(Function<T, Float> function) { return new PaintPropertyValue<>("circle-stroke-width", function); } @@ -1018,6 +1459,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("circle-stroke-color", value); } + /** + * The stroke color of the circle. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> circleStrokeColor(Expression expression) { + return new PaintPropertyValue<>("circle-stroke-color", expression); + } + /** * The stroke color of the circle. @@ -1026,6 +1477,7 @@ public class PropertyFactory { * @param function a wrapper function for String * @return property wrapper around a String function */ + @Deprecated public static <T> PropertyValue<Function<T, String>> circleStrokeColor(Function<T, String> function) { return new PaintPropertyValue<>("circle-stroke-color", function); } @@ -1040,6 +1492,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("circle-stroke-opacity", value); } + /** + * The opacity of the circle's stroke. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> circleStrokeOpacity(Expression expression) { + return new PaintPropertyValue<>("circle-stroke-opacity", expression); + } + /** * The opacity of the circle's stroke. @@ -1048,6 +1510,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> circleStrokeOpacity(Function<T, Float> function) { return new PaintPropertyValue<>("circle-stroke-opacity", function); } @@ -1062,6 +1525,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("fill-extrusion-opacity", value); } + /** + * The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> fillExtrusionOpacity(Expression expression) { + return new PaintPropertyValue<>("fill-extrusion-opacity", expression); + } + /** * The opacity of the entire fill extrusion layer. This is rendered on a per-layer, not per-feature, basis, and data-driven styling is not available. @@ -1070,6 +1543,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Float * @return property wrapper around a Float function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Float>> fillExtrusionOpacity(CameraFunction<Z, Float> function) { return new PaintPropertyValue<>("fill-extrusion-opacity", function); } @@ -1094,6 +1568,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("fill-extrusion-color", value); } + /** + * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use {@link PropertyFactory#fillExtrusionOpacity} to set layer opacity. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> fillExtrusionColor(Expression expression) { + return new PaintPropertyValue<>("fill-extrusion-color", expression); + } + /** * The base color of the extruded fill. The extrusion's surfaces will be shaded differently based on this color in combination with the root `light` settings. If this color is specified as `rgba` with an alpha component, the alpha component will be ignored; use {@link PropertyFactory#fillExtrusionOpacity} to set layer opacity. @@ -1102,6 +1586,7 @@ public class PropertyFactory { * @param function a wrapper function for String * @return property wrapper around a String function */ + @Deprecated public static <T> PropertyValue<Function<T, String>> fillExtrusionColor(Function<T, String> function) { return new PaintPropertyValue<>("fill-extrusion-color", function); } @@ -1116,6 +1601,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("fill-extrusion-translate", value); } + /** + * The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> fillExtrusionTranslate(Expression expression) { + return new PaintPropertyValue<>("fill-extrusion-translate", expression); + } + /** * The geometry's offset. Values are [x, y] where negatives indicate left and up (on the flat plane), respectively. @@ -1124,12 +1619,13 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Float[] * @return property wrapper around a Float[] function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Float[]>> fillExtrusionTranslate(CameraFunction<Z, Float[]> function) { return new PaintPropertyValue<>("fill-extrusion-translate", function); } /** - * Controls the translation reference point. + * Controls the frame of reference for {@link PropertyFactory#fillExtrusionTranslate}. * * @param value a String value * @return property wrapper around String @@ -1138,14 +1634,25 @@ public class PropertyFactory { return new PaintPropertyValue<>("fill-extrusion-translate-anchor", value); } + /** + * Controls the frame of reference for {@link PropertyFactory#fillExtrusionTranslate}. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> fillExtrusionTranslateAnchor(Expression expression) { + return new PaintPropertyValue<>("fill-extrusion-translate-anchor", expression); + } + /** - * Controls the translation reference point. + * Controls the frame of reference for {@link PropertyFactory#fillExtrusionTranslate}. * * @param <Z> the zoom parameter type * @param function a wrapper {@link CameraFunction} for String * @return property wrapper around a String function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, String>> fillExtrusionTranslateAnchor(CameraFunction<Z, String> function) { return new PaintPropertyValue<>("fill-extrusion-translate-anchor", function); } @@ -1160,6 +1667,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("fill-extrusion-pattern", value); } + /** + * Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> fillExtrusionPattern(Expression expression) { + return new PaintPropertyValue<>("fill-extrusion-pattern", expression); + } + /** * Name of image in sprite to use for drawing images on extruded fills. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). @@ -1168,6 +1685,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for String * @return property wrapper around a String function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, String>> fillExtrusionPattern(CameraFunction<Z, String> function) { return new PaintPropertyValue<>("fill-extrusion-pattern", function); } @@ -1182,6 +1700,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("fill-extrusion-height", value); } + /** + * The height with which to extrude this layer. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> fillExtrusionHeight(Expression expression) { + return new PaintPropertyValue<>("fill-extrusion-height", expression); + } + /** * The height with which to extrude this layer. @@ -1190,6 +1718,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> fillExtrusionHeight(Function<T, Float> function) { return new PaintPropertyValue<>("fill-extrusion-height", function); } @@ -1204,6 +1733,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("fill-extrusion-base", value); } + /** + * The height with which to extrude the base of this layer. Must be less than or equal to {@link PropertyFactory#fillExtrusionHeight}. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> fillExtrusionBase(Expression expression) { + return new PaintPropertyValue<>("fill-extrusion-base", expression); + } + /** * The height with which to extrude the base of this layer. Must be less than or equal to {@link PropertyFactory#fillExtrusionHeight}. @@ -1212,6 +1751,7 @@ public class PropertyFactory { * @param function a wrapper function for Float * @return property wrapper around a Float function */ + @Deprecated public static <T> PropertyValue<Function<T, Float>> fillExtrusionBase(Function<T, Float> function) { return new PaintPropertyValue<>("fill-extrusion-base", function); } @@ -1226,6 +1766,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("raster-opacity", value); } + /** + * The opacity at which the image will be drawn. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> rasterOpacity(Expression expression) { + return new PaintPropertyValue<>("raster-opacity", expression); + } + /** * The opacity at which the image will be drawn. @@ -1234,6 +1784,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Float * @return property wrapper around a Float function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Float>> rasterOpacity(CameraFunction<Z, Float> function) { return new PaintPropertyValue<>("raster-opacity", function); } @@ -1248,6 +1799,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("raster-hue-rotate", value); } + /** + * Rotates hues around the color wheel. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> rasterHueRotate(Expression expression) { + return new PaintPropertyValue<>("raster-hue-rotate", expression); + } + /** * Rotates hues around the color wheel. @@ -1256,6 +1817,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Float * @return property wrapper around a Float function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Float>> rasterHueRotate(CameraFunction<Z, Float> function) { return new PaintPropertyValue<>("raster-hue-rotate", function); } @@ -1270,6 +1832,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("raster-brightness-min", value); } + /** + * Increase or reduce the brightness of the image. The value is the minimum brightness. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> rasterBrightnessMin(Expression expression) { + return new PaintPropertyValue<>("raster-brightness-min", expression); + } + /** * Increase or reduce the brightness of the image. The value is the minimum brightness. @@ -1278,6 +1850,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Float * @return property wrapper around a Float function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Float>> rasterBrightnessMin(CameraFunction<Z, Float> function) { return new PaintPropertyValue<>("raster-brightness-min", function); } @@ -1292,6 +1865,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("raster-brightness-max", value); } + /** + * Increase or reduce the brightness of the image. The value is the maximum brightness. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> rasterBrightnessMax(Expression expression) { + return new PaintPropertyValue<>("raster-brightness-max", expression); + } + /** * Increase or reduce the brightness of the image. The value is the maximum brightness. @@ -1300,6 +1883,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Float * @return property wrapper around a Float function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Float>> rasterBrightnessMax(CameraFunction<Z, Float> function) { return new PaintPropertyValue<>("raster-brightness-max", function); } @@ -1314,6 +1898,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("raster-saturation", value); } + /** + * Increase or reduce the saturation of the image. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> rasterSaturation(Expression expression) { + return new PaintPropertyValue<>("raster-saturation", expression); + } + /** * Increase or reduce the saturation of the image. @@ -1322,6 +1916,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Float * @return property wrapper around a Float function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Float>> rasterSaturation(CameraFunction<Z, Float> function) { return new PaintPropertyValue<>("raster-saturation", function); } @@ -1336,6 +1931,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("raster-contrast", value); } + /** + * Increase or reduce the contrast of the image. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> rasterContrast(Expression expression) { + return new PaintPropertyValue<>("raster-contrast", expression); + } + /** * Increase or reduce the contrast of the image. @@ -1344,6 +1949,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Float * @return property wrapper around a Float function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Float>> rasterContrast(CameraFunction<Z, Float> function) { return new PaintPropertyValue<>("raster-contrast", function); } @@ -1358,6 +1964,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("raster-fade-duration", value); } + /** + * Fade duration when a new tile is added. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> rasterFadeDuration(Expression expression) { + return new PaintPropertyValue<>("raster-fade-duration", expression); + } + /** * Fade duration when a new tile is added. @@ -1366,6 +1982,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Float * @return property wrapper around a Float function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Float>> rasterFadeDuration(CameraFunction<Z, Float> function) { return new PaintPropertyValue<>("raster-fade-duration", function); } @@ -1390,6 +2007,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("background-color", value); } + /** + * The color with which the background will be drawn. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> backgroundColor(Expression expression) { + return new PaintPropertyValue<>("background-color", expression); + } + /** * The color with which the background will be drawn. @@ -1398,6 +2025,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for String * @return property wrapper around a String function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, String>> backgroundColor(CameraFunction<Z, String> function) { return new PaintPropertyValue<>("background-color", function); } @@ -1412,6 +2040,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("background-pattern", value); } + /** + * Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> backgroundPattern(Expression expression) { + return new PaintPropertyValue<>("background-pattern", expression); + } + /** * Name of image in sprite to use for drawing an image background. For seamless patterns, image width and height must be a factor of two (2, 4, 8, ..., 512). @@ -1420,6 +2058,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for String * @return property wrapper around a String function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, String>> backgroundPattern(CameraFunction<Z, String> function) { return new PaintPropertyValue<>("background-pattern", function); } @@ -1434,6 +2073,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("background-opacity", value); } + /** + * The opacity at which the background will be drawn. + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> backgroundOpacity(Expression expression) { + return new PaintPropertyValue<>("background-opacity", expression); + } + /** * The opacity at which the background will be drawn. @@ -1442,6 +2091,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for Float * @return property wrapper around a Float function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, Float>> backgroundOpacity(CameraFunction<Z, Float> function) { return new PaintPropertyValue<>("background-opacity", function); } @@ -1456,6 +2106,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("line-cap", value); } + /** + * The display of line endings. + * + * @param value a String value + * @return property wrapper around String + */ + public static PropertyValue<Expression> lineCap(Expression value) { + return new LayoutPropertyValue<>("line-cap", value); + } /** @@ -1479,6 +2138,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("line-join", value); } + /** + * The display of lines when joining. + * + * @param value a String value + * @return property wrapper around String + */ + public static PropertyValue<Expression> lineJoin(Expression value) { + return new LayoutPropertyValue<>("line-join", value); + } /** @@ -1502,6 +2170,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("line-miter-limit", value); } + /** + * Used to automatically convert miter joins to bevel joins for sharp angles. + * + * @param value a Float value + * @return property wrapper around Float + */ + public static PropertyValue<Expression> lineMiterLimit(Expression value) { + return new LayoutPropertyValue<>("line-miter-limit", value); + } /** @@ -1525,6 +2202,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("line-round-limit", value); } + /** + * Used to automatically convert round joins to miter joins for shallow angles. + * + * @param value a Float value + * @return property wrapper around Float + */ + public static PropertyValue<Expression> lineRoundLimit(Expression value) { + return new LayoutPropertyValue<>("line-round-limit", value); + } /** @@ -1548,6 +2234,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("symbol-placement", value); } + /** + * Label placement relative to its geometry. + * + * @param value a String value + * @return property wrapper around String + */ + public static PropertyValue<Expression> symbolPlacement(Expression value) { + return new LayoutPropertyValue<>("symbol-placement", value); + } /** @@ -1571,6 +2266,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("symbol-spacing", value); } + /** + * Distance between two symbol anchors. + * + * @param value a Float value + * @return property wrapper around Float + */ + public static PropertyValue<Expression> symbolSpacing(Expression value) { + return new LayoutPropertyValue<>("symbol-spacing", value); + } /** @@ -1594,6 +2298,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("symbol-avoid-edges", value); } + /** + * If true, the symbols will not cross tile edges to avoid mutual collisions. Recommended in layers that don't have enough padding in the vector tile to prevent collisions, or if it is a point symbol layer placed after a line symbol layer. + * + * @param value a Boolean value + * @return property wrapper around Boolean + */ + public static PropertyValue<Expression> symbolAvoidEdges(Expression value) { + return new LayoutPropertyValue<>("symbol-avoid-edges", value); + } /** @@ -1617,6 +2330,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("icon-allow-overlap", value); } + /** + * If true, the icon will be visible even if it collides with other previously drawn symbols. + * + * @param value a Boolean value + * @return property wrapper around Boolean + */ + public static PropertyValue<Expression> iconAllowOverlap(Expression value) { + return new LayoutPropertyValue<>("icon-allow-overlap", value); + } /** @@ -1640,6 +2362,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("icon-ignore-placement", value); } + /** + * If true, other symbols can be visible even if they collide with the icon. + * + * @param value a Boolean value + * @return property wrapper around Boolean + */ + public static PropertyValue<Expression> iconIgnorePlacement(Expression value) { + return new LayoutPropertyValue<>("icon-ignore-placement", value); + } /** @@ -1663,6 +2394,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("icon-optional", value); } + /** + * If true, text will display without their corresponding icons when the icon collides with other symbols and the text does not. + * + * @param value a Boolean value + * @return property wrapper around Boolean + */ + public static PropertyValue<Expression> iconOptional(Expression value) { + return new LayoutPropertyValue<>("icon-optional", value); + } /** @@ -1686,6 +2426,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("icon-rotation-alignment", value); } + /** + * In combination with {@link Property.SYMBOL_PLACEMENT}, determines the rotation behavior of icons. + * + * @param value a String value + * @return property wrapper around String + */ + public static PropertyValue<Expression> iconRotationAlignment(Expression value) { + return new LayoutPropertyValue<>("icon-rotation-alignment", value); + } /** @@ -1709,6 +2458,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("icon-size", value); } + /** + * Scales the original size of the icon by the provided factor. The new pixel size of the image will be the original pixel size multiplied by {@link PropertyFactory#iconSize}. 1 is the original size; 3 triples the size of the image. + * + * @param value a Float value + * @return property wrapper around Float + */ + public static PropertyValue<Expression> iconSize(Expression value) { + return new LayoutPropertyValue<>("icon-size", value); + } /** @@ -1732,6 +2490,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("icon-text-fit", value); } + /** + * Scales the icon to fit around the associated text. + * + * @param value a String value + * @return property wrapper around String + */ + public static PropertyValue<Expression> iconTextFit(Expression value) { + return new LayoutPropertyValue<>("icon-text-fit", value); + } /** @@ -1755,6 +2522,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("icon-text-fit-padding", value); } + /** + * Size of the additional area added to dimensions determined by {@link Property.ICON_TEXT_FIT}, in clockwise order: top, right, bottom, left. + * + * @param value a Float[] value + * @return property wrapper around Float[] + */ + public static PropertyValue<Expression> iconTextFitPadding(Expression value) { + return new LayoutPropertyValue<>("icon-text-fit-padding", value); + } /** @@ -1769,7 +2545,7 @@ public class PropertyFactory { } /** - * Name of image in sprite to use for drawing an image background. A string with {tokens} replaced, referencing the data property to pull from. + * Name of image in sprite to use for drawing an image background. Within literal values and zoom functions, property names enclosed in curly brackets (e.g. `{token}`) are replaced with the value of the named property. Expressions and property functions do not support this syntax; for equivalent functionality in expressions, use the [`concat`](#expressions-concat) and [`get`](#expressions-get) operators. * * @param value a String value * @return property wrapper around String @@ -1778,10 +2554,19 @@ public class PropertyFactory { return new LayoutPropertyValue<>("icon-image", value); } + /** + * Name of image in sprite to use for drawing an image background. Within literal values and zoom functions, property names enclosed in curly brackets (e.g. `{token}`) are replaced with the value of the named property. Expressions and property functions do not support this syntax; for equivalent functionality in expressions, use the [`concat`](#expressions-concat) and [`get`](#expressions-get) operators. + * + * @param value a String value + * @return property wrapper around String + */ + public static PropertyValue<Expression> iconImage(Expression value) { + return new LayoutPropertyValue<>("icon-image", value); + } /** - * Name of image in sprite to use for drawing an image background. A string with {tokens} replaced, referencing the data property to pull from. + * Name of image in sprite to use for drawing an image background. Within literal values and zoom functions, property names enclosed in curly brackets (e.g. `{token}`) are replaced with the value of the named property. Expressions and property functions do not support this syntax; for equivalent functionality in expressions, use the [`concat`](#expressions-concat) and [`get`](#expressions-get) operators. * * @param <T> the function input type * @param function a wrapper function for String @@ -1801,6 +2586,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("icon-rotate", value); } + /** + * Rotates the icon clockwise. + * + * @param value a Float value + * @return property wrapper around Float + */ + public static PropertyValue<Expression> iconRotate(Expression value) { + return new LayoutPropertyValue<>("icon-rotate", value); + } /** @@ -1824,6 +2618,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("icon-padding", value); } + /** + * Size of the additional area around the icon bounding box used for detecting symbol collisions. + * + * @param value a Float value + * @return property wrapper around Float + */ + public static PropertyValue<Expression> iconPadding(Expression value) { + return new LayoutPropertyValue<>("icon-padding", value); + } /** @@ -1847,6 +2650,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("icon-keep-upright", value); } + /** + * If true, the icon may be flipped to prevent it from being rendered upside-down. + * + * @param value a Boolean value + * @return property wrapper around Boolean + */ + public static PropertyValue<Expression> iconKeepUpright(Expression value) { + return new LayoutPropertyValue<>("icon-keep-upright", value); + } /** @@ -1861,7 +2673,7 @@ public class PropertyFactory { } /** - * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. When combined with {@link PropertyFactory#iconRotate} the offset will be as if the rotated direction was up. + * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of {@link PropertyFactory#iconSize} to obtain the final offset in density-independent pixels. When combined with {@link PropertyFactory#iconRotate} the offset will be as if the rotated direction was up. * * @param value a Float[] value * @return property wrapper around Float[] @@ -1870,10 +2682,19 @@ public class PropertyFactory { return new LayoutPropertyValue<>("icon-offset", value); } + /** + * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of {@link PropertyFactory#iconSize} to obtain the final offset in density-independent pixels. When combined with {@link PropertyFactory#iconRotate} the offset will be as if the rotated direction was up. + * + * @param value a Float[] value + * @return property wrapper around Float[] + */ + public static PropertyValue<Expression> iconOffset(Expression value) { + return new LayoutPropertyValue<>("icon-offset", value); + } /** - * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. When combined with {@link PropertyFactory#iconRotate} the offset will be as if the rotated direction was up. + * Offset distance of icon from its anchor. Positive values indicate right and down, while negative values indicate left and up. Each component is multiplied by the value of {@link PropertyFactory#iconSize} to obtain the final offset in density-independent pixels. When combined with {@link PropertyFactory#iconRotate} the offset will be as if the rotated direction was up. * * @param <T> the function input type * @param function a wrapper function for Float[] @@ -1893,6 +2714,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("icon-anchor", value); } + /** + * Part of the icon placed closest to the anchor. + * + * @param value a String value + * @return property wrapper around String + */ + public static PropertyValue<Expression> iconAnchor(Expression value) { + return new LayoutPropertyValue<>("icon-anchor", value); + } /** @@ -1916,6 +2746,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("icon-pitch-alignment", value); } + /** + * Orientation of icon when map is pitched. + * + * @param value a String value + * @return property wrapper around String + */ + public static PropertyValue<Expression> iconPitchAlignment(Expression value) { + return new LayoutPropertyValue<>("icon-pitch-alignment", value); + } /** @@ -1939,6 +2778,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-pitch-alignment", value); } + /** + * Orientation of text when map is pitched. + * + * @param value a String value + * @return property wrapper around String + */ + public static PropertyValue<Expression> textPitchAlignment(Expression value) { + return new LayoutPropertyValue<>("text-pitch-alignment", value); + } /** @@ -1962,6 +2810,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-rotation-alignment", value); } + /** + * In combination with {@link Property.SYMBOL_PLACEMENT}, determines the rotation behavior of the individual glyphs forming the text. + * + * @param value a String value + * @return property wrapper around String + */ + public static PropertyValue<Expression> textRotationAlignment(Expression value) { + return new LayoutPropertyValue<>("text-rotation-alignment", value); + } /** @@ -1976,7 +2833,7 @@ public class PropertyFactory { } /** - * Value to use for a text label. Feature properties are specified using tokens like {field_name}. (Token replacement is only supported for literal {@link PropertyFactory#textField} values--not for property functions.) + * Value to use for a text label. Within literal values and zoom functions, property names enclosed in curly brackets (e.g. `{token}`) are replaced with the value of the named property. Expressions and property functions do not support this syntax; for equivalent functionality in expressions, use the [`concat`](#expressions-concat) and [`get`](#expressions-get) operators. * * @param value a String value * @return property wrapper around String @@ -1985,10 +2842,19 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-field", value); } + /** + * Value to use for a text label. Within literal values and zoom functions, property names enclosed in curly brackets (e.g. `{token}`) are replaced with the value of the named property. Expressions and property functions do not support this syntax; for equivalent functionality in expressions, use the [`concat`](#expressions-concat) and [`get`](#expressions-get) operators. + * + * @param value a String value + * @return property wrapper around String + */ + public static PropertyValue<Expression> textField(Expression value) { + return new LayoutPropertyValue<>("text-field", value); + } /** - * Value to use for a text label. Feature properties are specified using tokens like {field_name}. (Token replacement is only supported for literal {@link PropertyFactory#textField} values--not for property functions.) + * Value to use for a text label. Within literal values and zoom functions, property names enclosed in curly brackets (e.g. `{token}`) are replaced with the value of the named property. Expressions and property functions do not support this syntax; for equivalent functionality in expressions, use the [`concat`](#expressions-concat) and [`get`](#expressions-get) operators. * * @param <T> the function input type * @param function a wrapper function for String @@ -2008,16 +2874,25 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-font", value); } + /** + * Font stack to use for displaying text. + * + * @param value a String[] value + * @return property wrapper around String[] + */ + public static PropertyValue<Expression> textFont(Expression value) { + return new LayoutPropertyValue<>("text-font", value); + } /** * Font stack to use for displaying text. * - * @param <Z> the zoom parameter type - * @param function a wrapper {@link CameraFunction} for String[] + * @param <T> the function input type + * @param function a wrapper function for String[] * @return property wrapper around a String[] function */ - public static <Z extends Number> PropertyValue<CameraFunction<Z, String[]>> textFont(CameraFunction<Z, String[]> function) { + public static <T> PropertyValue<Function<T, String[]>> textFont(Function<T, String[]> function) { return new LayoutPropertyValue<>("text-font", function); } @@ -2031,6 +2906,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-size", value); } + /** + * Font size. + * + * @param value a Float value + * @return property wrapper around Float + */ + public static PropertyValue<Expression> textSize(Expression value) { + return new LayoutPropertyValue<>("text-size", value); + } /** @@ -2054,6 +2938,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-max-width", value); } + /** + * The maximum line width for text wrapping. + * + * @param value a Float value + * @return property wrapper around Float + */ + public static PropertyValue<Expression> textMaxWidth(Expression value) { + return new LayoutPropertyValue<>("text-max-width", value); + } /** @@ -2077,6 +2970,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-line-height", value); } + /** + * Text leading value for multi-line text. + * + * @param value a Float value + * @return property wrapper around Float + */ + public static PropertyValue<Expression> textLineHeight(Expression value) { + return new LayoutPropertyValue<>("text-line-height", value); + } /** @@ -2100,6 +3002,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-letter-spacing", value); } + /** + * Text tracking amount. + * + * @param value a Float value + * @return property wrapper around Float + */ + public static PropertyValue<Expression> textLetterSpacing(Expression value) { + return new LayoutPropertyValue<>("text-letter-spacing", value); + } /** @@ -2123,6 +3034,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-justify", value); } + /** + * Text justification options. + * + * @param value a String value + * @return property wrapper around String + */ + public static PropertyValue<Expression> textJustify(Expression value) { + return new LayoutPropertyValue<>("text-justify", value); + } /** @@ -2146,6 +3066,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-anchor", value); } + /** + * Part of the text placed closest to the anchor. + * + * @param value a String value + * @return property wrapper around String + */ + public static PropertyValue<Expression> textAnchor(Expression value) { + return new LayoutPropertyValue<>("text-anchor", value); + } /** @@ -2169,6 +3098,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-max-angle", value); } + /** + * Maximum angle change between adjacent characters. + * + * @param value a Float value + * @return property wrapper around Float + */ + public static PropertyValue<Expression> textMaxAngle(Expression value) { + return new LayoutPropertyValue<>("text-max-angle", value); + } /** @@ -2192,6 +3130,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-rotate", value); } + /** + * Rotates the text clockwise. + * + * @param value a Float value + * @return property wrapper around Float + */ + public static PropertyValue<Expression> textRotate(Expression value) { + return new LayoutPropertyValue<>("text-rotate", value); + } /** @@ -2215,6 +3162,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-padding", value); } + /** + * Size of the additional area around the text bounding box used for detecting symbol collisions. + * + * @param value a Float value + * @return property wrapper around Float + */ + public static PropertyValue<Expression> textPadding(Expression value) { + return new LayoutPropertyValue<>("text-padding", value); + } /** @@ -2238,6 +3194,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-keep-upright", value); } + /** + * If true, the text may be flipped vertically to prevent it from being rendered upside-down. + * + * @param value a Boolean value + * @return property wrapper around Boolean + */ + public static PropertyValue<Expression> textKeepUpright(Expression value) { + return new LayoutPropertyValue<>("text-keep-upright", value); + } /** @@ -2261,6 +3226,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-transform", value); } + /** + * Specifies how to capitalize text, similar to the CSS {@link PropertyFactory#textTransform} property. + * + * @param value a String value + * @return property wrapper around String + */ + public static PropertyValue<Expression> textTransform(Expression value) { + return new LayoutPropertyValue<>("text-transform", value); + } /** @@ -2284,6 +3258,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-offset", value); } + /** + * Offset distance of text from its anchor. Positive values indicate right and down, while negative values indicate left and up. + * + * @param value a Float[] value + * @return property wrapper around Float[] + */ + public static PropertyValue<Expression> textOffset(Expression value) { + return new LayoutPropertyValue<>("text-offset", value); + } /** @@ -2307,6 +3290,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-allow-overlap", value); } + /** + * If true, the text will be visible even if it collides with other previously drawn symbols. + * + * @param value a Boolean value + * @return property wrapper around Boolean + */ + public static PropertyValue<Expression> textAllowOverlap(Expression value) { + return new LayoutPropertyValue<>("text-allow-overlap", value); + } /** @@ -2330,6 +3322,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-ignore-placement", value); } + /** + * If true, other symbols can be visible even if they collide with the text. + * + * @param value a Boolean value + * @return property wrapper around Boolean + */ + public static PropertyValue<Expression> textIgnorePlacement(Expression value) { + return new LayoutPropertyValue<>("text-ignore-placement", value); + } /** @@ -2353,6 +3354,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("text-optional", value); } + /** + * If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. + * + * @param value a Boolean value + * @return property wrapper around Boolean + */ + public static PropertyValue<Expression> textOptional(Expression value) { + return new LayoutPropertyValue<>("text-optional", value); + } /** * If true, icons will display without their corresponding text when the text collides with other symbols and the icon does not. diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/RasterLayer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/RasterLayer.java index e67e71b61d..a0f45535f6 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/RasterLayer.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/RasterLayer.java @@ -250,24 +250,6 @@ public class RasterLayer extends Layer { return (PropertyValue<Float>) new PropertyValue("raster-fade-duration", nativeGetRasterFadeDuration()); } - /** - * Get the RasterFadeDuration property transition options - * - * @return transition options for Float - */ - public TransitionOptions getRasterFadeDurationTransition() { - return nativeGetRasterFadeDurationTransition(); - } - - /** - * Set the RasterFadeDuration property transition options - * - * @param options transition options for Float - */ - public void setRasterFadeDurationTransition(TransitionOptions options) { - nativeSetRasterFadeDurationTransition(options.getDuration(), options.getDelay()); - } - private native Object nativeGetRasterOpacity(); private native TransitionOptions nativeGetRasterOpacityTransition(); @@ -306,10 +288,6 @@ public class RasterLayer extends Layer { private native Object nativeGetRasterFadeDuration(); - private native TransitionOptions nativeGetRasterFadeDurationTransition(); - - private native void nativeSetRasterFadeDurationTransition(long duration, long delay); - @Override protected native void finalize() throws Throwable; diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/property_factory.java.ejs b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/property_factory.java.ejs index 2d3421d1d9..283d4e4189 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/property_factory.java.ejs +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/property_factory.java.ejs @@ -6,11 +6,13 @@ package com.mapbox.mapboxsdk.style.layers; -import android.annotation.SuppressLint; import android.support.annotation.ColorInt; -import com.mapbox.mapboxsdk.style.functions.Function; import com.mapbox.mapboxsdk.style.functions.CameraFunction; +import com.mapbox.mapboxsdk.style.expressions.Expression; +import com.mapbox.mapboxsdk.style.functions.Function; + +import java.util.Locale; /** * Constructs paint/layout properties for Layers @@ -36,6 +38,7 @@ public class PropertyFactory { * @param function the visibility function * @return property wrapper around a String function */ + @Deprecated public static <T> PropertyValue<Function<T, String>> visibility(Function<T, String> function) { return new LayoutPropertyValue<>("visibility", function); } @@ -63,6 +66,16 @@ public class PropertyFactory { return new PaintPropertyValue<>("<%- property.name %>", value); } + /** + * <%- propertyFactoryMethodDoc(property) %> + * + * @param expression an expression statement + * @return property wrapper around an expression statement + */ + public static PropertyValue<Expression> <%- camelizeWithLeadingLowercase(property.name) %>(Expression expression) { + return new PaintPropertyValue<>("<%- property.name %>", expression); + } + <% if (supportsPropertyFunction(property)) { -%> /** @@ -72,6 +85,7 @@ public class PropertyFactory { * @param function a wrapper function for <%- propertyType(property) %> * @return property wrapper around a <%- propertyType(property) %> function */ + @Deprecated public static <T> PropertyValue<Function<T, <%- propertyType(property) %>>> <%- camelizeWithLeadingLowercase(property.name) %>(Function<T, <%- propertyType(property) %>> function) { return new PaintPropertyValue<>("<%- property.name %>", function); } @@ -85,6 +99,7 @@ public class PropertyFactory { * @param function a wrapper {@link CameraFunction} for <%- propertyType(property) %> * @return property wrapper around a <%- propertyType(property) %> function */ + @Deprecated public static <Z extends Number> PropertyValue<CameraFunction<Z, <%- propertyType(property) %>>> <%- camelizeWithLeadingLowercase(property.name) %>(CameraFunction<Z, <%- propertyType(property) %>> function) { return new PaintPropertyValue<>("<%- property.name %>", function); } @@ -102,6 +117,15 @@ public class PropertyFactory { return new LayoutPropertyValue<>("<%- property.name %>", value); } + /** + * <%- propertyFactoryMethodDoc(property) %> + * + * @param value a <%- propertyType(property) %> value + * @return property wrapper around <%- propertyType(property) %> + */ + public static PropertyValue<Expression> <%- camelizeWithLeadingLowercase(property.name) %>(Expression value) { + return new LayoutPropertyValue<>("<%- property.name %>", value); + } <% if (supportsPropertyFunction(property)) { -%> @@ -131,9 +155,9 @@ public class PropertyFactory { <% } -%> <% } -%> - @SuppressLint("DefaultLocale") public static String colorToRgbaString(@ColorInt int value) { - return String.format("rgba(%d, %d, %d, %d)", (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF, (value >> 24) & 0xFF); + return String.format(Locale.US,"rgba(%d, %d, %d, %d)", + (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF, (value >> 24) & 0xFF); } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/CustomGeometrySource.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/CustomGeometrySource.java new file mode 100644 index 0000000000..62f1719ddf --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/CustomGeometrySource.java @@ -0,0 +1,203 @@ +package com.mapbox.mapboxsdk.style.sources; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.UiThread; +import android.support.annotation.WorkerThread; + +import com.mapbox.mapboxsdk.geometry.LatLngBounds; +import com.mapbox.mapboxsdk.style.layers.Filter; +import com.mapbox.services.commons.geojson.Feature; +import com.mapbox.services.commons.geojson.FeatureCollection; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Custom Vector Source, allows using FeatureCollections. + * + */ +@UiThread +public class CustomGeometrySource extends Source { + private ExecutorService executor; + private GeometryTileProvider provider; + private final Map<TileID, AtomicBoolean> cancelledTileRequests = new ConcurrentHashMap<>(); + + /** + * Create a CustomGeometrySource + * + * @param id The source id. + * @param provider The tile provider that returns geometry data for this source. + */ + public CustomGeometrySource(String id, GeometryTileProvider provider) { + this(id, provider, new GeoJsonOptions()); + } + + /** + * Create a CustomGeometrySource with non-default GeoJsonOptions. + * <p>Supported options are minZoom, maxZoom, buffer, and tolerance.</p> + * + * @param id The source id. + * @param provider The tile provider that returns geometry data for this source. + * @param options GeoJsonOptions. + */ + public CustomGeometrySource(String id, GeometryTileProvider provider, GeoJsonOptions options) { + this.provider = provider; + executor = Executors.newFixedThreadPool(4); + initialize(id, options); + } + + /** + * Invalidate previously provided features within a given bounds at all zoom levels. + * Invoking this method will result in new requests to `GeometryTileProvider` for regions + * that contain, include, or intersect with the provided bounds. + * + * @param bounds The region in which features should be invalidated at all zoom levels + */ + public void invalidateRegion(LatLngBounds bounds) { + nativeInvalidateBounds(bounds); + } + + /** + * Invalidate the geometry contents of a specific tile. Invoking this method will result + * in new requests to `GeometryTileProvider` for visible tiles. + * + * @param zoomLevel Tile zoom level. + * @param x Tile X coordinate. + * @param y Tile Y coordinate. + */ + public void invalidateTile(int zoomLevel, int x, int y) { + nativeInvalidateTile(zoomLevel, x, y); + } + + /** + * Set or update geometry contents of a specific tile. Use this method to update tiles + * for which `GeometryTileProvider` was previously invoked. This method can be called from + * background threads. + * + * @param zoomLevel Tile zoom level. + * @param x Tile X coordinate. + * @param y Tile Y coordinate. + * @param data Feature collection for the tile. + */ + public void setTileData(int zoomLevel, int x, int y, FeatureCollection data) { + nativeSetTileData(zoomLevel, x, y, data); + } + + /** + * Queries the source for features. + * + * @param filter an optional filter statement to filter the returned Features + * @return the features + */ + @NonNull + public List<Feature> querySourceFeatures(@Nullable Filter.Statement filter) { + Feature[] features = querySourceFeatures(filter != null ? filter.toArray() : null); + return features != null ? Arrays.asList(features) : new ArrayList<Feature>(); + } + + protected native void initialize(String sourceId, Object options); + + private native Feature[] querySourceFeatures(Object[] filter); + + private native void nativeSetTileData(int z, int x, int y, FeatureCollection data); + + private native void nativeInvalidateTile(int z, int x, int y); + + private native void nativeInvalidateBounds(LatLngBounds bounds); + + @Override + protected native void finalize() throws Throwable; + + private void setTileData(TileID tileId, FeatureCollection data) { + cancelledTileRequests.remove(tileId); + nativeSetTileData(tileId.z, tileId.x, tileId.y, data); + } + + @WorkerThread + private void fetchTile(int z, int x, int y) { + AtomicBoolean cancelFlag = new AtomicBoolean(false); + TileID tileID = new TileID(z, x, y); + cancelledTileRequests.put(tileID, cancelFlag); + GeometryTileRequest request = new GeometryTileRequest(tileID, provider, this, cancelFlag); + executor.execute(request); + } + + @WorkerThread + private void cancelTile(int z, int x, int y) { + AtomicBoolean cancelFlag = cancelledTileRequests.get(new TileID(z, x, y)); + if (cancelFlag != null) { + cancelFlag.compareAndSet(false, true); + } + } + + private static class TileID { + public int z; + public int x; + public int y; + + public TileID(int _z, int _x, int _y) { + z = _z; + x = _x; + y = _y; + } + + public int hashCode() { + return Arrays.hashCode(new int[]{z, x, y}); + } + + public boolean equals(Object object) { + if (object == this) { + return true; + } + + if (object == null || getClass() != object.getClass()) { + return false; + } + + if (object instanceof TileID) { + TileID other = (TileID)object; + return this.z == other.z && this.x == other.x && this.y == other.y; + } + return false; + } + } + + private static class GeometryTileRequest implements Runnable { + private TileID id; + private GeometryTileProvider provider; + private WeakReference<CustomGeometrySource> sourceRef; + private AtomicBoolean cancelled; + + public GeometryTileRequest(TileID _id, GeometryTileProvider p, + CustomGeometrySource _source, AtomicBoolean _cancelled) { + id = _id; + provider = p; + sourceRef = new WeakReference<>(_source); + cancelled = _cancelled; + } + + public void run() { + if (isCancelled()) { + return; + } + + FeatureCollection data = provider.getFeaturesForBounds(LatLngBounds.from(id.z, id.x, id.y), id.z); + CustomGeometrySource source = sourceRef.get(); + if (!isCancelled() && source != null && data != null) { + source.setTileData(id, data); + } + } + + private Boolean isCancelled() { + return cancelled.get(); + } + } +} diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/GeoJsonOptions.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/GeoJsonOptions.java index 1a1711e547..81f7255b86 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/GeoJsonOptions.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/GeoJsonOptions.java @@ -16,6 +16,17 @@ public class GeoJsonOptions extends HashMap<String, Object> { * @param maxZoom the maximum zoom - Defaults to 18. * @return the current instance for chaining */ + public GeoJsonOptions withMinZoom(int minZoom) { + this.put("minzoom", minZoom); + return this; + } + + /** + * Maximum zoom level at which to create vector tiles (higher means greater detail at high zoom levels). + * + * @param maxZoom the maximum zoom - Defaults to 18. + * @return the current instance for chaining + */ public GeoJsonOptions withMaxZoom(int maxZoom) { this.put("maxzoom", maxZoom); return this; diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/GeometryTileProvider.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/GeometryTileProvider.java new file mode 100644 index 0000000000..3f1eb315d3 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/GeometryTileProvider.java @@ -0,0 +1,22 @@ +package com.mapbox.mapboxsdk.style.sources; + +import android.support.annotation.WorkerThread; + +import com.mapbox.mapboxsdk.geometry.LatLngBounds; +import com.mapbox.services.commons.geojson.FeatureCollection; + +/** + * Interface that defines methods for working with {@link CustomGeometrySource}. + */ +public interface GeometryTileProvider { + + /*** + * Interface method called by {@link CustomGeometrySource} to request features for a tile. + * + * @param bounds {@link LatLngBounds} of the tile. + * @param zoomLevel Tile zoom level. + * @return Return a @{link FeatureCollection} to be displayed in the requested tile. + */ + @WorkerThread + FeatureCollection getFeaturesForBounds(LatLngBounds bounds, int zoomLevel); +} |