diff --git a/README.md b/README.md index a126012..6b46706 100644 --- a/README.md +++ b/README.md @@ -204,7 +204,13 @@ try { avoidTolls: false, }; - await navigationController.setDestinations([waypoint], routingOptions); + const displayOptions: DisplayOptions = { + showDestinationMarkers: true, + showStopSigns: true, + showTrafficLights: true, + }; + + await navigationController.setDestinations([waypoint], routingOptions, displayOptions); await navigationController.startGuidance(); } catch (error) { console.error('Error starting navigation', error); diff --git a/android/src/main/java/com/google/android/react/navsdk/NavModule.java b/android/src/main/java/com/google/android/react/navsdk/NavModule.java index 783aaea..875b8f3 100644 --- a/android/src/main/java/com/google/android/react/navsdk/NavModule.java +++ b/android/src/main/java/com/google/android/react/navsdk/NavModule.java @@ -403,31 +403,20 @@ private void createWaypoint(Map map) { } @ReactMethod - public void setDestination(ReadableMap waypoint, @Nullable ReadableMap routingOptions) { - pendingRoute = null; // reset pendingRoute. - mWaypoints.clear(); // reset waypoints - createWaypoint(waypoint.toHashMap()); - - if (routingOptions != null) { - pendingRoute = - mNavigator.setDestination( - mWaypoints.get(0), - ObjectTranslationUtil.getRoutingOptionsFromMap(routingOptions.toHashMap())); - } else { - pendingRoute = mNavigator.setDestination(mWaypoints.get(0)); - } - - setOnResultListener( - new IRouteStatusResult() { - @Override - public void onResult(Navigator.RouteStatus code) { - sendCommandToReactNative("onRouteStatusResult", code.toString()); - } - }); + public void setDestination( + ReadableMap waypoint, + @Nullable ReadableMap routingOptions, + @Nullable ReadableMap displayOptions) { + WritableArray array = new WritableNativeArray(); + array.pushMap(waypoint); + setDestinations(array, routingOptions, displayOptions); } @ReactMethod - public void setDestinations(ReadableArray waypoints, @Nullable ReadableMap routingOptions) { + public void setDestinations( + ReadableArray waypoints, + @Nullable ReadableMap routingOptions, + @Nullable ReadableMap displayOptions) { if (mNavigator == null) { // TODO: HANDLE THIS return; @@ -443,10 +432,18 @@ public void setDestinations(ReadableArray waypoints, @Nullable ReadableMap routi } if (routingOptions != null) { - pendingRoute = - mNavigator.setDestinations( - mWaypoints, - ObjectTranslationUtil.getRoutingOptionsFromMap(routingOptions.toHashMap())); + if (displayOptions != null) { + pendingRoute = + mNavigator.setDestinations( + mWaypoints, + ObjectTranslationUtil.getRoutingOptionsFromMap(routingOptions.toHashMap()), + ObjectTranslationUtil.getDisplayOptionsFromMap(displayOptions.toHashMap())); + } else { + pendingRoute = + mNavigator.setDestinations( + mWaypoints, + ObjectTranslationUtil.getRoutingOptionsFromMap(routingOptions.toHashMap())); + } } else { pendingRoute = mNavigator.setDestinations(mWaypoints); } diff --git a/android/src/main/java/com/google/android/react/navsdk/ObjectTranslationUtil.java b/android/src/main/java/com/google/android/react/navsdk/ObjectTranslationUtil.java index fe46ee9..0c5bc8e 100644 --- a/android/src/main/java/com/google/android/react/navsdk/ObjectTranslationUtil.java +++ b/android/src/main/java/com/google/android/react/navsdk/ObjectTranslationUtil.java @@ -26,6 +26,7 @@ import com.google.android.gms.maps.model.Polyline; import com.google.android.libraries.mapsplatform.turnbyturn.model.StepInfo; import com.google.android.libraries.navigation.AlternateRoutesStrategy; +import com.google.android.libraries.navigation.DisplayOptions; import com.google.android.libraries.navigation.NavigationRoadStretchRenderingData; import com.google.android.libraries.navigation.RouteSegment; import com.google.android.libraries.navigation.RoutingOptions; @@ -105,6 +106,24 @@ public static WritableMap getMapFromStepInfo(StepInfo stepInfo) { return map; } + public static DisplayOptions getDisplayOptionsFromMap(Map map) { + DisplayOptions options = new DisplayOptions(); + + if (map.containsKey("showDestinationMarkers")) { + options.hideDestinationMarkers(!CollectionUtil.getBool("showDestinationMarkers", map, true)); + } + + if (map.containsKey("showStopSigns")) { + options.showStopSigns(CollectionUtil.getBool("showStopSigns", map, false)); + } + + if (map.containsKey("showTrafficLights")) { + options.showTrafficLights(CollectionUtil.getBool("showTrafficLights", map, false)); + } + + return options; + } + public static RoutingOptions getRoutingOptionsFromMap(Map map) { RoutingOptions options = new RoutingOptions(); diff --git a/example/src/controls/navigationControls.tsx b/example/src/controls/navigationControls.tsx index eac1288..aaf8060 100644 --- a/example/src/controls/navigationControls.tsx +++ b/example/src/controls/navigationControls.tsx @@ -32,6 +32,7 @@ import { type Waypoint, type CameraPosition, type NavigationController, + type DisplayOptions, } from '@googlemaps/react-native-navigation-sdk'; import SelectDropdown from 'react-native-select-dropdown'; @@ -103,7 +104,17 @@ const NavigationControls: React.FC = ({ avoidTolls: false, }; - navigationController.setDestination(waypoint, routingOptions); + const displayOptions: DisplayOptions = { + showDestinationMarkers: true, + showStopSigns: true, + showTrafficLights: true, + }; + + navigationController.setDestination( + waypoint, + routingOptions, + displayOptions + ); }; const initWaypointToCameraLocation = async () => { @@ -135,7 +146,17 @@ const NavigationControls: React.FC = ({ avoidTolls: false, }; - navigationController.setDestinations(waypoints, routingOptions); + const displayOptions: DisplayOptions = { + showDestinationMarkers: true, + showStopSigns: true, + showTrafficLights: true, + }; + + navigationController.setDestinations( + waypoints, + routingOptions, + displayOptions + ); }; const setFollowingPerspective = (index: CameraPerspective) => { diff --git a/ios/react-native-navigation-sdk/NavModule.m b/ios/react-native-navigation-sdk/NavModule.m index 04664b4..81b1d3e 100644 --- a/ios/react-native-navigation-sdk/NavModule.m +++ b/ios/react-native-navigation-sdk/NavModule.m @@ -325,16 +325,22 @@ - (void)showTermsAndConditionsDialog { RCT_EXPORT_METHOD(setDestination : (nonnull NSDictionary *)waypoint routingOptions - : (NSDictionary *)routingOptions resolve + : (NSDictionary *)routingOptions displayOptions + : (NSDictionary *)displayOptions resolve : (RCTPromiseResolveBlock)resolve rejecter : (RCTPromiseRejectBlock)reject) { NSArray *waypoints = @[ waypoint ]; - [self setDestinations:waypoints routingOptions:routingOptions resolve:resolve rejecter:reject]; + [self setDestinations:waypoints + routingOptions:routingOptions + displayOptions:displayOptions + resolve:resolve + rejecter:reject]; } RCT_EXPORT_METHOD(setDestinations : (nonnull NSArray *)waypoints routingOptions - : (NSDictionary *)routingOptions resolve + : (NSDictionary *)routingOptions displayOptions + : (NSDictionary *)displayOptions resolve : (RCTPromiseResolveBlock)resolve rejecter : (RCTPromiseRejectBlock)reject) { __weak typeof(self) weakSelf = self; @@ -350,6 +356,10 @@ - (void)showTermsAndConditionsDialog { return; } + if (displayOptions != NULL) { + [self setDisplayOptionsToViews:displayOptions]; + } + strongSelf->_destinations = [[NSMutableArray alloc] init]; for (NSDictionary *wp in waypoints) { @@ -400,6 +410,22 @@ - (void)showTermsAndConditionsDialog { }); } +- (void)setDisplayOptionsToViews:(NSDictionary *)options { + for (NavViewController *viewController in [NavViewModule sharedInstance] + .viewControllers.allValues) { + if (options[@"showDestinationMarkers"] != nil) { + [viewController + setShowDestinationMarkersEnabled:[options[@"showDestinationMarkers"] boolValue]]; + } + if (options[@"showStopSigns"] != nil) { + [viewController setShowStopSignsEnabled:[options[@"showStopSigns"] boolValue]]; + } + if (options[@"showTrafficLights"] != nil) { + [viewController setShowTrafficLightsEnabled:[options[@"showTrafficLights"] boolValue]]; + } + } +} + + (GMSNavigationRoutingOptions *)getRoutingOptions:(NSDictionary *)options { GMSNavigationMutableRoutingOptions *routingOptions = [[GMSNavigationMutableRoutingOptions alloc] initWithRoutingStrategy:(GMSNavigationRoutingStrategy)[options[@"routingStrategy"] intValue]]; diff --git a/ios/react-native-navigation-sdk/NavViewController.h b/ios/react-native-navigation-sdk/NavViewController.h index e72c54e..bac0a24 100644 --- a/ios/react-native-navigation-sdk/NavViewController.h +++ b/ios/react-native-navigation-sdk/NavViewController.h @@ -51,6 +51,9 @@ typedef void (^OnArrayResult)(NSArray *_Nullable result); - (void)setCompassEnabled:(BOOL)isEnabled; - (void)setMyLocationButtonEnabled:(BOOL)isEnabled; - (void)setMyLocationEnabled:(BOOL)isEnabled; +- (void)setShowDestinationMarkersEnabled:(BOOL)isEnabled; +- (void)setShowTrafficLightsEnabled:(BOOL)isEnabled; +- (void)setShowStopSignsEnabled:(BOOL)isEnabled; - (void)setRotateGesturesEnabled:(BOOL)isEnabled; - (void)setScrollGesturesEnabled:(BOOL)isEnabled; - (void)setScrollGesturesEnabledDuringRotateOrZoom:(BOOL)isEnabled; diff --git a/ios/react-native-navigation-sdk/NavViewController.m b/ios/react-native-navigation-sdk/NavViewController.m index 2af7d5a..2eea3b8 100644 --- a/ios/react-native-navigation-sdk/NavViewController.m +++ b/ios/react-native-navigation-sdk/NavViewController.m @@ -251,6 +251,18 @@ - (void)setMyLocationButtonEnabled:(BOOL)isEnabled { [_mapView.settings setMyLocationButton:isEnabled]; } +- (void)setShowDestinationMarkersEnabled:(BOOL)isEnabled { + [_mapView.settings setShowsDestinationMarkers:isEnabled]; +} + +- (void)setShowTrafficLightsEnabled:(BOOL)isEnabled { + [_mapView.settings setShowsTrafficLights:isEnabled]; +} + +- (void)setShowStopSignsEnabled:(BOOL)isEnabled { + [_mapView.settings setShowsStopSigns:isEnabled]; +} + - (void)setMyLocationEnabled:(BOOL)isEnabled { _mapView.myLocationEnabled = isEnabled; } diff --git a/src/navigation/navigation/types.ts b/src/navigation/navigation/types.ts index 088b801..bf6028b 100644 --- a/src/navigation/navigation/types.ts +++ b/src/navigation/navigation/types.ts @@ -61,6 +61,28 @@ export interface RoutingOptions { */ avoidHighways?: boolean; } + +/** + * Defines the options used by the Navigator for dislaying different elements. + */ +export interface DisplayOptions { + /** + * Configures whether destination markers are shown during navigation. + * If true, destination markers are shown. + */ + showDestinationMarkers?: boolean; + /** + * Configures whether stop signs are shown during navigation. + * If true, stop signs are shown. + */ + showStopSigns?: boolean; + /** + * Configures whether traffic lights are shown during navigation. + * If true, traffic lights are shown. + */ + showTrafficLights?: boolean; +} + /** * Defines triggering thresholds for different severity levels of speed alerts, represented by * SpeedAlertSeverity. @@ -292,7 +314,8 @@ export interface NavigationController { */ setDestination( waypoint: Waypoint, - routingOptions?: RoutingOptions + routingOptions?: RoutingOptions, + displayOptions?: DisplayOptions ): Promise; /** @@ -303,7 +326,8 @@ export interface NavigationController { */ setDestinations( waypoints: Waypoint[], - routingOptions?: RoutingOptions + routingOptions?: RoutingOptions, + displayOptions?: DisplayOptions ): Promise; /** diff --git a/src/navigation/navigation/useNavigationController.ts b/src/navigation/navigation/useNavigationController.ts index 331f632..17df257 100644 --- a/src/navigation/navigation/useNavigationController.ts +++ b/src/navigation/navigation/useNavigationController.ts @@ -30,6 +30,7 @@ import { type SpeedAlertOptions, type LocationSimulationOptions, TaskRemovedBehavior, + type DisplayOptions, } from './types'; import { getRouteStatusFromStringValue } from '../navigationView'; import { useMemo } from 'react'; @@ -93,16 +94,26 @@ export const useNavigationController = ( setDestination: async ( waypoint: Waypoint, - routingOptions?: RoutingOptions + routingOptions?: RoutingOptions, + displayOptions?: DisplayOptions ) => { - return await NavModule.setDestination(waypoint, routingOptions); + return await NavModule.setDestination( + waypoint, + routingOptions, + displayOptions + ); }, setDestinations: async ( waypoints: Waypoint[], - routingOptions?: RoutingOptions + routingOptions?: RoutingOptions, + displayOptions?: DisplayOptions ) => { - return await NavModule.setDestinations(waypoints, routingOptions); + return await NavModule.setDestinations( + waypoints, + routingOptions, + displayOptions + ); }, continueToNextDestination: async () => {