1
1
/*
2
- * Copyright 2023 Google Inc.
2
+ * Copyright 2025 Google LLC
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
13
13
* See the License for the specific language governing permissions and
14
14
* limitations under the License.
15
15
*/
16
+ package com.google.maps.android.data
16
17
17
- package com.google.maps.android.data ;
18
-
19
- import com.google.android.gms.maps.GoogleMap;
20
- import com.google.maps.android.data.geojson.GeoJsonLineStringStyle;
21
- import com.google.maps.android.data.geojson.GeoJsonPointStyle;
22
- import com.google.maps.android.data.geojson.GeoJsonPolygonStyle;
23
- import com.google.maps.android.data.geojson.GeoJsonRenderer;
24
- import com.google.maps.android.data.kml.KmlContainer;
25
- import com.google.maps.android.data.kml.KmlGroundOverlay;
26
- import com.google.maps.android.data.kml.KmlRenderer;
18
+ import com.google.android.gms.maps.GoogleMap
19
+ import com.google.maps.android.data.geojson.GeoJsonLineStringStyle
20
+ import com.google.maps.android.data.geojson.GeoJsonPointStyle
21
+ import com.google.maps.android.data.geojson.GeoJsonPolygonStyle
22
+ import com.google.maps.android.data.geojson.GeoJsonRenderer
23
+ import com.google.maps.android.data.kml.KmlContainer
24
+ import com.google.maps.android.data.kml.KmlGroundOverlay
25
+ import com.google.maps.android.data.kml.KmlRenderer
27
26
28
27
/* *
29
28
* An abstraction that shares the common properties of
30
- * {@link com.google.maps.android.data.kml.KmlLayer KmlLayer} and
31
- * {@link com.google.maps.android.data.geojson.GeoJsonLayer GeoJsonLayer}
29
+ * [ com.google.maps.android.data.kml.KmlLayer] and
30
+ * [ com.google.maps.android.data.geojson.GeoJsonLayer]
32
31
*/
33
- public abstract class Layer {
34
-
35
- private Renderer mRenderer;
32
+ abstract class Layer < T : Feature > {
33
+ @JvmField
34
+ protected var renderer : Renderer < T > ? = null
36
35
37
36
/* *
38
37
* Adds the KML data to the map
39
38
*/
40
- protected void addKMLToMap() {
41
- if (mRenderer instanceof KmlRenderer ) {
42
- ((KmlRenderer ) mRenderer).addLayerToMap();
43
- } else {
44
- throw new UnsupportedOperationException (" Stored renderer is not a KmlRenderer" );
45
- }
39
+ protected fun addKMLToMap () {
40
+ val kmlRenderer = renderer as ? KmlRenderer
41
+ ? : throw UnsupportedOperationException (" Stored renderer is not a KmlRenderer" )
42
+ kmlRenderer.addLayerToMap()
46
43
}
47
44
48
45
/* *
49
46
* Adds GeoJson data to the map
50
47
*/
51
- protected void addGeoJsonToMap() {
52
- if (mRenderer instanceof GeoJsonRenderer ) {
53
- ((GeoJsonRenderer ) mRenderer).addLayerToMap();
54
- } else {
55
- throw new UnsupportedOperationException (" Stored renderer is not a GeoJsonRenderer" );
56
- }
48
+ protected fun addGeoJsonToMap () {
49
+ val geoJsonRenderer = renderer as ? GeoJsonRenderer
50
+ ? : throw UnsupportedOperationException (" Stored renderer is not a GeoJsonRenderer" )
51
+ geoJsonRenderer.addLayerToMap()
57
52
}
58
53
59
- public abstract void addLayerToMap();
54
+ abstract fun addLayerToMap ()
60
55
61
56
/* *
62
57
* Removes all the data from the map and clears all the stored placemarks
63
58
*/
64
- public void removeLayerFromMap() {
65
- if (mRenderer instanceof GeoJsonRenderer ) {
66
- ((GeoJsonRenderer ) mRenderer).removeLayerFromMap();
67
- } else if (mRenderer instanceof KmlRenderer ) {
68
- ((KmlRenderer ) mRenderer).removeLayerFromMap();
59
+ fun removeLayerFromMap () {
60
+ when (val r = renderer) {
61
+ is GeoJsonRenderer -> r.removeLayerFromMap()
62
+ is KmlRenderer -> r.removeLayerFromMap()
69
63
}
70
64
}
71
65
72
66
/* *
73
67
* Sets a single click listener for the entire GoogleMap object, that will be called
74
68
* with the corresponding Feature object when an object on the map (Polygon,
75
69
* Marker, Polyline) is clicked.
76
- * <p>
70
+ *
77
71
* If getFeature() returns null this means that either the object is inside a KMLContainer,
78
72
* or the object is a MultiPolygon, MultiLineString or MultiPoint and must
79
73
* be handled differently.
80
74
*
81
75
* @param listener Listener providing the onFeatureClick method to call.
82
76
*/
83
- public void setOnFeatureClickListener(final OnFeatureClickListener listener ) {
84
- mRenderer .setOnFeatureClickListener(listener);
77
+ fun setOnFeatureClickListener (listener : OnFeatureClickListener ) {
78
+ renderer? .setOnFeatureClickListener(listener)
85
79
}
86
80
87
81
/* *
88
82
* Callback interface for when a map object is clicked.
89
83
*/
90
- public interface OnFeatureClickListener {
91
- void onFeatureClick(Feature feature);
84
+ fun interface OnFeatureClickListener {
85
+ fun onFeatureClick (feature : Feature )
92
86
}
93
87
94
88
/* *
95
89
* Stores a new Renderer object into mRenderer
96
90
*
97
91
* @param renderer the new Renderer object that belongs to this Layer
98
92
*/
99
- protected void storeRenderer(Renderer renderer) {
100
- mRenderer = renderer;
93
+ protected fun storeRenderer (renderer : Renderer < T > ) {
94
+ this .renderer = renderer
101
95
}
102
96
103
97
/* *
104
98
* Gets an iterable of all Feature elements that have been added to the layer
105
99
*
106
100
* @return iterable of Feature elements
107
101
*/
108
- public Iterable < ? extends Feature > getFeatures() {
109
- return mRenderer.getFeatures();
102
+ open fun getFeatures (): Iterable < T > {
103
+ return renderer?.features ? : emptyList()
110
104
}
111
105
106
+
112
107
/* *
113
108
* Retrieves a corresponding Feature instance for the given Object
114
109
* Allows maps with multiple layers to determine which layer the Object
@@ -117,103 +112,91 @@ public abstract class Layer {
117
112
* @param mapObject Object
118
113
* @return Feature for the given object
119
114
*/
120
- public Feature getFeature(Object mapObject) {
121
- return mRenderer .getFeature(mapObject);
115
+ fun getFeature (mapObject : Any ): T ? {
116
+ return renderer? .getFeature(mapObject) as T ?
122
117
}
123
118
124
- public Feature getContainerFeature(Object mapObject) {
125
- return mRenderer .getContainerFeature(mapObject);
119
+ fun getContainerFeature (mapObject : Any ): T ? {
120
+ return renderer? .getContainerFeature(mapObject) as T ?
126
121
}
127
122
128
123
/* *
129
124
* Checks if there are any features currently on the layer
130
125
*
131
126
* @return true if there are features on the layer, false otherwise
132
127
*/
133
- protected boolean hasFeatures() {
134
- return mRenderer.hasFeatures();
135
- }
128
+ protected open fun hasFeatures (): Boolean = renderer?.hasFeatures() ? : false
136
129
137
130
/* *
138
131
* Checks if the layer contains any KmlContainers
139
132
*
140
133
* @return true if there is at least 1 container within the KmlLayer, false otherwise
141
134
*/
142
- protected boolean hasContainers() {
143
- if (mRenderer instanceof KmlRenderer ) {
144
- return ((KmlRenderer ) mRenderer).hasNestedContainers();
145
- }
146
- return false ;
135
+ protected open fun hasContainers (): Boolean {
136
+ return (renderer as ? KmlRenderer )?.hasNestedContainers() ? : false
147
137
}
148
138
149
139
/* *
150
140
* Gets an iterable of KmlContainerInterface objects
151
141
*
152
142
* @return iterable of KmlContainerInterface objects
153
143
*/
154
- protected Iterable <KmlContainer > getContainers() {
155
- if (mRenderer instanceof KmlRenderer ) {
156
- return ((KmlRenderer ) mRenderer).getNestedContainers();
157
- }
158
- return null ;
144
+ protected open fun getContainers (): Iterable <KmlContainer >? {
145
+ return (renderer as ? KmlRenderer )?.nestedContainers
159
146
}
160
147
148
+
161
149
/* *
162
150
* Gets an iterable of KmlGroundOverlay objects
163
151
*
164
152
* @return iterable of KmlGroundOverlay objects
165
153
*/
166
- protected Iterable <KmlGroundOverlay > getGroundOverlays() {
167
- if (mRenderer instanceof KmlRenderer ) {
168
- return ((KmlRenderer ) mRenderer).getGroundOverlays();
169
- }
170
- return null ;
154
+ protected open fun getGroundOverlays (): Iterable <KmlGroundOverlay >? {
155
+ return (renderer as ? KmlRenderer )?.groundOverlays
171
156
}
172
157
173
158
/* *
174
159
* Gets the map on which the layer is rendered
175
160
*
176
161
* @return map on which the layer is rendered
177
162
*/
178
- public GoogleMap getMap() {
179
- return mRenderer.getMap();
180
- }
163
+ val map: GoogleMap ?
164
+ get() = renderer?.map
181
165
182
166
/* *
183
167
* Renders the layer on the given map. The layer on the current map is removed and
184
168
* added to the given map.
185
169
*
186
170
* @param map to render the layer on, if null the layer is cleared from the current map
187
171
*/
188
- public void setMap(GoogleMap map) {
189
- mRenderer.setMap( map);
172
+ fun setMap (map : GoogleMap ? ) {
173
+ renderer?. map = map
190
174
}
191
175
192
176
/* *
193
177
* Checks if the current layer has been added to the map
194
178
*
195
179
* @return true if the layer is on the map, false otherwise
196
180
*/
197
- public boolean isLayerOnMap() {
198
- return mRenderer.isLayerOnMap();
199
- }
181
+ val isLayerOnMap: Boolean
182
+ get() = renderer?.isLayerOnMap ? : false
200
183
201
184
/* *
202
185
* Adds a provided feature to the map
203
186
*
204
187
* @param feature feature to add to map
205
188
*/
206
- protected void addFeature(Feature feature) {
207
- mRenderer .addFeature(feature);
189
+ protected open fun addFeature (feature : T ) {
190
+ renderer? .addFeature(feature)
208
191
}
209
192
210
193
/* *
211
194
* Remove a specified feature from the map
212
195
*
213
196
* @param feature feature to be removed
214
197
*/
215
- protected void removeFeature(Feature feature) {
216
- mRenderer .removeFeature(feature);
198
+ protected open fun removeFeature (feature : T ) {
199
+ renderer? .removeFeature(feature)
217
200
}
218
201
219
202
/* *
@@ -222,27 +205,24 @@ public abstract class Layer {
222
205
*
223
206
* @return default style used to render GeoJsonPoints
224
207
*/
225
- public GeoJsonPointStyle getDefaultPointStyle() {
226
- return mRenderer.getDefaultPointStyle();
227
- }
208
+ val defaultPointStyle: GeoJsonPointStyle ?
209
+ get() = renderer?.defaultPointStyle
228
210
229
211
/* *
230
212
* Gets the default style used to render GeoJsonLineStrings. Any changes to this style will be
231
213
* reflected in the features that use it.
232
214
*
233
215
* @return default style used to render GeoJsonLineStrings
234
216
*/
235
- public GeoJsonLineStringStyle getDefaultLineStringStyle() {
236
- return mRenderer.getDefaultLineStringStyle();
237
- }
217
+ val defaultLineStringStyle: GeoJsonLineStringStyle ?
218
+ get() = renderer?.defaultLineStringStyle
238
219
239
220
/* *
240
221
* Gets the default style used to render GeoJsonPolygons. Any changes to this style will be
241
222
* reflected in the features that use it.
242
223
*
243
224
* @return default style used to render GeoJsonPolygons
244
225
*/
245
- public GeoJsonPolygonStyle getDefaultPolygonStyle() {
246
- return mRenderer.getDefaultPolygonStyle();
247
- }
226
+ val defaultPolygonStyle: GeoJsonPolygonStyle ?
227
+ get() = renderer?.defaultPolygonStyle
248
228
}
0 commit comments