RoboSwag/google-map/src/main/java/ru/touchin/googlemap/GoogleMapManager.kt

123 lines
4.2 KiB
Kotlin

package ru.touchin.googlemap
import android.os.Bundle
import androidx.annotation.RequiresPermission
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.MapView
import com.google.android.gms.maps.model.CameraPosition
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.LatLngBounds
import ru.touchin.basemap.AbstractMapManager
@Suppress("detekt.TooManyFunctions")
class GoogleMapManager(mapView: MapView) : AbstractMapManager<MapView, GoogleMap, LatLng>(mapView) {
override fun initialize(mapListener: AbstractMapListener<MapView, GoogleMap, LatLng>?) {
super.initialize(mapListener)
mapView.getMapAsync(::initMap)
}
override fun initMap(map: GoogleMap) {
super.initMap(map)
with(map) {
setOnMapLoadedCallback { mapListener?.onMapLoaded() }
setOnCameraMoveStartedListener { mapListener?.onCameraMoved(true) }
setOnCameraMoveListener { mapListener?.onCameraMoved(true) }
setOnMapClickListener { location -> mapListener?.onMapTap(location) }
setOnMapLongClickListener { location -> mapListener?.onMapLongTap(location) }
}
}
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
mapView.onCreate(savedInstanceState)
}
override fun onDestroy() {
super.onDestroy()
mapView.onDestroy()
}
override fun onStart() {
super.onStart()
mapView.onStart()
}
override fun onStop() {
super.onStop()
mapView.onStop()
}
override fun onResume() {
super.onResume()
mapView.onResume()
}
override fun onPause() {
super.onPause()
mapView.onPause()
}
override fun onLowMemory() {
super.onLowMemory()
mapView.onLowMemory()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
mapView.onSaveInstanceState(outState)
}
override fun getCameraTarget(): LatLng = map.cameraPosition.target
override fun getCameraZoom(): Float = map.cameraPosition.zoom
override fun getCameraAzimuth(): Float = map.cameraPosition.bearing
override fun getCameraTilt(): Float = map.cameraPosition.tilt
override fun moveCamera(target: LatLng, zoom: Float, azimuth: Float, tilt: Float) {
map.moveCamera(CameraUpdateFactory.newCameraPosition(buildCameraPosition(target, zoom, azimuth, tilt)))
}
override fun smoothMoveCamera(target: LatLng, zoom: Float, azimuth: Float, tilt: Float) {
map.animateCamera(CameraUpdateFactory.newCameraPosition(buildCameraPosition(target, zoom, azimuth, tilt)))
}
override fun smoothMoveCamera(targets: List<LatLng>, padding: Int) {
val boundingBox = getBoundingBox(targets)
map.animateCamera(CameraUpdateFactory.newLatLngBounds(boundingBox, padding))
}
override fun smoothMoveCamera(targets: List<LatLng>, width: Int, height: Int, padding: Int) {
val boundingBox = getBoundingBox(targets)
map.animateCamera(CameraUpdateFactory.newLatLngBounds(boundingBox, width, height, padding))
}
override fun setMapAllGesturesEnabled(enabled: Boolean) = map.uiSettings.setAllGesturesEnabled(enabled)
@RequiresPermission(anyOf = ["android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"])
override fun setMyLocationEnabled(enabled: Boolean) {
map.isMyLocationEnabled = enabled
}
override fun isLocationInVisibleRegion(location: LatLng): Boolean = map.projection.visibleRegion.latLngBounds.contains(location)
private fun getBoundingBox(targets: List<LatLng>) = LatLngBounds.builder()
.also { builder ->
targets.forEach { target -> builder.include(target) }
}
.build()
private fun buildCameraPosition(target: LatLng, zoom: Float, azimuth: Float, tilt: Float) = CameraPosition.Builder()
.target(target)
.zoom(zoom)
.bearing(azimuth)
.tilt(tilt)
.build()
interface MapListener : AbstractMapListener<MapView, GoogleMap, LatLng>
}