Skip to content

Commit

Permalink
feat: Add myLocationStyle
Browse files Browse the repository at this point in the history
  • Loading branch information
robert-go committed Apr 1, 2022
1 parent 04d7d14 commit 1500fc1
Show file tree
Hide file tree
Showing 17 changed files with 151 additions and 4 deletions.
5 changes: 5 additions & 0 deletions android/src/main/java/com/mapbox/mapboxgl/Convert.java
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,11 @@ static void interpretMapboxMapOptions(Object o, MapboxMapOptionsSink sink, Conte
if (myLocationRenderMode != null) {
sink.setMyLocationRenderMode(toInt(myLocationRenderMode));
}
final Object myLocationStyle = data.get("myLocationStyle");
if (myLocationStyle != null) {
final Map myLocationStyleData = toMap(myLocationStyle);
sink.setMyLocationStyle(myLocationStyleData);
}
final Object logoViewMargins = data.get("logoViewMargins");
if (logoViewMargins != null) {
final List logoViewMarginsData = toList(logoViewMargins);
Expand Down
10 changes: 9 additions & 1 deletion android/src/main/java/com/mapbox/mapboxgl/MapboxMapBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import com.mapbox.mapboxsdk.maps.MapboxMapOptions;
import com.mapbox.mapboxsdk.maps.Style;
import io.flutter.plugin.common.BinaryMessenger;
import java.util.Collections;
import java.util.Map;

class MapboxMapBuilder implements MapboxMapOptionsSink {
public final String TAG = getClass().getSimpleName();
Expand All @@ -21,6 +23,7 @@ class MapboxMapBuilder implements MapboxMapOptionsSink {
private int myLocationTrackingMode = 0;
private int myLocationRenderMode = 0;
private String styleString = Style.MAPBOX_STREETS;
private Map myLocationStyle = Collections.emptyMap();
private LatLngBounds bounds = null;

MapboxMapController build(
Expand All @@ -44,7 +47,7 @@ MapboxMapController build(
controller.setMyLocationTrackingMode(myLocationTrackingMode);
controller.setMyLocationRenderMode(myLocationRenderMode);
controller.setTrackCameraPosition(trackCameraPosition);

controller.setMyLocationStyle(myLocationStyle);
if (null != bounds) {
controller.setCameraTargetBounds(bounds);
}
Expand Down Expand Up @@ -122,6 +125,11 @@ public void setMyLocationRenderMode(int myLocationRenderMode) {
this.myLocationRenderMode = myLocationRenderMode;
}

@Override
public void setMyLocationStyle(Map myLocationStyle) {
this.myLocationStyle = myLocationStyle;
}

public void setLogoViewMargins(int x, int y) {
options.logoMargins(
new int[] {
Expand Down
17 changes: 17 additions & 0 deletions android/src/main/java/com/mapbox/mapboxgl/MapboxMapController.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import android.content.res.AssetFileDescriptor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.PointF;
import android.graphics.RectF;
import android.location.Location;
Expand Down Expand Up @@ -127,6 +128,7 @@ final class MapboxMapController

private Set<String> interactiveFeatureLayerIds;
private Map<String, FeatureCollection> addedFeaturesByLayer;
private Map myLocationStyle;

private LatLngBounds bounds = null;

Expand All @@ -148,6 +150,7 @@ final class MapboxMapController
this.interactiveFeatureLayerIds = new HashSet<>();
this.addedFeaturesByLayer = new HashMap<String, FeatureCollection>();
this.density = context.getResources().getDisplayMetrics().density;
this.myLocationStyle = Collections.emptyMap();
this.lifecycleProvider = lifecycleProvider;
if (dragEnabled) {
this.androidGesturesManager = new AndroidGesturesManager(this.mapView.getContext(), false);
Expand Down Expand Up @@ -314,6 +317,14 @@ private LocationComponentOptions buildLocationComponentOptions(Style style) {
final LocationComponentOptions.Builder optionsBuilder =
LocationComponentOptions.builder(context);
optionsBuilder.trackingGesturesManagement(true);
if (myLocationStyle.get("puckColor") != null) {
final int color = Color.parseColor((String) myLocationStyle.get("puckColor"));
optionsBuilder.foregroundTintColor(color);
}
if (myLocationStyle.get("pulsingColor") != null) {
final int color = Color.parseColor((String) myLocationStyle.get("pulsingColor"));
optionsBuilder.accuracyColor(color);
}

final String lastLayerId = getLastLayerOnStyle(style);
if (lastLayerId != null) {
Expand Down Expand Up @@ -1403,6 +1414,12 @@ public void setMyLocationRenderMode(int myLocationRenderMode) {
}
}

@Override
public void setMyLocationStyle(Map myLocationStyle) {
this.myLocationStyle = myLocationStyle;
updateLocationComponentLayer();
}

public void setLogoViewMargins(int x, int y) {
mapboxMap.getUiSettings().setLogoMargins(x, 0, 0, y);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package com.mapbox.mapboxgl;

import com.mapbox.mapboxsdk.geometry.LatLngBounds;
import java.util.Map;

/** Receiver of MapboxMap configuration options. */
interface MapboxMapOptionsSink {
Expand Down Expand Up @@ -34,6 +35,8 @@ void setCameraTargetBounds(

void setMyLocationRenderMode(int myLocationRenderMode);

void setMyLocationStyle(Map myLocationStyle);

void setLogoViewMargins(int x, int y);

void setCompassGravity(int gravity);
Expand Down
55 changes: 55 additions & 0 deletions example/lib/custom_my_location_style.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import 'package:flutter/material.dart';
import 'package:location/location.dart';
import 'package:mapbox_gl_example/main.dart';
import 'package:mapbox_gl_example/page.dart';
import 'package:mapbox_gl/mapbox_gl.dart';

class CustomMyLocationStyle extends ExamplePage {
const CustomMyLocationStyle({Key? key})
: super(const Icon(Icons.my_location), "Custom my location style");

@override
Widget build(BuildContext context) {
return CustomMyLocationStyleBody();
}
}

class CustomMyLocationStyleBody extends StatefulWidget {
const CustomMyLocationStyleBody({Key? key}) : super(key: key);

@override
State<CustomMyLocationStyleBody> createState() =>
_CustomMyLocationStyleBodyState();
}

class _CustomMyLocationStyleBodyState extends State<CustomMyLocationStyleBody> {
var _myLocationStyle = MyLocationStyle();

@override
Widget build(BuildContext context) {
return Scaffold(
body: MapboxMap(
initialCameraPosition: CameraPosition(target: LatLng(0, 0)),
accessToken: MapsDemo.ACCESS_TOKEN,
myLocationEnabled: true,
myLocationStyle: _myLocationStyle,
onMapCreated: (ctr) async {
final location = await Location().getLocation();
await ctr.animateCamera(CameraUpdate.newLatLngZoom(
LatLng(location.latitude ?? 0, location.longitude ?? 0), 14));
},
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.swap_horiz),
onPressed: () {
setState(() {
_myLocationStyle = MyLocationStyle(
puckColor: Colors.yellow,
pulsingColor: Colors.green,
);
});
},
),
);
}
}
4 changes: 3 additions & 1 deletion example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:location/location.dart';
import 'package:mapbox_gl_example/custom_marker.dart';
import 'package:mapbox_gl_example/custom_my_location_style.dart';
import 'package:mapbox_gl_example/full_map.dart';
import 'package:mapbox_gl_example/offline_regions.dart';
import 'package:mapbox_gl_example/place_batch.dart';
Expand Down Expand Up @@ -49,7 +50,8 @@ final List<ExamplePage> _allPages = <ExamplePage>[
CustomMarkerPage(),
BatchAddPage(),
ClickAnnotationPage(),
Sources()
Sources(),
CustomMyLocationStyle(),
];

class MapsDemo extends StatefulWidget {
Expand Down
3 changes: 3 additions & 0 deletions ios/Classes/Convert.swift
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ class Convert {
{
delegate.setMyLocationRenderMode(myLocationRenderMode: renderMode)
}
if let myLocationStyle = options["myLocationStyle"] as? [String: String] {
delegate.setMyLocationStyle(style: myLocationStyle)
}
if let logoViewMargins = options["logoViewMargins"] as? [Double] {
delegate.setLogoViewMargins(x: logoViewMargins[0], y: logoViewMargins[1])
}
Expand Down
18 changes: 18 additions & 0 deletions ios/Classes/MapboxMapController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ class MapboxMapController: NSObject, FlutterPlatformView, MGLMapViewDelegate, Ma
private var interactiveFeatureLayerIds = Set<String>()
private var addedShapesByLayer = [String: MGLShape]()

private var userLocationAnnotationViewStyle = MGLUserLocationAnnotationViewStyle()

func view() -> UIView {
return mapView
}
Expand Down Expand Up @@ -1285,6 +1287,12 @@ class MapboxMapController: NSObject, FlutterPlatformView, MGLMapViewDelegate, Ma
}
}

func mapView(styleForDefaultUserLocationAnnotationView _: MGLMapView)
-> MGLUserLocationAnnotationViewStyle
{
return userLocationAnnotationViewStyle
}

func addSourceGeojson(sourceId: String, geojson: String) {
do {
let parsed = try MGLShape(
Expand Down Expand Up @@ -1430,6 +1438,16 @@ class MapboxMapController: NSObject, FlutterPlatformView, MGLMapViewDelegate, Ma
}
}

func setMyLocationStyle(style: [String: String]) {
if let puckColor = UIColor(hexString: style["puckColor"] ?? "") {
userLocationAnnotationViewStyle.puckFillColor = puckColor
}
if let pulsingColor = UIColor(hexString: style["pulsingColor"] ?? "") {
userLocationAnnotationViewStyle.haloFillColor = pulsingColor
}
mapView.updateUserLocationAnnotationView()
}

func setLogoViewMargins(x: Double, y: Double) {
mapView.logoViewMargins = CGPoint(x: x, y: y)
}
Expand Down
1 change: 1 addition & 0 deletions ios/Classes/MapboxMapOptionsSink.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ protocol MapboxMapOptionsSink {
func setMyLocationEnabled(myLocationEnabled: Bool)
func setMyLocationTrackingMode(myLocationTrackingMode: MGLUserTrackingMode)
func setMyLocationRenderMode(myLocationRenderMode: MyLocationRenderMode)
func setMyLocationStyle(style: [String: String])
func setLogoViewMargins(x: Double, y: Double)
func setCompassViewPosition(position: MGLOrnamentPosition)
func setCompassViewMargins(x: Double, y: Double)
Expand Down
3 changes: 2 additions & 1 deletion lib/mapbox_gl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import 'package:mapbox_gl_platform_interface/mapbox_gl_platform_interface.dart';

export 'package:mapbox_gl_platform_interface/mapbox_gl_platform_interface.dart'
show
MapBoxColorConversion,
LatLng,
LatLngBounds,
LatLngQuad,
Expand All @@ -32,6 +33,7 @@ export 'package:mapbox_gl_platform_interface/mapbox_gl_platform_interface.dart'
MapboxStyles,
MyLocationTrackingMode,
MyLocationRenderMode,
MyLocationStyle,
CompassViewPosition,
AttributionButtonPosition,
Annotation,
Expand All @@ -56,6 +58,5 @@ part 'src/offline_region.dart';
part 'src/download_region_status.dart';
part 'src/layer_expressions.dart';
part 'src/layer_properties.dart';
part 'src/color_tools.dart';
part 'src/annotation_manager.dart';
part 'src/util.dart';
9 changes: 9 additions & 0 deletions lib/src/mapbox_map.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class MapboxMap extends StatefulWidget {
this.myLocationEnabled = false,
this.myLocationTrackingMode = MyLocationTrackingMode.None,
this.myLocationRenderMode = MyLocationRenderMode.COMPASS,
this.myLocationStyle = const MyLocationStyle(),
this.logoViewMargins,
this.compassViewPosition,
this.compassViewMargins,
Expand Down Expand Up @@ -167,6 +168,9 @@ class MapboxMap extends StatefulWidget {
/// The mode to render the user location symbol
final MyLocationRenderMode myLocationRenderMode;

/// The style of the user location annotation
final MyLocationStyle myLocationStyle;

/// Set the layout margins for the Mapbox Logo
final Point? logoViewMargins;

Expand Down Expand Up @@ -339,6 +343,7 @@ class _MapboxMapOptions {
this.myLocationEnabled,
this.myLocationTrackingMode,
this.myLocationRenderMode,
this.myLocationStyle,
this.logoViewMargins,
this.compassViewPosition,
this.compassViewMargins,
Expand All @@ -362,6 +367,7 @@ class _MapboxMapOptions {
myLocationEnabled: map.myLocationEnabled,
myLocationTrackingMode: map.myLocationTrackingMode,
myLocationRenderMode: map.myLocationRenderMode,
myLocationStyle: map.myLocationStyle,
logoViewMargins: map.logoViewMargins,
compassViewPosition: map.compassViewPosition,
compassViewMargins: map.compassViewMargins,
Expand Down Expand Up @@ -396,6 +402,8 @@ class _MapboxMapOptions {

final MyLocationRenderMode? myLocationRenderMode;

final MyLocationStyle? myLocationStyle;

final Point? logoViewMargins;

final CompassViewPosition? compassViewPosition;
Expand Down Expand Up @@ -446,6 +454,7 @@ class _MapboxMapOptions {
addIfNonNull('myLocationEnabled', myLocationEnabled);
addIfNonNull('myLocationTrackingMode', myLocationTrackingMode?.index);
addIfNonNull('myLocationRenderMode', myLocationRenderMode?.index);
addIfNonNull('myLocationStyle', myLocationStyle?.toJson());
addIfNonNull('logoViewMargins', pointToArray(logoViewMargins));
addIfNonNull('compassViewPosition', compassViewPosition?.index);
addIfNonNull('compassViewMargins', pointToArray(compassViewMargins));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,5 @@ part 'src/fill.dart';
part 'src/ui.dart';
part 'src/mapbox_gl_platform_interface.dart';
part 'src/source_properties.dart';
part 'src/my_location_style.dart';
part 'src/color_tools.dart';
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
part of mapbox_gl;
part of mapbox_gl_platform_interface;

extension MapBoxColorConversion on Color {
String toHexStringRGB() {
Expand Down
13 changes: 13 additions & 0 deletions mapbox_gl_platform_interface/lib/src/my_location_style.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
part of mapbox_gl_platform_interface;

class MyLocationStyle {
final Color? puckColor;
final Color? pulsingColor;

const MyLocationStyle({this.puckColor, this.pulsingColor});

dynamic toJson() => {
"puckColor": puckColor?.toHexStringRGB(),
"pulsingColor": pulsingColor?.toHexStringRGB(),
}..removeWhere((key, value) => value == null);
}
3 changes: 3 additions & 0 deletions mapbox_gl_web/lib/src/convert.dart
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ class Convert {
if (options.containsKey('myLocationRenderMode')) {
sink.setMyLocationRenderMode(options['myLocationRenderMode']);
}
if (options.containsKey('myLocationStyle')) {
sink.setMyLocationStyle(options['myLocationStyle']);
}
if (options.containsKey('logoViewMargins')) {
sink.setLogoViewMargins(
options['logoViewMargins'][0], options['logoViewMargins'][1]);
Expand Down
5 changes: 5 additions & 0 deletions mapbox_gl_web/lib/src/mapbox_web_gl_platform.dart
Original file line number Diff line number Diff line change
Expand Up @@ -555,6 +555,11 @@ class MapboxWebGlPlatform extends MapboxGlPlatform
print('myLocationRenderMode not available in web');
}

@override
void setMyLocationStyle(MyLocationStyle myLocationStyle) {
print('myLocationStyle not available in web');
}

@override
void setMyLocationTrackingMode(int myLocationTrackingMode) {
if (_geolocateControl == null) {
Expand Down
2 changes: 2 additions & 0 deletions mapbox_gl_web/lib/src/options_sink.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ abstract class MapboxMapOptionsSink {

void setMyLocationRenderMode(int myLocationRenderMode);

void setMyLocationStyle(MyLocationStyle myLocationStyle);

void setLogoViewMargins(int x, int y);

void setCompassAlignment(CompassViewPosition position);
Expand Down

0 comments on commit 1500fc1

Please sign in to comment.