@@ -6,10 +6,12 @@ import android.annotation.SuppressLint
66import android.content.Context
77import android.graphics.Bitmap
88import androidx.annotation.ColorRes
9+ import androidx.compose.foundation.BorderStroke
910import androidx.compose.foundation.clickable
1011import androidx.compose.foundation.layout.*
1112import androidx.compose.foundation.lazy.LazyColumn
1213import androidx.compose.foundation.lazy.items
14+ import androidx.compose.foundation.shape.CircleShape
1315import androidx.compose.material.ExperimentalMaterialApi
1416import androidx.compose.material.ModalBottomSheetLayout
1517import androidx.compose.material.ModalBottomSheetValue
@@ -27,6 +29,7 @@ import androidx.compose.ui.res.stringResource
2729import androidx.compose.ui.text.font.FontWeight
2830import androidx.compose.ui.text.style.TextAlign
2931import androidx.compose.ui.unit.dp
32+ import androidx.compose.ui.unit.sp
3033import androidx.core.content.ContextCompat
3134import androidx.core.graphics.drawable.DrawableCompat
3235import androidx.navigation.NavHostController
@@ -36,6 +39,8 @@ import com.google.firebase.analytics.ktx.analytics
3639import com.google.firebase.analytics.ktx.logEvent
3740import com.google.firebase.ktx.Firebase
3841import com.google.maps.android.compose.*
42+ import com.google.maps.android.compose.clustering.Clustering
43+ import com.google.maps.android.clustering.ClusterItem
3944import com.surrus.galwaybus.common.model.BusStop
4045import com.surrus.galwaybus.common.model.GalwayBusDeparture
4146import com.surrus.galwaybus.common.model.Location
@@ -50,7 +55,7 @@ import kotlinx.coroutines.launch
5055
5156
5257@OptIn(ExperimentalMaterialApi ::class , ExperimentalMaterialApi ::class )
53- @SuppressLint(" MissingPermission" )
58+ @SuppressLint(" MissingPermission" , " CoroutineCreationDuringComposition " )
5459@Composable
5560fun NearestBusStopsScreen (viewModel : GalwayBusViewModel , navController : NavHostController ) {
5661 val coroutineScope = rememberCoroutineScope()
@@ -216,6 +221,16 @@ fun BusStopView(stop: BusStop, stopSelected : (stop : BusStop) -> Unit, isFavori
216221}
217222
218223
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+
219234@Composable
220235private fun GoogleMapView (modifier : Modifier , viewModel : GalwayBusViewModel , stops : List <BusStop >) {
221236 val context = LocalContext .current
@@ -249,15 +264,33 @@ private fun GoogleMapView(modifier: Modifier, viewModel: GalwayBusViewModel, sto
249264 properties = mapProperties,
250265 uiSettings = uiSettings
251266 ) {
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+ }
259292 }
260- }
293+ )
261294 }
262295}
263296
0 commit comments