Skip to content

Commit 2625143

Browse files
author
pisakov
committed
Добавил ILocationService
1 parent f5691ea commit 2625143

3 files changed

Lines changed: 142 additions & 42 deletions

File tree

location/lib-location/src/main/java/ru/surfstudio/android/location/DefaultLocationInteractor.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ import java.util.concurrent.TimeUnit
2424

2525
/**
2626
* Интерактор, содержащий методы для наиболее частых случаев использования. Для более гибкой настройки следует
27-
* использовать [LocationService].
27+
* использовать [ILocationService].
2828
*/
2929
class DefaultLocationInteractor(
3030
private val permissionManager: PermissionManager,
3131
private val screenEventDelegateManager: ScreenEventDelegateManager,
3232
private val activityProvider: ActivityProvider,
33-
private val locationService: LocationService
33+
private val locationService: ILocationService
3434
) {
3535

3636
private var lastCurrentLocation: Location? = null
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package ru.surfstudio.android.location
2+
3+
import android.location.Location
4+
import androidx.annotation.RequiresPermission
5+
import io.reactivex.*
6+
import io.reactivex.exceptions.CompositeException
7+
import ru.surfstudio.android.location.exceptions.NoLocationPermissionException
8+
import ru.surfstudio.android.location.exceptions.PlayServicesAreNotAvailableException
9+
import ru.surfstudio.android.location.exceptions.ResolutionFailedException
10+
import ru.surfstudio.android.location.location_errors_resolver.resolutions.impl.concrete.no_location_permission.NoLocationPermissionResolution
11+
import ru.surfstudio.android.location.location_errors_resolver.resolutions.impl.concrete.play_services_are_not_available.PlayServicesAreNotAvailableResolution
12+
import ru.surfstudio.android.location.location_errors_resolver.resolutions.impl.concrete.resolveble_api_exception.ResolvableApiExceptionResolution
13+
import ru.surfstudio.android.location.domain.LocationPriority
14+
import ru.surfstudio.android.location.location_errors_resolver.LocationErrorsResolver
15+
import ru.surfstudio.android.location.location_errors_resolver.resolutions.LocationErrorResolution
16+
17+
interface ILocationService {
18+
19+
/**
20+
* Проверить возможность получения местоположения.
21+
*
22+
* @param priority Приоритет при получении местоположения.
23+
*
24+
* @return [Completable]:
25+
* - onComplete() вызывается, если есть возможность получить местоположение;
26+
* - onError() вызывается, если нет возможности получить местоположение. Приходит [CompositeException], содержащий
27+
* список из возможных исключений: [NoLocationPermissionException], [PlayServicesAreNotAvailableException],
28+
* [ResolvableApiException].
29+
*/
30+
fun checkLocationAvailability(priority: LocationPriority): Completable
31+
32+
/**
33+
* Решить проблемы связанные с невозможностью получения местоположения.
34+
*
35+
* @param throwables [List], содержащий исключения связанные с невозможностью получения местоположения.
36+
* @param resolutions [Array], содержащий решения проблем связанных с невозможностью получения местоположения.
37+
* Доступные решения: [NoLocationPermissionResolution], [PlayServicesAreNotAvailableResolution],
38+
* [ResolvableApiExceptionResolution].
39+
*
40+
* @return [Single]:
41+
* - onSuccess() вызывается при удачном решении проблем. Содержит [List] из нерешенных исключений, для которых не
42+
* передавались решения;
43+
* - onError() вызывается в случае, если попытка решения проблем не удалась. Приходит [ResolutionFailedException].
44+
*/
45+
fun resolveLocationAvailability(
46+
throwables: List<Throwable>,
47+
vararg resolutions: LocationErrorResolution<*>,
48+
): Single<List<Throwable>> = LocationErrorsResolver.resolve(throwables, resolutions.toList())
49+
50+
/**
51+
* Запросить последнее известное местоположение.
52+
*
53+
* @return [Maybe]:
54+
* - onSuccess() вызывается в случае удачного получения местоположения;
55+
* - onComplete() вызывается в случае, если местоположение было получено, но равно null;
56+
* - onError() вызывается, если нет возможности получить местоположение. Приходит [CompositeException], содержащий
57+
* список из возможных исключений: [NoLocationPermissionException], [PlayServicesAreNotAvailableException],
58+
* [ResolvableApiException].
59+
*/
60+
@RequiresPermission(
61+
anyOf = ["android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"]
62+
)
63+
fun observeLastKnownLocation(): Maybe<Location>
64+
65+
/**
66+
* Подписаться на получение обновлений местоположения.
67+
*
68+
* @param intervalMillis Интервал в миллисекундах, при котором предпочтительно получать обновления местоположения.
69+
* Тем не менее, обновления местоположения могут быть чаще, чем этот интервал, если другое приложение получает
70+
* обновления с меньшим интервалом. Или, наоборот, реже (например, если у устройства нет возможности подключения).
71+
* @param fastestIntervalMillis Максимальный интервал в миллисекундах, при котором возможно обрабатывать обновления
72+
* местоположения. Следует устанавливать этот параметр, потому что другие приложения также влияют на скорость
73+
* отправки обновлений. Google Play Services отправляют обновления с максимальной скоростью, которую запросило любое
74+
* приложение. Если этот показатель быстрее, чем может обрабатывать приложение, можно столкнуться с соответствующими
75+
* проблемами.
76+
* @param priority Приоритет запроса (точность метостоположения/заряд батареи), который дает Google Play Services
77+
* знать, какие источники данных использовать.
78+
*
79+
* @return [Observable]:
80+
* - onNext() вызывается при очередном получении обновления местоположения;
81+
* - onComplete() никогда не вызывается;
82+
* - onError() вызывается, если нет возможности получить местоположение. Приходит [CompositeException], содержащий
83+
* список из возможных исключений: [NoLocationPermissionException], [PlayServicesAreNotAvailableException],
84+
* [ResolvableApiException].
85+
*/
86+
@RequiresPermission(
87+
anyOf = ["android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"]
88+
)
89+
fun observeLocationUpdates(
90+
intervalMillis: Long?,
91+
fastestIntervalMillis: Long?,
92+
priority: LocationPriority?,
93+
): Observable<Location>
94+
}

location/lib-location/src/main/java/ru/surfstudio/android/location/LocationService.kt

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@ import ru.surfstudio.android.location.location_errors_resolver.resolutions.impl.
3939
* Сервис для работы с местоположением.
4040
*/
4141
class LocationService(
42-
context: Context,
43-
private val fusedLocationClient: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(context)
44-
) {
42+
context: Context,
43+
private val fusedLocationClient: FusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(
44+
context
45+
)
46+
) : ILocationService {
4547

4648
private val locationAvailability = LocationAvailability(context)
4749

@@ -56,8 +58,8 @@ class LocationService(
5658
* список из возможных исключений: [NoLocationPermissionException], [PlayServicesAreNotAvailableException],
5759
* [ResolvableApiException].
5860
*/
59-
fun checkLocationAvailability(priority: LocationPriority): Completable =
60-
locationAvailability.checkLocationAvailability(priority)
61+
override fun checkLocationAvailability(priority: LocationPriority): Completable =
62+
locationAvailability.checkLocationAvailability(priority)
6163

6264
/**
6365
* Решить проблемы связанные с невозможностью получения местоположения.
@@ -72,9 +74,9 @@ class LocationService(
7274
* передавались решения;
7375
* - onError() вызывается в случае, если попытка решения проблем не удалась. Приходит [ResolutionFailedException].
7476
*/
75-
fun resolveLocationAvailability(
76-
throwables: List<Throwable>,
77-
vararg resolutions: LocationErrorResolution<*>
77+
override fun resolveLocationAvailability(
78+
throwables: List<Throwable>,
79+
vararg resolutions: LocationErrorResolution<*>
7880
): Single<List<Throwable>> = LocationErrorsResolver.resolve(throwables, resolutions.toList())
7981

8082
/**
@@ -88,21 +90,21 @@ class LocationService(
8890
* [ResolvableApiException].
8991
*/
9092
@RequiresPermission(
91-
anyOf = ["android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"]
93+
anyOf = ["android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"]
9294
)
93-
fun observeLastKnownLocation(): Maybe<Location> =
94-
Maybe.create<Location> { maybeEmitter ->
95-
fusedLocationClient
96-
.lastLocation
97-
.addOnSuccessListener { location ->
98-
if (location == null) {
99-
maybeEmitter.onComplete()
100-
} else {
101-
maybeEmitter.onSuccess(location)
102-
}
103-
}
104-
.addOnFailureListener { exception -> maybeEmitter.onError(exception) }
105-
}
95+
override fun observeLastKnownLocation(): Maybe<Location> =
96+
Maybe.create<Location> { maybeEmitter ->
97+
fusedLocationClient
98+
.lastLocation
99+
.addOnSuccessListener { location ->
100+
if (location == null) {
101+
maybeEmitter.onComplete()
102+
} else {
103+
maybeEmitter.onSuccess(location)
104+
}
105+
}
106+
.addOnFailureListener { exception -> maybeEmitter.onError(exception) }
107+
}
106108

107109
/**
108110
* Подписаться на получение обновлений местоположения.
@@ -126,30 +128,34 @@ class LocationService(
126128
* [ResolvableApiException].
127129
*/
128130
@RequiresPermission(
129-
anyOf = ["android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"]
131+
anyOf = ["android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"]
130132
)
131-
fun observeLocationUpdates(
132-
intervalMillis: Long?,
133-
fastestIntervalMillis: Long?,
134-
priority: LocationPriority?
133+
override fun observeLocationUpdates(
134+
intervalMillis: Long?,
135+
fastestIntervalMillis: Long?,
136+
priority: LocationPriority?
135137
): Observable<Location> {
136138
var locationCallback: LocationCallback? = null
137139
return Observable
138-
.create<Location> { observableEmitter ->
139-
val locationRequest =
140-
LocationUtil.createLocationRequest(intervalMillis, fastestIntervalMillis, priority)
141-
locationCallback = createLocationCallback(observableEmitter)
142-
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null)
143-
}
144-
.subscribeOn(AndroidSchedulers.mainThread())
145-
.doFinally { fusedLocationClient.removeLocationUpdates(locationCallback) }
140+
.create<Location> { observableEmitter ->
141+
val locationRequest =
142+
LocationUtil.createLocationRequest(
143+
intervalMillis,
144+
fastestIntervalMillis,
145+
priority
146+
)
147+
locationCallback = createLocationCallback(observableEmitter)
148+
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null)
149+
}
150+
.subscribeOn(AndroidSchedulers.mainThread())
151+
.doFinally { fusedLocationClient.removeLocationUpdates(locationCallback) }
146152
}
147153

148154
private fun createLocationCallback(observableEmitter: ObservableEmitter<Location>): LocationCallback =
149-
object : LocationCallback() {
150-
override fun onLocationResult(locationResult: LocationResult?) {
151-
val nonNullLastLocation = locationResult?.lastLocation ?: return
152-
observableEmitter.onNext(nonNullLastLocation)
153-
}
155+
object : LocationCallback() {
156+
override fun onLocationResult(locationResult: LocationResult?) {
157+
val nonNullLastLocation = locationResult?.lastLocation ?: return
158+
observableEmitter.onNext(nonNullLastLocation)
154159
}
160+
}
155161
}

0 commit comments

Comments
 (0)