```fun updateMap(map: GoogleMap?, markers: ArrayLi...
# compose
m
Copy code
fun updateMap(map: GoogleMap?, markers: ArrayList<Marker>, selectedLocation: Int) {
    if (map != null) {
        Log.i("MapView", "setting new zoom location")
        if (selectedLocation < markers.size) {
            val marker = markers[selectedLocation]
            marker.showInfoWindow()
            map.animateCamera(CameraUpdateFactory.newLatLngZoom(marker.position, 14.0f))
        }
    }
}

@Composable
fun MapPageView(
    locations: ArrayList<Location>,
    selectedLocation: Int,
    children: @Composable() () -> Unit = emptyContent()
) {
    val ctx = ContextAmbient.current
    var mapState: MutableState<GoogleMap?> = state { null }
    var markerState: MutableState<ArrayList<Marker>> = state { ArrayList<Marker>() }

    if (selectedLocation < locations.size) {
        updateMap(mapState.value, markerState.value, selectedLocation)
    }

    Box(modifier = Modifier.fillMaxSize(),
        gravity = Alignment.TopCenter) {
        Stack {
            Box(gravity = Alignment.TopCenter, modifier = Modifier.fillMaxWidth().height(240.dp)) {
                AndroidView(resId = R.layout.map_fragment ) { view ->
                    val fragment = (view.context as AppCompatActivity).supportFragmentManager.findFragmentById(R.id.map)
                    (fragment as SupportMapFragment).getMapAsync {
                        // reference
                        mapState.value = it
                        it.setOnMarkerClickListener { marker ->
                            Log.i("MapView", "got a marker tapped ${marker}")
                            if (marker.isInfoWindowShown) {
                                marker.hideInfoWindow()
                            } else {
                                marker.showInfoWindow()
                            }
                            true
                        }
                        Log.i("MapView", "Setup Map")

                        // markers
                        var index = 0
                        for (location in locations) {
                            val options = location.annotation()
                            val marker = it.addMarker(options)
                            if (selectedLocation == index) {
                                it.moveCamera(CameraUpdateFactory.newLatLngZoom(marker.position, 14.0f))
                                marker.showInfoWindow()
                            }
                            markerState.value.add(marker)
                            index += 1
                        }

                        // settings
                        it.uiSettings.isMyLocationButtonEnabled = true
                        it.mapType = MAP_TYPE_NORMAL

                        if (ActivityCompat.checkSelfPermission(
                                ctx,
                                Manifest.permission.ACCESS_FINE_LOCATION
                            ) == PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(
                                ctx,
                                Manifest.permission.ACCESS_COARSE_LOCATION
                            ) == PackageManager.PERMISSION_GRANTED
                        ) {

                        }
                    }
                }
            }
            Box(
                paddingTop = 200.dp
            ) {
                Box(shape = RoundedCornerShape(
                    topLeft = Styles.cornerRadius.dp,
                    topRight = Styles.cornerRadius.dp
                ),
                    modifier = Modifier.fillMaxSize(),
                    gravity = Alignment.Center,
                    backgroundColor = ivoryColor,
                    paddingTop = 20.dp,
                    paddingBottom = 20.dp,
                    paddingStart = 20.dp,
                    paddingEnd = 20.dp) {
                    children()
                }
            }
        }
    }
}