-
Notifications
You must be signed in to change notification settings - Fork 24
/
MapzenLocationImpl.kt
134 lines (116 loc) · 4.69 KB
/
MapzenLocationImpl.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package com.mapzen.erasermap.model
import android.content.Context
import android.graphics.PointF
import android.location.Location
import android.util.Log
import android.view.WindowManager
import com.mapzen.android.graphics.MapzenMap
import com.mapzen.android.lost.api.LocationRequest
import com.mapzen.android.lost.api.LocationServices
import com.mapzen.android.lost.api.LostApiClient
import com.mapzen.erasermap.BuildConfig
import com.mapzen.erasermap.EraserMapApplication
import com.mapzen.erasermap.model.event.LocationChangeEvent
import com.mapzen.pelias.BoundingBox
import com.squareup.otto.Bus
public class MapzenLocationImpl(val locationClient: LostApiClient,
val settings: AppSettings,
val bus: Bus,
val application: EraserMapApplication,
val permissionManager: PermissionManager) : MapzenLocation {
companion object {
private val LOCATION_UPDATE_INTERVAL_IN_MS: Long = 1000L
private val LOCATION_UPDATE_SMALLEST_DISPLACEMENT: Float = 3f
}
init {
bus.register(this)
}
override var mapzenMap: MapzenMap? = null
private var previousLocation: Location? = null
private fun connect() {
if (!locationClient.isConnected) {
locationClient.connect()
}
if (settings.isMockLocationEnabled) {
LocationServices.FusedLocationApi?.setMockMode(true)
LocationServices.FusedLocationApi?.setMockLocation(settings.mockLocation)
}
if (settings.isMockRouteEnabled) {
LocationServices.FusedLocationApi?.setMockTrace(settings.mockRoute)
}
}
private fun disconnect() {
locationClient.disconnect()
}
override fun getLastLocation(): Location? {
if (!permissionManager.permissionsGranted()) {
return null
}
connect()
return LocationServices.FusedLocationApi?.lastLocation
}
override fun startLocationUpdates() {
if (!permissionManager.permissionsGranted()) {
return
}
connect()
val locationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(LOCATION_UPDATE_INTERVAL_IN_MS)
.setFastestInterval(LOCATION_UPDATE_INTERVAL_IN_MS)
.setSmallestDisplacement(LOCATION_UPDATE_SMALLEST_DISPLACEMENT)
LocationServices.FusedLocationApi?.requestLocationUpdates(locationRequest) {
location -> onLocationUpdate(location)
}
}
fun onLocationUpdate(location: Location) {
val previous = previousLocation
val displacement = if (previous != null) previous.distanceTo(location) else Float.MAX_VALUE
if (displacement > LOCATION_UPDATE_SMALLEST_DISPLACEMENT) {
if (BuildConfig.DEBUG) {
Log.d("MapzenLocation", "onLocationChanged: " + location)
}
bus.post(LocationChangeEvent(location))
} else {
if (BuildConfig.DEBUG) {
Log.d("MapzenLocation", "no significant change")
}
}
previousLocation = location
}
override fun stopLocationUpdates() {
disconnect()
}
override fun getLat(): Double {
val windowManager = application.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val display = windowManager.defaultDisplay
val midLatLon = mapzenMap?.screenPositionToLngLat(PointF(display.width.toFloat() / 2,
display.height.toFloat() / 2))
if (midLatLon?.latitude == null) {
return 0.0
}
return midLatLon?.latitude as Double
}
override fun getLon(): Double {
val windowManager = application.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val display = windowManager.defaultDisplay
val midLatLon = mapzenMap?.screenPositionToLngLat(PointF(display.width.toFloat()/2,
display.height.toFloat()/2))
if (midLatLon?.longitude == null) {
return 0.0
}
return midLatLon?.longitude as Double
}
override fun getBoundingBox(): BoundingBox? {
val windowManager = application.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val display = windowManager.defaultDisplay
val minLatLon = mapzenMap?.screenPositionToLngLat(PointF(0.0f, display.height.toFloat()))
val maxLatLon = mapzenMap?.screenPositionToLngLat(PointF(display.width.toFloat(), 0.0f))
val boundingBox: BoundingBox = BoundingBox(
minLatLon?.latitude as Double,
minLatLon?.longitude as Double,
maxLatLon?.latitude as Double,
maxLatLon?.longitude as Double)
return boundingBox
}
}