@@ -6,10 +6,12 @@ import android.annotation.SuppressLint
6
6
import android.content.Context
7
7
import android.graphics.Bitmap
8
8
import androidx.annotation.ColorRes
9
+ import androidx.compose.foundation.BorderStroke
9
10
import androidx.compose.foundation.clickable
10
11
import androidx.compose.foundation.layout.*
11
12
import androidx.compose.foundation.lazy.LazyColumn
12
13
import androidx.compose.foundation.lazy.items
14
+ import androidx.compose.foundation.shape.CircleShape
13
15
import androidx.compose.material.ExperimentalMaterialApi
14
16
import androidx.compose.material.ModalBottomSheetLayout
15
17
import androidx.compose.material.ModalBottomSheetValue
@@ -27,6 +29,7 @@ import androidx.compose.ui.res.stringResource
27
29
import androidx.compose.ui.text.font.FontWeight
28
30
import androidx.compose.ui.text.style.TextAlign
29
31
import androidx.compose.ui.unit.dp
32
+ import androidx.compose.ui.unit.sp
30
33
import androidx.core.content.ContextCompat
31
34
import androidx.core.graphics.drawable.DrawableCompat
32
35
import androidx.navigation.NavHostController
@@ -36,6 +39,8 @@ import com.google.firebase.analytics.ktx.analytics
36
39
import com.google.firebase.analytics.ktx.logEvent
37
40
import com.google.firebase.ktx.Firebase
38
41
import com.google.maps.android.compose.*
42
+ import com.google.maps.android.compose.clustering.Clustering
43
+ import com.google.maps.android.clustering.ClusterItem
39
44
import com.surrus.galwaybus.common.model.BusStop
40
45
import com.surrus.galwaybus.common.model.GalwayBusDeparture
41
46
import com.surrus.galwaybus.common.model.Location
@@ -50,7 +55,7 @@ import kotlinx.coroutines.launch
50
55
51
56
52
57
@OptIn(ExperimentalMaterialApi ::class , ExperimentalMaterialApi ::class )
53
- @SuppressLint(" MissingPermission" )
58
+ @SuppressLint(" MissingPermission" , " CoroutineCreationDuringComposition " )
54
59
@Composable
55
60
fun NearestBusStopsScreen (viewModel : GalwayBusViewModel , navController : NavHostController ) {
56
61
val coroutineScope = rememberCoroutineScope()
@@ -216,6 +221,16 @@ fun BusStopView(stop: BusStop, stopSelected : (stop : BusStop) -> Unit, isFavori
216
221
}
217
222
218
223
224
+ data class BusStopPositionClusterItem (
225
+ val itemPosition : LatLng ,
226
+ val itemTitle : String ,
227
+ val itemSnippet : String ,
228
+ ) : ClusterItem {
229
+ override fun getPosition (): LatLng = itemPosition
230
+ override fun getTitle (): String = itemTitle
231
+ override fun getSnippet (): String = itemSnippet
232
+ }
233
+
219
234
@Composable
220
235
private fun GoogleMapView (modifier : Modifier , viewModel : GalwayBusViewModel , stops : List <BusStop >) {
221
236
val context = LocalContext .current
@@ -249,15 +264,33 @@ private fun GoogleMapView(modifier: Modifier, viewModel: GalwayBusViewModel, sto
249
264
properties = mapProperties,
250
265
uiSettings = uiSettings
251
266
) {
252
- stops.forEach { stop ->
253
- val latitude = stop.latitude
254
- val longitude = stop.longitude
255
- if (latitude != null && longitude != null ) {
256
- val busStopLocation = LatLng (latitude, longitude)
257
- val icon = bitmapDescriptorFromVector(context, R .drawable.ic_stop, R .color.mapMarkerGreen)
258
- Marker (state = MarkerState (position = busStopLocation), title = stop.shortName, icon = icon)
267
+
268
+ Clustering (
269
+ items = stops.map { stop ->
270
+ val latitude = stop.latitude
271
+ val longitude = stop.longitude
272
+ val busStopLocation = LatLng (latitude!! , longitude!! )
273
+ BusStopPositionClusterItem (busStopLocation, stop.shortName, " Snippet" )
274
+ },
275
+ clusterContent = { cluster ->
276
+ Surface (
277
+ Modifier .size(40 .dp),
278
+ shape = CircleShape ,
279
+ color = Color .Blue ,
280
+ contentColor = Color .White ,
281
+ border = BorderStroke (1 .dp, Color .White )
282
+ ) {
283
+ Box (contentAlignment = Alignment .Center ) {
284
+ Text (
285
+ " %,d" .format(cluster.size),
286
+ fontSize = 16 .sp,
287
+ fontWeight = FontWeight .Black ,
288
+ textAlign = TextAlign .Center
289
+ )
290
+ }
291
+ }
259
292
}
260
- }
293
+ )
261
294
}
262
295
}
263
296
0 commit comments