Wesley Darnell
09/22/2023, 8:11 PMWesley Darnell
09/22/2023, 8:12 PMfun getUserLocation(MainActivity: ComponentActivity): LatLng {
var userLocation = LatLng(0.0, 0.0)
//get watch location
val location = LocationServices.getFusedLocationProviderClient(MainActivity)
//get current location
if (ActivityCompat.checkSelfPermission(
MainActivity,
Manifest.permission.ACCESS_FINE_LOCATION
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
MainActivity,
Manifest.permission.ACCESS_COARSE_LOCATION
) != PackageManager.PERMISSION_GRANTED
) {
getLocationPermissions(MainActivity)
}
location.getCurrentLocation(LocationRequest.PRIORITY_HIGH_ACCURACY, null).addOnSuccessListener {
Log.d("Location", "User Location: ${it.latitude}, ${it.longitude}")
userLocation = LatLng(it.latitude, it.longitude)
}.addOnFailureListener { e ->
Log.d("Location", "Failed to get current location: ${e.message}")
//Get last location
location.lastLocation.addOnSuccessListener {
if (it == null) {
Log.d("Location", "lastLocation: null")
}
else {
Log.d("Location", "Location: ${it.latitude}, ${it.longitude}")
userLocation = LatLng(it.latitude, it.longitude)
}
}.addOnFailureListener { e ->
Log.d("Location", "Failed to get lastLocation: ${e.message}")
}
}.addOnCompleteListener {
Log.d("Location", "User location task complete")
//Can't do this
return userLocation
}
//Wait for location task to end, then return userLocation
//TODO: ???
//Returns before task completion, which is expected
return userLocation
}
Jeff Lockhart
09/22/2023, 9:13 PMgetUserLocation()
a suspend fun
. Then you can use suspendCancellableCoroutine
(docs) to await the callback result:
suspend fun getUserLocation(MainActivity: ComponentActivity): LatLng {
...
return suspendCancellableCoroutine { continuation ->
location.getCurrentLocation(LocationRequest.PRIORITY_HIGH_ACCURACY, null).addOnSuccessListener {
...
continuation.resume(LatLng(it.latitude, it.longitude))
}.addOnFailureListener { e ->
continuation.resumeWithException(e)
}
}
}
Patrick Steiger
09/24/2023, 12:56 AMWesley Darnell
09/24/2023, 6:12 PMPatrick Steiger
09/24/2023, 6:16 PMlocation.getCurrentLocafion(..).await()
Wesley Darnell
09/24/2023, 6:27 PMWesley Darnell
09/24/2023, 6:27 PMPatrick Steiger
09/24/2023, 6:29 PMkotlinx-coroutines-play-services
, you can add it to Gradle alongisde kotlinx-coroutines-android
and kotlinx-coroutines-core
Patrick Steiger
09/24/2023, 6:32 PMWesley Darnell
09/24/2023, 7:09 PMimplementation 'com.google.android.gms:play-services-maps:18.1.0'
implementation 'com.google.maps.android:maps-compose:2.14.0'
implementation 'com.google.android.gms:play-services-base:18.2.0'
implementation 'com.google.android.gms:play-services-location:21.0.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.4'
Patrick Steiger
09/24/2023, 7:10 PMWesley Darnell
09/24/2023, 7:10 PM