diff --git a/android/src/main/java/com/mapbox/mapboxgl/Convert.java b/android/src/main/java/com/mapbox/mapboxgl/Convert.java index ca22c4b54..fbb43ba0e 100644 --- a/android/src/main/java/com/mapbox/mapboxgl/Convert.java +++ b/android/src/main/java/com/mapbox/mapboxgl/Convert.java @@ -4,7 +4,10 @@ package com.mapbox.mapboxgl; +import android.content.Context; import android.graphics.Point; +import android.util.DisplayMetrics; + import com.mapbox.geojson.Polygon; import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.camera.CameraUpdate; @@ -235,7 +238,8 @@ private static String toString(Object o) { return (String) o; } - static void interpretMapboxMapOptions(Object o, MapboxMapOptionsSink sink) { + static void interpretMapboxMapOptions(Object o, MapboxMapOptionsSink sink, Context context) { + final DisplayMetrics metrics = context.getResources().getDisplayMetrics(); final Map data = toMap(o); final Object cameraTargetBounds = data.get("cameraTargetBounds"); if (cameraTargetBounds != null) { @@ -292,7 +296,8 @@ static void interpretMapboxMapOptions(Object o, MapboxMapOptionsSink sink) { final Object logoViewMargins = data.get("logoViewMargins"); if(logoViewMargins != null){ final List logoViewMarginsData = toList(logoViewMargins); - sink.setLogoViewMargins(toInt(logoViewMarginsData.get(0)), toInt(logoViewMarginsData.get(1))); + final Point point = toPoint(logoViewMarginsData, metrics.density); + sink.setLogoViewMargins(point.x, point.y); } final Object compassGravity = data.get("compassViewPosition"); if(compassGravity != null){ @@ -301,12 +306,18 @@ static void interpretMapboxMapOptions(Object o, MapboxMapOptionsSink sink) { final Object compassViewMargins = data.get("compassViewMargins"); if(compassViewMargins != null){ final List compassViewMarginsData = toList(compassViewMargins); - sink.setCompassViewMargins(toInt(compassViewMarginsData.get(0)), toInt(compassViewMarginsData.get(1))); + final Point point = toPoint(compassViewMarginsData, metrics.density); + sink.setCompassViewMargins(point.x, point.y); + } + final Object attributionButtonGravity = data.get("attributionButtonPosition"); + if(attributionButtonGravity != null){ + sink.setAttributionButtonGravity(toInt(attributionButtonGravity)); } final Object attributionButtonMargins = data.get("attributionButtonMargins"); if(attributionButtonMargins != null){ final List attributionButtonMarginsData = toList(attributionButtonMargins); - sink.setAttributionButtonMargins(toInt(attributionButtonMarginsData.get(0)), toInt(attributionButtonMarginsData.get(1))); + final Point point = toPoint(attributionButtonMarginsData, metrics.density); + sink.setAttributionButtonMargins(point.x, point.y); } } diff --git a/android/src/main/java/com/mapbox/mapboxgl/MapboxMapBuilder.java b/android/src/main/java/com/mapbox/mapboxgl/MapboxMapBuilder.java index 045bb76f5..93c4a32eb 100644 --- a/android/src/main/java/com/mapbox/mapboxgl/MapboxMapBuilder.java +++ b/android/src/main/java/com/mapbox/mapboxgl/MapboxMapBuilder.java @@ -118,7 +118,7 @@ public void setMyLocationTrackingMode(int myLocationTrackingMode) { public void setMyLocationRenderMode(int myLocationRenderMode) { this.myLocationRenderMode = myLocationRenderMode; } - + public void setLogoViewMargins(int x, int y) { options.logoMargins(new int[] { (int) x, //left @@ -134,7 +134,6 @@ public void setCompassGravity(int gravity) { case 0: options.compassGravity(Gravity.TOP | Gravity.START); break; - default: case 1: options.compassGravity(Gravity.TOP | Gravity.END); break; @@ -154,6 +153,8 @@ public void setCompassViewMargins(int x, int y) { case Gravity.TOP | Gravity.START: options.compassMargins(new int[] {(int) x, (int) y, 0, 0}); break; + // If the application code has not specified gravity, assume the platform + // default for the compass which is top-right default: case Gravity.TOP | Gravity.END: options.compassMargins(new int[] {0, (int) y, (int) x, 0}); @@ -167,14 +168,44 @@ public void setCompassViewMargins(int x, int y) { } } + @Override + public void setAttributionButtonGravity(int gravity) { + switch(gravity){ + case 0: + options.attributionGravity(Gravity.TOP | Gravity.START); + break; + case 1: + options.attributionGravity(Gravity.TOP | Gravity.END); + break; + case 2: + options.attributionGravity(Gravity.BOTTOM | Gravity.START); + break; + case 3: + options.attributionGravity(Gravity.BOTTOM | Gravity.END); + break; + } + } + @Override public void setAttributionButtonMargins(int x, int y) { - options.attributionMargins(new int[] { - (int) x, //left - (int) 0, //top - (int) 0, //right - (int) y, //bottom - }); + switch(options.getAttributionGravity()) + { + case Gravity.TOP | Gravity.START: + options.attributionMargins(new int[] {(int) x, (int) y, 0, 0}); + break; + case Gravity.TOP | Gravity.END: + options.attributionMargins(new int[] {0, (int) y, (int) x, 0}); + break; + // If the application code has not specified gravity, assume the platform + // default for the attribution button which is bottom left + default: + case Gravity.BOTTOM | Gravity.START: + options.attributionMargins(new int[] {(int) x, 0, 0, (int) y}); + break; + case Gravity.BOTTOM | Gravity.END: + options.attributionMargins(new int[] {0, 0, (int) x, (int) y}); + break; + } } public void setAnnotationOrder(List annotations) { diff --git a/android/src/main/java/com/mapbox/mapboxgl/MapboxMapController.java b/android/src/main/java/com/mapbox/mapboxgl/MapboxMapController.java index 9a97c48ff..4aa5ee752 100644 --- a/android/src/main/java/com/mapbox/mapboxgl/MapboxMapController.java +++ b/android/src/main/java/com/mapbox/mapboxgl/MapboxMapController.java @@ -318,7 +318,7 @@ public void onStyleLoaded(@NonNull Style style) { throw new IllegalArgumentException("Unknown annotation type: " + annotationType + ", must be either 'fill', 'line', 'circle' or 'symbol'"); } } - + if (myLocationEnabled) { enableLocationComponent(style); } @@ -418,7 +418,7 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) { mapReadyResult = result; break; case "map#update": { - Convert.interpretMapboxMapOptions(call.argument("options"), this); + Convert.interpretMapboxMapOptions(call.argument("options"), this, context); result.success(Convert.toJson(getCameraPosition())); break; } @@ -703,7 +703,7 @@ public void onError(@NonNull String message) { result.success(null); break; } - case "line#addAll": { + case "line#addAll": { List newIds = new ArrayList(); final List options = call.argument("options"); List optionList = new ArrayList(); @@ -775,7 +775,7 @@ public void onError(@NonNull String message) { result.success(circleId); break; } - case "circle#addAll": { + case "circle#addAll": { List newIds = new ArrayList(); final List options = call.argument("options"); List optionList = new ArrayList(); @@ -851,7 +851,7 @@ public void onError(@NonNull String message) { break; } - case "fill#addAll": { + case "fill#addAll": { List newIds = new ArrayList(); final List options = call.argument("options"); List optionList = new ArrayList(); @@ -1321,9 +1321,43 @@ public void setCompassViewMargins(int x, int y) { } } + @Override + public void setAttributionButtonGravity(int gravity) { + switch(gravity) { + case 0: + mapboxMap.getUiSettings().setAttributionGravity(Gravity.TOP | Gravity.START); + break; + default: + case 1: + mapboxMap.getUiSettings().setAttributionGravity(Gravity.TOP | Gravity.END); + break; + case 2: + mapboxMap.getUiSettings().setAttributionGravity(Gravity.BOTTOM | Gravity.START); + break; + case 3: + mapboxMap.getUiSettings().setAttributionGravity(Gravity.BOTTOM | Gravity.END); + break; + } + } + @Override public void setAttributionButtonMargins(int x, int y) { - mapboxMap.getUiSettings().setAttributionMargins(x, 0, 0, y); + switch(mapboxMap.getUiSettings().getAttributionGravity()) + { + case Gravity.TOP | Gravity.START: + mapboxMap.getUiSettings().setAttributionMargins(x, y, 0, 0); + break; + default: + case Gravity.TOP | Gravity.END: + mapboxMap.getUiSettings().setAttributionMargins(0, y, x, 0); + break; + case Gravity.BOTTOM | Gravity.START: + mapboxMap.getUiSettings().setAttributionMargins(x, 0, 0, y); + break; + case Gravity.BOTTOM | Gravity.END: + mapboxMap.getUiSettings().setAttributionMargins(0, 0, x, y); + break; + } } private void updateMyLocationEnabled() { diff --git a/android/src/main/java/com/mapbox/mapboxgl/MapboxMapFactory.java b/android/src/main/java/com/mapbox/mapboxgl/MapboxMapFactory.java index 5a1b6c605..1b2c4c9c8 100644 --- a/android/src/main/java/com/mapbox/mapboxgl/MapboxMapFactory.java +++ b/android/src/main/java/com/mapbox/mapboxgl/MapboxMapFactory.java @@ -30,7 +30,7 @@ public PlatformView create(Context context, int id, Object args) { Map params = (Map) args; final MapboxMapBuilder builder = new MapboxMapBuilder(); - Convert.interpretMapboxMapOptions(params.get("options"), builder); + Convert.interpretMapboxMapOptions(params.get("options"), builder, context); if (params.containsKey("initialCameraPosition")) { CameraPosition position = Convert.toCameraPosition(params.get("initialCameraPosition")); builder.setInitialCameraPosition(position); diff --git a/android/src/main/java/com/mapbox/mapboxgl/MapboxMapOptionsSink.java b/android/src/main/java/com/mapbox/mapboxgl/MapboxMapOptionsSink.java index 7072b4b70..35e811cf4 100644 --- a/android/src/main/java/com/mapbox/mapboxgl/MapboxMapOptionsSink.java +++ b/android/src/main/java/com/mapbox/mapboxgl/MapboxMapOptionsSink.java @@ -41,5 +41,7 @@ interface MapboxMapOptionsSink { void setCompassViewMargins(int x, int y); + void setAttributionButtonGravity(int gravity); + void setAttributionButtonMargins(int x, int y); } diff --git a/ios/Classes/Convert.swift b/ios/Classes/Convert.swift index bcaed1638..eb6698e51 100644 --- a/ios/Classes/Convert.swift +++ b/ios/Classes/Convert.swift @@ -52,8 +52,11 @@ class Convert { if let attributionButtonMargins = options["attributionButtonMargins"] as? [Double] { delegate.setAttributionButtonMargins(x: attributionButtonMargins[0], y: attributionButtonMargins[1]) } + if let attributionButtonPosition = options["attributionButtonPosition"] as? UInt, let position = MGLOrnamentPosition(rawValue: attributionButtonPosition) { + delegate.setAttributionButtonPosition(position: position) + } } - + class func parseCameraUpdate(cameraUpdate: [Any], mapView: MGLMapView) -> MGLMapCamera? { guard let type = cameraUpdate[0] as? String else { return nil } switch (type) { diff --git a/ios/Classes/MapboxMapController.swift b/ios/Classes/MapboxMapController.swift index a087ccb55..4a778e11c 100644 --- a/ios/Classes/MapboxMapController.swift +++ b/ios/Classes/MapboxMapController.swift @@ -1070,4 +1070,7 @@ class MapboxMapController: NSObject, FlutterPlatformView, MGLMapViewDelegate, Ma func setAttributionButtonMargins(x: Double, y: Double) { mapView.attributionButtonMargins = CGPoint(x: x, y: y) } + func setAttributionButtonPosition(position: MGLOrnamentPosition) { + mapView.attributionButtonPosition = position + } } diff --git a/ios/Classes/MapboxMapOptionsSink.swift b/ios/Classes/MapboxMapOptionsSink.swift index 2cd2cf746..c032baa15 100644 --- a/ios/Classes/MapboxMapOptionsSink.swift +++ b/ios/Classes/MapboxMapOptionsSink.swift @@ -18,4 +18,5 @@ protocol MapboxMapOptionsSink { func setCompassViewPosition(position: MGLOrnamentPosition) func setCompassViewMargins(x: Double, y: Double) func setAttributionButtonMargins(x: Double, y: Double) + func setAttributionButtonPosition(position: MGLOrnamentPosition) } diff --git a/lib/mapbox_gl.dart b/lib/mapbox_gl.dart index 121d6817b..1777f4866 100644 --- a/lib/mapbox_gl.dart +++ b/lib/mapbox_gl.dart @@ -33,6 +33,7 @@ export 'package:mapbox_gl_platform_interface/mapbox_gl_platform_interface.dart' MyLocationTrackingMode, MyLocationRenderMode, CompassViewPosition, + AttributionButtonPosition, Circle, CircleOptions, Line, diff --git a/lib/src/mapbox_map.dart b/lib/src/mapbox_map.dart index f0acf2c90..ef330303e 100644 --- a/lib/src/mapbox_map.dart +++ b/lib/src/mapbox_map.dart @@ -31,6 +31,7 @@ class MapboxMap extends StatefulWidget { this.logoViewMargins, this.compassViewPosition, this.compassViewMargins, + this.attributionButtonPosition, this.attributionButtonMargins, this.onMapClick, this.onUserLocationUpdated, @@ -156,7 +157,13 @@ class MapboxMap extends StatefulWidget { /// Set the layout margins for the Mapbox Compass final Point? compassViewMargins; - /// Set the layout margins for the Mapbox Attribution Buttons + /// Set the position for the Mapbox Attribution Button + final AttributionButtonPosition? attributionButtonPosition; + + /// Set the layout margins for the Mapbox Attribution Buttons. If you set this + /// value, you may also want to set [attributionButtonPosition] to harmonize + /// the layout between iOS and Android, since the underlying frameworks have + /// different defaults. final Point? attributionButtonMargins; /// Which gestures should be consumed by the map. @@ -299,6 +306,7 @@ class _MapboxMapOptions { this.logoViewMargins, this.compassViewPosition, this.compassViewMargins, + this.attributionButtonPosition, this.attributionButtonMargins, }); @@ -319,6 +327,7 @@ class _MapboxMapOptions { logoViewMargins: map.logoViewMargins, compassViewPosition: map.compassViewPosition, compassViewMargins: map.compassViewMargins, + attributionButtonPosition: map.attributionButtonPosition, attributionButtonMargins: map.attributionButtonMargins, ); } @@ -353,6 +362,8 @@ class _MapboxMapOptions { final Point? compassViewMargins; + final AttributionButtonPosition? attributionButtonPosition; + final Point? attributionButtonMargins; Map toMap() { @@ -387,6 +398,7 @@ class _MapboxMapOptions { addIfNonNull('logoViewMargins', pointToArray(logoViewMargins)); addIfNonNull('compassViewPosition', compassViewPosition?.index); addIfNonNull('compassViewMargins', pointToArray(compassViewMargins)); + addIfNonNull('attributionButtonPosition', attributionButtonPosition?.index); addIfNonNull( 'attributionButtonMargins', pointToArray(attributionButtonMargins)); return optionsMap; diff --git a/mapbox_gl_platform_interface/lib/src/ui.dart b/mapbox_gl_platform_interface/lib/src/ui.dart index e9476b2cb..c399a5d03 100644 --- a/mapbox_gl_platform_interface/lib/src/ui.dart +++ b/mapbox_gl_platform_interface/lib/src/ui.dart @@ -67,6 +67,14 @@ enum CompassViewPosition { BottomRight, } +/// Attribution Button Position +enum AttributionButtonPosition { + TopLeft, + TopRight, + BottomLeft, + BottomRight, +} + /// Bounds for the map camera target. // Used with [MapboxMapOptions] to wrap a [LatLngBounds] value. This allows // distinguishing between specifying an unbounded target (null `LatLngBounds`) diff --git a/mapbox_gl_web/lib/src/convert.dart b/mapbox_gl_web/lib/src/convert.dart index 3b533c8ce..c340e90f5 100644 --- a/mapbox_gl_web/lib/src/convert.dart +++ b/mapbox_gl_web/lib/src/convert.dart @@ -56,12 +56,17 @@ class Convert { options['logoViewMargins'][0], options['logoViewMargins'][1]); } if (options.containsKey('compassViewPosition')) { - sink.setCompassGravity(options['compassViewPosition']); + final position = CompassViewPosition.values[options['compassViewPosition']]; + sink.setCompassAlignment(position); } if (options.containsKey('compassViewMargins')) { sink.setCompassViewMargins( options['compassViewMargins'][0], options['compassViewMargins'][1]); } + if (options.containsKey('attributionButtonPosition')) { + final position = AttributionButtonPosition.values[options['attributionButtonPosition']]; + sink.setAttributionButtonAlignment(position); + } if (options.containsKey('attributionButtonMargins')) { sink.setAttributionButtonMargins(options['attributionButtonMargins'][0], options['attributionButtonMargins'][1]); diff --git a/mapbox_gl_web/lib/src/mapbox_map_controller.dart b/mapbox_gl_web/lib/src/mapbox_map_controller.dart index 308df853a..a09d38f9a 100644 --- a/mapbox_gl_web/lib/src/mapbox_map_controller.dart +++ b/mapbox_gl_web/lib/src/mapbox_map_controller.dart @@ -625,8 +625,13 @@ class MapboxMapController extends MapboxGlPlatform } @override - void setCompassGravity(int gravity) { - _updateNavigationControl(position: CompassViewPosition.values[gravity]); + void setCompassAlignment(CompassViewPosition position) { + _updateNavigationControl(position: position); + } + + @override + void setAttributionButtonAlignment(AttributionButtonPosition position) { + print('setAttributionButtonAlignment not available in web'); } @override diff --git a/mapbox_gl_web/lib/src/options_sink.dart b/mapbox_gl_web/lib/src/options_sink.dart index 9c326975d..6ab61d901 100644 --- a/mapbox_gl_web/lib/src/options_sink.dart +++ b/mapbox_gl_web/lib/src/options_sink.dart @@ -29,9 +29,11 @@ abstract class MapboxMapOptionsSink { void setLogoViewMargins(int x, int y); - void setCompassGravity(int gravity); + void setCompassAlignment(CompassViewPosition position); void setCompassViewMargins(int x, int y); + void setAttributionButtonAlignment(AttributionButtonPosition position); + void setAttributionButtonMargins(int x, int y); }