From f990aa7e03e2670d3e66e6389ae04db7e5e56e6e Mon Sep 17 00:00:00 2001 From: Aleksey Belousov Date: Mon, 28 Sep 2020 08:21:39 +0300 Subject: [PATCH] [iOS] fix flashing maneuvers on carplay https://jira.mail.ru/browse/MAPSME-14919 --- .../Maps/Classes/CarPlay/CarPlayRouter.swift | 31 ++++++++++++++++--- .../Maps/Classes/CarPlay/CarPlayService.swift | 2 +- .../ProxyObjects/Routing/MWMRoutingManager.h | 2 ++ .../ProxyObjects/Routing/MWMRoutingManager.mm | 10 ++++++ .../Contents.json | 17 +++------- 5 files changed, 43 insertions(+), 19 deletions(-) diff --git a/iphone/Maps/Classes/CarPlay/CarPlayRouter.swift b/iphone/Maps/Classes/CarPlay/CarPlayRouter.swift index 09f6361c1b..a4fed73953 100644 --- a/iphone/Maps/Classes/CarPlay/CarPlayRouter.swift +++ b/iphone/Maps/Classes/CarPlay/CarPlayRouter.swift @@ -211,24 +211,48 @@ extension CarPlayRouter { routeSession = template.startNavigationSession(for: trip) routeSession?.pauseTrip(for: .loading, description: nil) updateUpcomingManeuvers() + RoutingManager.routingManager.setOnNewTurnCallback { [weak self] in + self?.updateUpcomingManeuvers() + } } func cancelTrip() { routeSession?.cancelTrip() routeSession = nil completeRouteAndRemovePoints() + RoutingManager.routingManager.resetOnNewTurnCallback() } func finishTrip() { routeSession?.finishTrip() routeSession = nil completeRouteAndRemovePoints() + RoutingManager.routingManager.resetOnNewTurnCallback() } func updateUpcomingManeuvers() { let maneuvers = createUpcomingManeuvers() routeSession?.upcomingManeuvers = maneuvers } + + func updateEstimates() { + guard let routeSession = routeSession, + let routeInfo = RoutingManager.routingManager.routeInfo, + let primaryManeuver = routeSession.upcomingManeuvers.first, + let estimates = createEstimates(routeInfo) else { + return + } + routeSession.updateEstimates(estimates, for: primaryManeuver) + } + + private func createEstimates(_ routeInfo: RouteInfo) -> CPTravelEstimates? { + guard let distance = Double(routeInfo.distanceToTurn) else { + return nil + } + + let measurement = Measurement(value: distance, unit: routeInfo.turnUnits) + return CPTravelEstimates(distanceRemaining: measurement, timeRemaining: 0.0) + } private func createUpcomingManeuvers() -> [CPManeuver] { guard let routeInfo = RoutingManager.routingManager.routeInfo else { @@ -251,11 +275,7 @@ extension CarPlayRouter { primaryManeuver.symbolSet = CPImageSet(lightContentImage: symbol, darkContentImage: symbol) } - if let distance = Double(routeInfo.distanceToTurn) { - let measurement = Measurement(value: distance, - unit: routeInfo.turnUnits) - let estimates = CPTravelEstimates(distanceRemaining: measurement, - timeRemaining: 0.0) + if let estimates = createEstimates(routeInfo) { primaryManeuver.initialTravelEstimates = estimates } maneuvers.append(primaryManeuver) @@ -321,6 +341,7 @@ extension CarPlayRouter: RoutingManagerListener { listenerContainer.forEach({ $0.didUpdateRouteInfo(info, forTrip: trip) }) + updateUpcomingManeuvers() } } default: diff --git a/iphone/Maps/Classes/CarPlay/CarPlayService.swift b/iphone/Maps/Classes/CarPlay/CarPlayService.swift index 12523eef88..6ec49827ca 100644 --- a/iphone/Maps/Classes/CarPlay/CarPlayService.swift +++ b/iphone/Maps/Classes/CarPlay/CarPlayService.swift @@ -518,7 +518,7 @@ extension CarPlayService: CarPlayRouterListener { let template = rootMapTemplate else { return } - router.updateUpcomingManeuvers() + router.updateEstimates() if let estimates = createEstimates(routeInfo: routeInfo) { template.updateEstimates(estimates, for: trip) } diff --git a/iphone/Maps/Core/Framework/ProxyObjects/Routing/MWMRoutingManager.h b/iphone/Maps/Core/Framework/ProxyObjects/Routing/MWMRoutingManager.h index 1a41fe734c..e399e1adac 100644 --- a/iphone/Maps/Core/Framework/ProxyObjects/Routing/MWMRoutingManager.h +++ b/iphone/Maps/Core/Framework/ProxyObjects/Routing/MWMRoutingManager.h @@ -36,6 +36,8 @@ NS_SWIFT_NAME(RoutingManager) - (void)addRoutePoint:(MWMRoutePoint *)point NS_SWIFT_NAME(add(routePoint:)); - (void)buildRouteWithDidFailError:(NSError **)errorPtr __attribute__((swift_error(nonnull_error))) NS_SWIFT_NAME(buildRoute()); - (void)startRoute; +- (void)setOnNewTurnCallback:(MWMVoidBlock)callback; +- (void)resetOnNewTurnCallback; - (instancetype)init __attribute__((unavailable("call +routingManager instead"))); - (instancetype)copy __attribute__((unavailable("call +routingManager instead"))); diff --git a/iphone/Maps/Core/Framework/ProxyObjects/Routing/MWMRoutingManager.mm b/iphone/Maps/Core/Framework/ProxyObjects/Routing/MWMRoutingManager.mm index d5cd5b68ba..25970ae86b 100644 --- a/iphone/Maps/Core/Framework/ProxyObjects/Routing/MWMRoutingManager.mm +++ b/iphone/Maps/Core/Framework/ProxyObjects/Routing/MWMRoutingManager.mm @@ -198,6 +198,16 @@ } } +- (void)setOnNewTurnCallback:(MWMVoidBlock)callback { + self.rm.RoutingSession().SetOnNewTurnCallback([callback] { + callback(); + }); +} + +- (void)resetOnNewTurnCallback { + self.rm.RoutingSession().SetOnNewTurnCallback(nullptr); +} + #pragma mark - MWMFrameworkRouteBuilderObserver implementation - (void)processRouteBuilderEvent:(routing::RouterResultCode)code diff --git a/iphone/Maps/Images.xcassets/CarPlay/Maneuvers/Symbols/ic_cp_uturn_right_then.imageset/Contents.json b/iphone/Maps/Images.xcassets/CarPlay/Maneuvers/Symbols/ic_cp_uturn_right_then.imageset/Contents.json index 26a4e02e66..fce048b5f3 100644 --- a/iphone/Maps/Images.xcassets/CarPlay/Maneuvers/Symbols/ic_cp_uturn_right_then.imageset/Contents.json +++ b/iphone/Maps/Images.xcassets/CarPlay/Maneuvers/Symbols/ic_cp_uturn_right_then.imageset/Contents.json @@ -1,21 +1,12 @@ { "images" : [ { - "idiom" : "universal", "filename" : "ic_cp_uturn_right_then.pdf", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "idiom" : "universal" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +}