@@ -48,6 +48,9 @@ public class NavViewManager extends SimpleViewManager<FrameLayout> {
4848
4949 private final HashMap <Integer , WeakReference <IMapViewFragment >> fragmentMap = new HashMap <>();
5050
51+ // Cache the latest options per view so deferred fragment creation uses fresh values.
52+ private final HashMap <Integer , ReadableMap > mapOptionsCache = new HashMap <>();
53+
5154 private ReactApplicationContext reactContext ;
5255
5356 public static synchronized NavViewManager getInstance (ReactApplicationContext reactContext ) {
@@ -74,21 +77,27 @@ private boolean isFragmentCreated(int viewId) {
7477
7578 /** Builds GoogleMapOptions with all configured map settings. */
7679 @ NonNull
77- private GoogleMapOptions buildGoogleMapOptions (ReadableMap mapInitializationOptions ) {
80+ private GoogleMapOptions buildGoogleMapOptions (ReadableMap mapOptionsMap ) {
7881 GoogleMapOptions options = new GoogleMapOptions ();
79- if (mapInitializationOptions == null ) {
82+ if (mapOptionsMap == null ) {
8083 return options ;
8184 }
8285
83- if (mapInitializationOptions .hasKey ("mapId" ) && !mapInitializationOptions .isNull ("mapId" )) {
84- String mapIdFromOptions = mapInitializationOptions .getString ("mapId" );
86+ if (mapOptionsMap .hasKey ("mapId" ) && !mapOptionsMap .isNull ("mapId" )) {
87+ String mapIdFromOptions = mapOptionsMap .getString ("mapId" );
8588 if (mapIdFromOptions != null && !mapIdFromOptions .isEmpty ()) {
8689 options .mapId (mapIdFromOptions );
8790 }
8891 }
8992
90- if (mapInitializationOptions .hasKey ("mapType" ) && !mapInitializationOptions .isNull ("mapType" )) {
91- options .mapType (mapInitializationOptions .getInt ("mapType" ));
93+ if (mapOptionsMap .hasKey ("mapType" ) && !mapOptionsMap .isNull ("mapType" )) {
94+ options .mapType (mapOptionsMap .getInt ("mapType" ));
95+ }
96+
97+ if (mapOptionsMap .hasKey ("mapColorScheme" )) {
98+ int jsValue =
99+ mapOptionsMap .isNull ("mapColorScheme" ) ? 0 : mapOptionsMap .getInt ("mapColorScheme" );
100+ options .mapColorScheme (EnumTranslationUtil .getMapColorSchemeFromJsValue (jsValue ));
92101 }
93102
94103 return options ;
@@ -151,6 +160,7 @@ public void onDropViewInstance(@NonNull FrameLayout view) {
151160 if (activity == null ) return ;
152161
153162 WeakReference <IMapViewFragment > weakReference = fragmentMap .remove (viewId );
163+ mapOptionsCache .remove (viewId );
154164 if (weakReference != null ) {
155165 IMapViewFragment fragment = weakReference .get ();
156166 if (fragment != null && fragment .isAdded ()) {
@@ -163,17 +173,17 @@ public void onDropViewInstance(@NonNull FrameLayout view) {
163173 }
164174 }
165175
166- @ ReactProp (name = "mapInitializationOptions" )
167- public void setMapInitializationOptions (
168- FrameLayout view , @ NonNull ReadableMap mapInitializationOptions ) {
176+ @ ReactProp (name = "mapOptions" )
177+ public void setMapOptions (FrameLayout view , @ NonNull ReadableMap mapOptions ) {
169178 int viewId = view .getId ();
179+ mapOptionsCache .put (viewId , mapOptions );
170180
171- // Don't create fragment if already exists
172181 if (isFragmentCreated (viewId )) {
182+ updateMapOptionValues (viewId , mapOptions );
173183 return ;
174184 }
175185
176- scheduleFragmentTransaction (view , mapInitializationOptions );
186+ scheduleFragmentTransaction (view , mapOptions );
177187 }
178188
179189 /** Map the "create" command to an integer */
@@ -317,7 +327,8 @@ public void receiveCommand(
317327 navFragment = getNavFragmentForRoot (root );
318328 if (navFragment != null ) {
319329 assert args != null ;
320- navFragment .setNightModeOption (args .getInt (0 ));
330+ int nightModeOverride = EnumTranslationUtil .getForceNightModeFromJsValue (args .getInt (0 ));
331+ navFragment .setNightModeOption (nightModeOverride );
321332 }
322333 break ;
323334 case SET_SPEEDOMETER_ENABLED :
@@ -590,42 +601,81 @@ public Map<String, Object> getExportedCustomDirectEventTypeConstants() {
590601 }
591602
592603 private void scheduleFragmentTransaction (
593- @ NonNull FrameLayout root , @ NonNull ReadableMap mapInitializationOptions ) {
604+ @ NonNull FrameLayout root , @ NonNull ReadableMap mapOptions ) {
594605
595606 // Commit the fragment transaction after view is added to the view hierarchy.
596607 root .post (
597608 () -> {
598- if (isFragmentCreated (root .getId ())) {
609+ int viewId = root .getId ();
610+ if (isFragmentCreated (viewId )) {
599611 return ;
600612 }
601- commitFragmentTransaction (root , mapInitializationOptions );
613+ ReadableMap latestOptions = mapOptionsCache .get (viewId );
614+ ReadableMap optionsToUse = latestOptions != null ? latestOptions : mapOptions ;
615+ commitFragmentTransaction (root , optionsToUse );
602616 });
603617 }
604618
619+ private void updateMapOptionValues (int viewId , @ NonNull ReadableMap mapOptions ) {
620+ IMapViewFragment fragment = getFragmentForViewId (viewId );
621+ if (fragment == null ) {
622+ return ;
623+ }
624+
625+ if (mapOptions .hasKey ("mapColorScheme" )) {
626+ int jsValue = mapOptions .isNull ("mapColorScheme" ) ? 0 : mapOptions .getInt ("mapColorScheme" );
627+ fragment .setMapColorScheme (EnumTranslationUtil .getMapColorSchemeFromJsValue (jsValue ));
628+ }
629+
630+ if (fragment instanceof INavViewFragment
631+ && mapOptions .hasKey ("navigationStylingOptions" )
632+ && !mapOptions .isNull ("navigationStylingOptions" )) {
633+ ReadableMap stylingMap = mapOptions .getMap ("navigationStylingOptions" );
634+ if (stylingMap != null ) {
635+ StylingOptions stylingOptions =
636+ new StylingOptionsBuilder .Builder (stylingMap .toHashMap ()).build ();
637+ ((INavViewFragment ) fragment ).setStylingOptions (stylingOptions );
638+ }
639+ }
640+
641+ if (fragment instanceof INavViewFragment && mapOptions .hasKey ("navigationNightMode" )) {
642+ int nightMode =
643+ mapOptions .isNull ("navigationNightMode" ) ? 0 : mapOptions .getInt ("navigationNightMode" );
644+ ((INavViewFragment ) fragment )
645+ .setNightModeOption (EnumTranslationUtil .getForceNightModeFromJsValue (nightMode ));
646+ }
647+ }
648+
605649 /** Replace your React Native view with a custom fragment */
606650 private void commitFragmentTransaction (
607- @ NonNull FrameLayout view , @ NonNull ReadableMap mapInitializationOptions ) {
651+ @ NonNull FrameLayout view , @ NonNull ReadableMap mapOptions ) {
608652
609653 FragmentActivity activity = (FragmentActivity ) reactContext .getCurrentActivity ();
610654 if (activity == null ) return ;
611655 int viewId = view .getId ();
612656 Fragment fragment ;
613657
614658 CustomTypes .MapViewType mapViewType =
615- EnumTranslationUtil .getMapViewTypeFromJsValue (
616- mapInitializationOptions .getInt ("mapViewType" ));
659+ EnumTranslationUtil .getMapViewTypeFromJsValue (mapOptions .getInt ("mapViewType" ));
617660
618- GoogleMapOptions googleMapOptions = buildGoogleMapOptions (mapInitializationOptions );
661+ GoogleMapOptions googleMapOptions = buildGoogleMapOptions (mapOptions );
619662
620663 if (mapViewType == CustomTypes .MapViewType .MAP ) {
621664 fragment = MapViewFragment .newInstance (reactContext , viewId , googleMapOptions );
622665 } else {
623666 NavViewFragment navFragment =
624667 NavViewFragment .newInstance (reactContext , viewId , googleMapOptions );
668+ Integer nightMode = null ;
669+ if (mapOptions .hasKey ("navigationNightMode" )) {
670+ int jsValue =
671+ mapOptions .isNull ("navigationNightMode" ) ? 0 : mapOptions .getInt ("navigationNightMode" );
672+ nightMode = EnumTranslationUtil .getForceNightModeFromJsValue (jsValue );
673+ navFragment .setNightModeOption (nightMode );
674+ }
625675
626- if (mapInitializationOptions .hasKey ("navigationStylingOptions" )
627- && !mapInitializationOptions .isNull ("navigationStylingOptions" )) {
628- ReadableMap stylingOptionsMap = mapInitializationOptions .getMap ("navigationStylingOptions" );
676+ if (mapOptions .hasKey ("navigationStylingOptions" )
677+ && !mapOptions .isNull ("navigationStylingOptions" )) {
678+ ReadableMap stylingOptionsMap = mapOptions .getMap ("navigationStylingOptions" );
629679 StylingOptions stylingOptions =
630680 new StylingOptionsBuilder .Builder (stylingOptionsMap .toHashMap ()).build ();
631681 navFragment .setStylingOptions (stylingOptions );
0 commit comments