@@ -7,87 +7,103 @@ class StyleControllerAndroid implements StyleController {
77 final jni.Style _jStyle;
88
99 @override
10- Future <void > addLayer (StyleLayer layer, {String ? belowLayerId}) async =>
11- using ((arena) {
12- final iId = layer.id.toJString ()..releasedBy (arena);
13- final jLayer = switch (layer) {
14- FillStyleLayer () => jni.FillLayer (
15- iId,
16- layer.sourceId.toJString ()..releasedBy (arena),
17- ),
18- CircleStyleLayer () => jni.CircleLayer (
19- iId,
20- layer.sourceId.toJString ()..releasedBy (arena),
21- ),
22- BackgroundStyleLayer () => jni.BackgroundLayer (layer.id.toJString ()),
23- FillExtrusionStyleLayer () => jni.FillExtrusionLayer (
24- iId,
25- layer.sourceId.toJString ()..releasedBy (arena),
26- ),
27- HeatmapStyleLayer () => jni.HeatmapLayer (
28- iId,
29- layer.sourceId.toJString ()..releasedBy (arena),
30- ),
31- HillshadeStyleLayer () => jni.HillshadeLayer (
32- iId,
33- layer.sourceId.toJString ()..releasedBy (arena),
34- ),
35- LineStyleLayer () => jni.LineLayer (
36- iId,
37- layer.sourceId.toJString ()..releasedBy (arena),
38- ),
39- RasterStyleLayer () => jni.RasterLayer (
40- iId,
41- layer.sourceId.toJString ()..releasedBy (arena),
42- ),
43- SymbolStyleLayer () => jni.SymbolLayer (
44- iId,
45- layer.sourceId.toJString ()..releasedBy (arena),
46- ),
47- _ => throw UnimplementedError (
48- 'The Layer is not supported: ${layer .runtimeType }' ,
49- ),
50- };
51- jLayer.setMinZoom (layer.minZoom);
52- jLayer.setMaxZoom (layer.maxZoom);
53-
54- // paint and layout properties
55- final layoutEntries = layer.layout.entries.toList (growable: false );
56- final paintEntries = layer.paint.entries.toList (growable: false );
57- final props = JArray (
58- jni.PropertyValue .nullableType (JObject .nullableType),
59- layoutEntries.length + paintEntries.length,
60- )..releasedBy (arena);
61- for (var i = 0 ; i < paintEntries.length; i++ ) {
62- final entry = paintEntries[i];
63- props[i] = jni.PaintPropertyValue (
64- entry.key.toJString (),
65- entry.value.toJObject (arena),
66- T : JObject .type,
67- )..releasedBy (arena);
68- }
69- for (var i = 0 ; i < layoutEntries.length; i++ ) {
70- final entry = layoutEntries[i];
71- props[paintEntries.length + i] = jni.LayoutPropertyValue (
72- entry.key.toJString (),
73- entry.value.toJObject (arena),
74- T : JObject .type,
75- )..releasedBy (arena);
76- }
77- jLayer.releasedBy (arena);
78- jLayer.setProperties (props);
10+ Future <void > addLayer (
11+ StyleLayer layer, {
12+ String ? belowLayerId,
13+ }) async => using ((arena) {
14+ final jId = layer.id.toJString ()..releasedBy (arena);
15+ final prevLayer = _jStyle.getLayer (jId);
16+ if (prevLayer != null ) {
17+ throw Exception (
18+ 'A Layer with the id "${layer .id }" already exists in the map style.' ,
19+ );
20+ }
7921
80- // add to style
81- if (belowLayerId case final String belowId) {
82- _jStyle.addLayerBelow (jLayer, belowId.toJString ()..releasedBy (arena));
83- } else {
84- _jStyle.addLayer (jLayer);
85- }
86- });
22+ final jLayer = switch (layer) {
23+ FillStyleLayer () => jni.FillLayer (
24+ jId,
25+ layer.sourceId.toJString ()..releasedBy (arena),
26+ ),
27+ CircleStyleLayer () => jni.CircleLayer (
28+ jId,
29+ layer.sourceId.toJString ()..releasedBy (arena),
30+ ),
31+ BackgroundStyleLayer () => jni.BackgroundLayer (layer.id.toJString ()),
32+ FillExtrusionStyleLayer () => jni.FillExtrusionLayer (
33+ jId,
34+ layer.sourceId.toJString ()..releasedBy (arena),
35+ ),
36+ HeatmapStyleLayer () => jni.HeatmapLayer (
37+ jId,
38+ layer.sourceId.toJString ()..releasedBy (arena),
39+ ),
40+ HillshadeStyleLayer () => jni.HillshadeLayer (
41+ jId,
42+ layer.sourceId.toJString ()..releasedBy (arena),
43+ ),
44+ LineStyleLayer () => jni.LineLayer (
45+ jId,
46+ layer.sourceId.toJString ()..releasedBy (arena),
47+ ),
48+ RasterStyleLayer () => jni.RasterLayer (
49+ jId,
50+ layer.sourceId.toJString ()..releasedBy (arena),
51+ ),
52+ SymbolStyleLayer () => jni.SymbolLayer (
53+ jId,
54+ layer.sourceId.toJString ()..releasedBy (arena),
55+ ),
56+ _ => throw UnimplementedError (
57+ 'The Layer is not supported: ${layer .runtimeType }' ,
58+ ),
59+ };
60+ jLayer.setMinZoom (layer.minZoom);
61+ jLayer.setMaxZoom (layer.maxZoom);
62+
63+ // paint and layout properties
64+ final layoutEntries = layer.layout.entries.toList (growable: false );
65+ final paintEntries = layer.paint.entries.toList (growable: false );
66+ final props = JArray (
67+ jni.PropertyValue .nullableType (JObject .nullableType),
68+ layoutEntries.length + paintEntries.length,
69+ )..releasedBy (arena);
70+ for (var i = 0 ; i < paintEntries.length; i++ ) {
71+ final entry = paintEntries[i];
72+ props[i] = jni.PaintPropertyValue (
73+ entry.key.toJString (),
74+ entry.value.toJObject (arena),
75+ T : JObject .type,
76+ )..releasedBy (arena);
77+ }
78+ for (var i = 0 ; i < layoutEntries.length; i++ ) {
79+ final entry = layoutEntries[i];
80+ props[paintEntries.length + i] = jni.LayoutPropertyValue (
81+ entry.key.toJString (),
82+ entry.value.toJObject (arena),
83+ T : JObject .type,
84+ )..releasedBy (arena);
85+ }
86+ jLayer.releasedBy (arena);
87+ jLayer.setProperties (props);
88+
89+ // add to style
90+ if (belowLayerId case final String belowId) {
91+ _jStyle.addLayerBelow (jLayer, belowId.toJString ()..releasedBy (arena));
92+ } else {
93+ _jStyle.addLayer (jLayer);
94+ }
95+ });
8796
8897 @override
8998 Future <void > addSource (Source source) async => using ((arena) {
9099 final jId = source.id.toJString ()..releasedBy (arena);
100+ final prevSource = _jStyle.getSource (jId);
101+ if (prevSource != null ) {
102+ throw Exception (
103+ 'A Source with the id "${source .id }" already exists in the map style.' ,
104+ );
105+ }
106+
91107 final jni.Source jSource;
92108 switch (source) {
93109 case GeoJsonSource ():
0 commit comments