-
Notifications
You must be signed in to change notification settings - Fork 24
/
ValhallaRouteManager.kt
107 lines (94 loc) · 3.91 KB
/
ValhallaRouteManager.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
package com.mapzen.erasermap.model
import android.content.Context
import com.mapzen.android.routing.MapzenRouter
import com.mapzen.erasermap.BuildConfig
import com.mapzen.model.ValhallaLocation
import com.mapzen.pelias.SimpleFeature
import com.mapzen.pelias.gson.Feature
import com.mapzen.valhalla.Route
import com.mapzen.valhalla.RouteCallback
import com.mapzen.valhalla.Router
import retrofit.RestAdapter
class ValhallaRouteManager(val settings: AppSettings,
val routerFactory: RouterFactory, val context: Context) : RouteManager {
override var apiKey: String = ""
override var origin: ValhallaLocation? = null
override var destination: Feature? = null
override var type: Router.Type = Router.Type.DRIVING
override var reverse: Boolean = false
override var route: Route? = null
override var bearing: Float? = null
override var currentRequest: RouteCallback? = null
override fun fetchRoute(callback: RouteCallback) {
currentRequest = callback
if (reverse) {
fetchReverseRoute(callback)
} else {
fetchForwardRoute(callback)
}
}
override fun toggleReverse() {
this.reverse = !reverse
}
private fun fetchForwardRoute(callback: RouteCallback) {
val location = origin
val simpleFeature = SimpleFeature.fromFeature(destination)
if (location is ValhallaLocation) {
val start: DoubleArray = doubleArrayOf(location.latitude, location.longitude)
val dest: DoubleArray = doubleArrayOf(simpleFeature.lat(), simpleFeature.lng())
val units: MapzenRouter.DistanceUnits = settings.distanceUnits
var name: String? = null
if (!simpleFeature.isAddress) {
name = simpleFeature.name()
}
val street = simpleFeature.name()
val city = simpleFeature.localAdmin()
val state = simpleFeature.region()
val router = getInitializedRouter(type)
if (location.hasBearing()) {
router.setLocation(start, location.bearing)
} else {
router.setLocation(start)
}
router.setLocation(dest, name, street, city, state)
.setDistanceUnits(units)
.setCallback(callback)
.fetch()
}
}
private fun fetchReverseRoute(callback: RouteCallback) {
val location = origin
val simpleFeature = SimpleFeature.fromFeature(destination)
if (location is ValhallaLocation) {
val start: DoubleArray = doubleArrayOf(simpleFeature.lat(), simpleFeature.lng())
val dest: DoubleArray = doubleArrayOf(location.latitude, location.longitude)
val units: MapzenRouter.DistanceUnits = settings.distanceUnits
getInitializedRouter(type)
.setLocation(start)
.setLocation(dest)
.setDistanceUnits(units)
.setCallback(callback)
.fetch()
}
}
private fun getInitializedRouter(type: Router.Type): MapzenRouter {
val endpoint = BuildConfig.ROUTE_BASE_URL ?: null
val logLevel = if (BuildConfig.DEBUG) RestAdapter.LogLevel.FULL else
RestAdapter.LogLevel.NONE
val httpHandler: ValhallaHttpHandler?
if (endpoint != null) {
httpHandler = ValhallaHttpHandler(endpoint, logLevel)
} else {
httpHandler = ValhallaHttpHandler(logLevel)
}
httpHandler.setApiKey(apiKey);
val router = routerFactory.getRouter(context)
router.router.setHttpHandler(httpHandler)
when(type) {
Router.Type.DRIVING -> return router.setDriving()
Router.Type.WALKING -> return router.setWalking()
Router.Type.BIKING -> return router.setBiking()
Router.Type.MULTIMODAL -> return router.setMultimodal()
}
}
}