11import MapboxNavigationNative
22import MapboxDirections
33@_implementationOnly import MapboxCommon_Private
4+ @_implementationOnly import MapboxNavigationNative_Private
5+
6+ enum RouteChangeReason {
7+ /// Clean a route.
8+ case cleanUp
9+
10+ /// Set a new route, use by default.
11+ case startNewRoute
12+
13+ /// Route index changed to an alternative.
14+ case switchToAlternative
15+
16+ /// New route from different starting point to previous destinations.
17+ case reroute
18+
19+ /// Recreate Navigator after losing internet connection.
20+ case fallbackToOffline
21+
22+ /// Recreate Navigator after restoring internet connection.
23+ case restoreToOnline
24+
25+ /// Navigator used offline route and new route is available from the server.
26+ case switchToOnline
27+
28+ /// Fastest Route available (and should be switched),
29+ case fastestRouteAvailable
30+ }
431
532protocol CoreNavigator {
633 static var shared : Self { get }
@@ -22,6 +49,7 @@ protocol CoreNavigator {
2249 func setRoutes( _ routesData: RoutesData ,
2350 uuid: UUID ,
2451 legIndex: UInt32 ,
52+ reason: RouteChangeReason ,
2553 completion: @escaping ( Result < RoutesCoordinator . RoutesResult , Error > ) -> Void )
2654 func setAlternativeRoutes( with routes: [ RouteInterface ] ,
2755 completion: @escaping ( Result < [ RouteAlternative ] , Error > ) -> Void )
@@ -30,6 +58,10 @@ protocol CoreNavigator {
3058
3159 func updateLocation( _ location: CLLocation , completion: @escaping ( Bool ) -> Void )
3260
61+ func makeTelemetry( eventsMetadataProvider: EventsMetadataInterface ) -> Telemetry
62+
63+ func makeEventsMetadataProvider( ) -> EventsMetadataProvider
64+
3365 func resume( )
3466 func pause( )
3567}
@@ -62,14 +94,13 @@ final class Navigator: CoreNavigator {
6294 }
6395
6496 private lazy var routeCoordinator : RoutesCoordinator = {
65- . init( routesSetupHandler: { [ weak self] routesData, legIndex, completion in
97+ . init( routesSetupHandler: { [ weak self] routesData, legIndex, reason , completion in
6698
6799 let dataParams = routesData. map { SetRoutesDataParams ( routes: $0,
68100 legIndex: legIndex) }
69-
70- let reason : SetRoutesReason = routesData != nil ? . newRoute : . cleanUp
101+
71102 self ? . navigator. setRoutesDataFor ( dataParams,
72- reason: reason) { [ weak self] result in
103+ reason: reason. navNativeValue ) { [ weak self] result in
73104 if result. isValue ( ) ,
74105 let routesResult = result. value {
75106 Log . info ( " Navigator has been updated, including \( routesResult. alternatives. count) alternatives. " , category: . navigation)
@@ -146,10 +177,12 @@ final class Navigator: CoreNavigator {
146177 cacheHandle = factory. cacheHandle
147178 roadGraph = factory. roadGraph
148179 navigator = factory. navigator
180+
149181 roadObjectStore = RoadObjectStore ( navigator. roadObjectStore ( ) )
150182 roadObjectMatcher = RoadObjectMatcher ( MapboxNavigationNative . RoadObjectMatcher ( cache: cacheHandle) )
151183 rerouteController = RerouteController ( navigator, config: NativeHandlersFactory . configHandle ( ) )
152-
184+ eventAppState = EventAppState ( )
185+
153186 subscribeNavigator ( )
154187 setupAlternativesControllerIfNeeded ( )
155188 }
@@ -174,14 +207,22 @@ final class Navigator: CoreNavigator {
174207 cacheHandle = factory. cacheHandle
175208 roadGraph = factory. roadGraph
176209 navigator = factory. navigator
177-
210+
178211 roadObjectStore. native = navigator. roadObjectStore ( )
179212 roadObjectMatcher. native = MapboxNavigationNative . RoadObjectMatcher ( cache: cacheHandle)
180213 rerouteController = RerouteController ( navigator, config: NativeHandlersFactory . configHandle ( ) )
181214
182215 subscribeNavigator ( )
183216 setupAlternativesControllerIfNeeded ( )
184217 }
218+
219+ func makeTelemetry( eventsMetadataProvider: EventsMetadataInterface ) -> Telemetry {
220+ navigator. getTelemetryForEventsMetadataProvider ( eventsMetadataProvider)
221+ }
222+
223+ func makeEventsMetadataProvider( ) -> EventsMetadataProvider {
224+ EventsMetadataProvider ( appState: eventAppState)
225+ }
185226
186227 private weak var navigatorStatusObserver : NavigatorStatusObserver ?
187228 private weak var navigatorFallbackVersionsObserver : NavigatorFallbackVersionsObserver ?
@@ -257,6 +298,8 @@ final class Navigator: CoreNavigator {
257298 private( set) var roadObjectMatcher : RoadObjectMatcher
258299
259300 private var isSubscribedToElectronicHorizon = false
301+
302+ private var eventAppState : EventAppState
260303
261304 private var electronicHorizonOptions : ElectronicHorizonOptions ? {
262305 didSet {
@@ -282,8 +325,16 @@ final class Navigator: CoreNavigator {
282325
283326 // MARK: - Navigator Updates
284327
285- func setRoutes( _ routesData: RoutesData , uuid: UUID , legIndex: UInt32 , completion: @escaping ( Result < RoutesCoordinator . RoutesResult , Error > ) -> Void ) {
286- routeCoordinator. beginActiveNavigation ( with: routesData, uuid: uuid, legIndex: legIndex, completion: completion)
328+ func setRoutes( _ routesData: RoutesData ,
329+ uuid: UUID ,
330+ legIndex: UInt32 ,
331+ reason: RouteChangeReason ,
332+ completion: @escaping ( Result < RoutesCoordinator . RoutesResult , Error > ) -> Void ) {
333+ routeCoordinator. beginActiveNavigation ( with: routesData,
334+ uuid: uuid,
335+ legIndex: legIndex,
336+ reason: reason,
337+ completion: completion)
287338 }
288339
289340 func setAlternativeRoutes( with routes: [ RouteInterface ] , completion: @escaping ( Result < [ RouteAlternative ] , Error > ) -> Void ) {
@@ -459,3 +510,26 @@ enum NavigatorError: Swift.Error {
459510 case failedToUpdateRoutes( reason: String )
460511 case failedToUpdateAlternativeRoutes( reason: String )
461512}
513+
514+ extension RouteChangeReason {
515+ var navNativeValue : SetRoutesReason {
516+ switch self {
517+ case . cleanUp:
518+ return . cleanUp
519+ case . startNewRoute:
520+ return . newRoute
521+ case . switchToAlternative:
522+ return . alternative
523+ case . reroute:
524+ return . reroute
525+ case . fallbackToOffline:
526+ return . fallbackToOffline
527+ case . restoreToOnline:
528+ return . restoreToOnline
529+ case . switchToOnline:
530+ return . switchToOnline
531+ case . fastestRouteAvailable:
532+ return . fastestRoute
533+ }
534+ }
535+ }
0 commit comments