<lambda>null1 package 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