@@ -11,27 +11,24 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
1111import kotlinx.coroutines.tasks.await
1212import kotlinx.coroutines.withTimeout
1313import ru.mobileup.samples.core.error_handling.LocationNotAvailableException
14+ import kotlin.coroutines.cancellation.CancellationException
1415import kotlin.time.Duration
15- import kotlin.time.Duration.Companion.nanoseconds
1616
1717class AndroidLocationService (
1818 private val context : Context
1919) : LocationService {
2020
21- private companion object {
22- const val DEFAULT_TIMEOUT_SECONDS = 10
23- }
24-
25- override suspend fun getCurrentLocation (): GeoCoordinate {
21+ override suspend fun getCurrentLocation (timeout : Duration ): GeoCoordinate {
2622 return try {
2723 val fusedLocationProviderClient = LocationServices
2824 .getFusedLocationProviderClient(context)
29- getLocation(
30- client = fusedLocationProviderClient,
31- timeout = DEFAULT_TIMEOUT_SECONDS .nanoseconds
32- )
25+ getLocation(fusedLocationProviderClient, timeout)
26+ } catch (e: CancellationException ) {
27+ throw e
28+ } catch (e: LocationNotAvailableException ) {
29+ throw e
3330 } catch (e: Exception ) {
34- throw LocationNotAvailableException (e)
31+ throw LocationNotAvailableException (e, message = null )
3532 }
3633 }
3734
@@ -41,21 +38,19 @@ class AndroidLocationService(
4138 client : FusedLocationProviderClient ,
4239 timeout : Duration
4340 ): GeoCoordinate {
41+ val cancellationTokenSource = CancellationTokenSource ()
4442 return try {
4543 withTimeout(timeout) {
46- val cancellationTokenSource = CancellationTokenSource ()
4744 client
48- .getCurrentLocation(
49- PRIORITY_HIGH_ACCURACY ,
50- cancellationTokenSource.token
51- ).await(cancellationTokenSource)
45+ .getCurrentLocation(PRIORITY_HIGH_ACCURACY , cancellationTokenSource.token)
46+ .await(cancellationTokenSource)
5247 .let { location ->
53- GeoCoordinate (
54- lat = location.latitude,
55- lng = location.longitude
56- )
48+ GeoCoordinate (location.latitude, location.longitude)
5749 }
5850 }
51+ } catch (e: CancellationException ) {
52+ cancellationTokenSource.cancel()
53+ throw e
5954 } catch (_: Exception ) {
6055 getLastLocation(client)
6156 }
@@ -67,10 +62,7 @@ class AndroidLocationService(
6762 ): GeoCoordinate {
6863 val location: Location ? = client.lastLocation.await()
6964 return location?.let { location ->
70- GeoCoordinate (
71- lat = location.latitude,
72- lng = location.longitude
73- )
74- } ? : throw LocationNotAvailableException (message = " Last location is null" )
65+ GeoCoordinate (location.latitude, location.longitude)
66+ } ? : throw LocationNotAvailableException (cause = null , " Last location is null" )
7567 }
7668}
0 commit comments