@@ -193,28 +193,32 @@ private synchronized boolean updateDataSource(
193193 DataSource existingDataSource = currentDataSource .get ();
194194 boolean isFDv2ModeSwitch = false ;
195195
196- // FDv2 path: resolve mode and determine if a teardown/rebuild is needed.
197- if (useFDv2ModeResolution && !mustReinitializeDataSource ) {
196+ // FDv2 path: resolve mode for both startup (mustReinitializeDataSource=true) and
197+ // state-change (mustReinitializeDataSource=false) cases.
198+ if (useFDv2ModeResolution ) {
198199 ConnectionMode newMode = resolveMode ();
199- if (newMode == currentFDv2Mode ) {
200- onCompletion .onSuccess (null );
201- return false ;
202- }
203- // CSFDV2 5.3.8: retain active data source if old and new modes have equivalent config.
204- // ModeDefinition currently relies on Object.equals (reference equality) because
205- // makeDefaultModeTable() reuses the same instance for modes that share identical
206- // configuration.
207- FDv2DataSourceBuilder fdv2Builder = (FDv2DataSourceBuilder ) dataSourceFactory ;
208- ModeDefinition oldDef = fdv2Builder .getModeDefinition (currentFDv2Mode );
209- ModeDefinition newDef = fdv2Builder .getModeDefinition (newMode );
210- if (oldDef != null && oldDef .equals (newDef )) {
211- currentFDv2Mode = newMode ;
212- onCompletion .onSuccess (null );
213- return false ;
200+ if (!mustReinitializeDataSource ) {
201+ // State-change path: check for no-op or equivalent config before rebuilding.
202+ if (newMode == currentFDv2Mode ) {
203+ onCompletion .onSuccess (null );
204+ return false ;
205+ }
206+ // CSFDV2 5.3.8: retain active data source if old and new modes have equivalent config.
207+ // ModeDefinition currently relies on Object.equals (reference equality) because
208+ // makeDefaultModeTable() reuses the same instance for modes that share identical
209+ // configuration.
210+ FDv2DataSourceBuilder fdv2Builder = (FDv2DataSourceBuilder ) dataSourceFactory ;
211+ ModeDefinition oldDef = fdv2Builder .getModeDefinition (currentFDv2Mode );
212+ ModeDefinition newDef = fdv2Builder .getModeDefinition (newMode );
213+ if (oldDef != null && oldDef .equals (newDef )) {
214+ currentFDv2Mode = newMode ;
215+ onCompletion .onSuccess (null );
216+ return false ;
217+ }
218+ isFDv2ModeSwitch = true ;
219+ mustReinitializeDataSource = true ;
214220 }
215221 currentFDv2Mode = newMode ;
216- isFDv2ModeSwitch = true ;
217- mustReinitializeDataSource = true ;
218222 }
219223
220224 // Check whether the existing data source needs a rebuild (e.g. evaluation context changed).
@@ -444,11 +448,6 @@ synchronized boolean startUp(@NonNull Callback<Void> onCompletion) {
444448 }
445449 initialized = false ;
446450
447- if (useFDv2ModeResolution ) {
448- currentFDv2Mode = resolveMode ();
449- ((FDv2DataSourceBuilder ) dataSourceFactory ).setActiveMode (currentFDv2Mode , true );
450- }
451-
452451 updateEventProcessor (forcedOffline .get (), platformState .isNetworkAvailable (), platformState .isForeground ());
453452 return updateDataSource (true , onCompletion );
454453 }
0 commit comments