<lambda>null1package expo.modules.maps.googleMaps 2 3 import android.Manifest 4 import android.content.Context 5 import android.content.pm.PackageManager 6 import android.os.Looper 7 import androidx.core.app.ActivityCompat 8 import com.google.android.gms.location.* 9 import com.google.android.gms.maps.GoogleMap 10 import expo.modules.kotlin.viewevent.ViewEventCallback 11 import expo.modules.maps.records.CameraPositionRecord 12 import expo.modules.maps.records.LatLngRecord 13 import expo.modules.maps.records.PointOfInterestRecord 14 import expo.modules.maps.records.UserLocationRecord 15 16 class GoogleMapsCallbacks(private val map: GoogleMap, private val context: Context) { 17 private lateinit var locationProvider: FusedLocationProviderClient 18 private lateinit var locationChangeCallback: LocationCallback 19 private lateinit var locationRequest: LocationRequest 20 private var locationCallbackPriority: Int = LocationRequest.PRIORITY_NO_POWER 21 private var locationCallbackInterval: Long = 5000 22 private var onLocationButtonPress: ViewEventCallback<UserLocationRecord>? = null 23 24 fun setupOnMapLoaded(onMapLoaded: ViewEventCallback<Unit>) { 25 map.setOnMapLoadedCallback { 26 onMapLoaded(Unit) 27 } 28 } 29 30 fun setupOnMapPress(onMapPress: ViewEventCallback<LatLngRecord>) { 31 map.setOnMapClickListener { 32 onMapPress(LatLngRecord(it)) 33 } 34 } 35 36 fun setupOnLongPress(onLongPress: ViewEventCallback<LatLngRecord>) { 37 map.setOnMapLongClickListener { 38 onLongPress(LatLngRecord(it)) 39 } 40 } 41 42 fun setupOnRegionChange(onRegionChange: ViewEventCallback<CameraPositionRecord>) { 43 map.setOnCameraMoveListener { 44 onRegionChange(CameraPositionRecord(map.cameraPosition)) 45 } 46 } 47 48 fun setupOnRegionChangeStarted(onRegionChangeStarted: ViewEventCallback<CameraPositionRecord>) { 49 map.setOnCameraMoveStartedListener { 50 onRegionChangeStarted(CameraPositionRecord(map.cameraPosition)) 51 } 52 } 53 54 fun setupOnRegionChangeComplete( 55 onRegionChangeComplete: ViewEventCallback<CameraPositionRecord>, 56 clusters: GoogleMapsClusters 57 ) { 58 map.setOnCameraIdleListener { 59 clusters.onCameraIdle() 60 onRegionChangeComplete(CameraPositionRecord(map.cameraPosition)) 61 } 62 } 63 64 fun setupOnPoiClick(onPoiClick: ViewEventCallback<PointOfInterestRecord>) { 65 map.setOnPoiClickListener { 66 onPoiClick(PointOfInterestRecord(it)) 67 } 68 } 69 70 fun setupOnLocationButtonButtonPress(onLocationButtonPress: ViewEventCallback<UserLocationRecord>) { 71 this.onLocationButtonPress = onLocationButtonPress 72 } 73 74 fun setupOnLocationDotPress(onLocationDotPress: ViewEventCallback<UserLocationRecord>) { 75 map.setOnMyLocationClickListener { 76 onLocationDotPress(UserLocationRecord(it)) 77 } 78 } 79 80 private fun setupOnLocationChangeRequests() { 81 locationProvider.removeLocationUpdates(locationChangeCallback) 82 locationRequest = LocationRequest.create().apply { 83 priority = locationCallbackPriority 84 interval = locationCallbackInterval 85 } 86 if (ActivityCompat.checkSelfPermission( 87 context, 88 Manifest.permission.ACCESS_FINE_LOCATION 89 ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( 90 context, 91 Manifest.permission.ACCESS_COARSE_LOCATION 92 ) != PackageManager.PERMISSION_GRANTED 93 ) { 94 return 95 } 96 locationProvider.requestLocationUpdates( 97 locationRequest, 98 locationChangeCallback, 99 Looper.getMainLooper() 100 ) 101 /*On location button click listener is set here in order to get permission updates more often. 102 * In the future it should be called only when the permissions change */ 103 map.setOnMyLocationButtonClickListener { 104 locationProvider.lastLocation.addOnSuccessListener { location -> 105 onLocationButtonPress?.let { it(UserLocationRecord(location)) } 106 } 107 false 108 } 109 } 110 111 fun setupOnLocationChange(onLocationChange: ViewEventCallback<UserLocationRecord>) { 112 locationProvider = LocationServices.getFusedLocationProviderClient(context) 113 locationChangeCallback = object : LocationCallback() { 114 override fun onLocationResult(loactionResult: LocationResult?) { 115 loactionResult ?: return 116 for (location in loactionResult.locations) { 117 onLocationChange(UserLocationRecord(location)) 118 } 119 super.onLocationResult(loactionResult) 120 } 121 } 122 setupOnLocationChangeRequests() 123 } 124 125 fun setLocationCallbackPriority(locationCallbackPriority: Int) { 126 this.locationCallbackPriority = locationCallbackPriority 127 setupOnLocationChangeRequests() 128 } 129 130 fun setLocationCallbackInterval(locationCallbackInterval: Long) { 131 this.locationCallbackInterval = locationCallbackInterval 132 setupOnLocationChangeRequests() 133 } 134 135 fun removeLocationRequests() { 136 locationProvider.removeLocationUpdates(locationChangeCallback) 137 } 138 } 139