2626import com .iterable .iterableapi .IterableApi ;
2727import com .iterable .iterableapi .IterableAttributionInfo ;
2828import com .iterable .iterableapi .IterableAuthHandler ;
29+ import com .iterable .iterableapi .IterableAuthManager ;
2930import com .iterable .iterableapi .IterableConfig ;
3031import com .iterable .iterableapi .IterableCustomActionHandler ;
31- // import com.iterable.iterableapi.IterableEmbeddedManager;
3232import com .iterable .iterableapi .IterableEmbeddedMessage ;
33- // import com.iterable.iterableapi.IterableEmbeddedSession;
34- // import com.iterable.iterableapi.IterableEmbeddedUpdateHandler;
33+ import com .iterable .iterableapi .IterableEmbeddedUpdateHandler ;
3534import com .iterable .iterableapi .IterableHelper ;
3635import com .iterable .iterableapi .IterableInAppCloseAction ;
3736import com .iterable .iterableapi .IterableInAppHandler ;
5453import java .util .concurrent .CountDownLatch ;
5554import java .util .concurrent .TimeUnit ;
5655
57- public class RNIterableAPIModuleImpl implements IterableUrlHandler , IterableCustomActionHandler , IterableInAppHandler , IterableAuthHandler , IterableInAppManager .Listener {
56+ public class RNIterableAPIModuleImpl implements IterableUrlHandler , IterableCustomActionHandler , IterableInAppHandler , IterableAuthHandler , IterableInAppManager .Listener , IterableEmbeddedUpdateHandler {
5857 public static final String NAME = "RNIterableAPI" ;
5958
6059 private static String TAG = "RNIterableAPIModule" ;
@@ -94,16 +93,49 @@ public void initializeWithApiKey(String apiKey, ReadableMap configReadableMap, S
9493 configBuilder .setAuthHandler (this );
9594 }
9695
97- if (configReadableMap .hasKey ("enableEmbeddedMessaging" )) {
98- configBuilder .setEnableEmbeddedMessaging (configReadableMap .getBoolean ("enableEmbeddedMessaging" ));
96+ // Check if embedded messaging is enabled before building config
97+ boolean enableEmbeddedMessaging = configReadableMap .hasKey ("enableEmbeddedMessaging" ) && configReadableMap .getBoolean ("enableEmbeddedMessaging" );
98+
99+ IterableConfig config = configBuilder .build ();
100+ IterableApi .initialize (reactContext , apiKey , config );
101+
102+ // Update retry policy on existing authManager if it was already created
103+ // This fixes the issue where retryInterval is not respected after
104+ // re-initialization
105+ // TODO [SDK-197]: Fix the root cause of this issue, instead of this hack
106+ try {
107+ // Use reflection to access package-private fields and methods
108+ java .lang .reflect .Field configRetryPolicyField = config .getClass ().getDeclaredField ("retryPolicy" );
109+ configRetryPolicyField .setAccessible (true );
110+ Object retryPolicy = configRetryPolicyField .get (config );
111+
112+ if (retryPolicy != null ) {
113+ java .lang .reflect .Method getAuthManagerMethod = IterableApi .getInstance ().getClass ().getDeclaredMethod ("getAuthManager" );
114+ getAuthManagerMethod .setAccessible (true );
115+ IterableAuthManager authManager = (IterableAuthManager ) getAuthManagerMethod .invoke (IterableApi .getInstance ());
116+
117+ if (authManager != null ) {
118+ // Update the retry policy field on the authManager
119+ java .lang .reflect .Field authRetryPolicyField = authManager .getClass ().getDeclaredField ("authRetryPolicy" );
120+ authRetryPolicyField .setAccessible (true );
121+ authRetryPolicyField .set (authManager , retryPolicy );
122+ IterableLogger .d (TAG , "Updated retry policy on existing authManager" );
123+ }
124+ }
125+ } catch (Exception e ) {
126+ IterableLogger .e (TAG , "Failed to update retry policy: " + e .getMessage ());
99127 }
100128
101- IterableApi .initialize (reactContext , apiKey , configBuilder .build ());
102129 IterableApi .getInstance ().setDeviceAttribute ("reactNativeSDKVersion" , version );
103130
104131 IterableApi .getInstance ().getInAppManager ().addListener (this );
105132 IterableApi .getInstance ().getEmbeddedManager ().syncMessages ();
106133
134+ // Add embedded update listener if embedded messaging is enabled
135+ if (enableEmbeddedMessaging ) {
136+ IterableApi .getInstance ().getEmbeddedManager ().addUpdateListener (this );
137+ }
138+
107139 // MOB-10421: Figure out what the error cases are and handle them appropriately
108140 // This is just here to match the TS types and let the JS thread know when we are done initializing
109141 promise .resolve (true );
@@ -129,20 +161,53 @@ public void initialize2WithApiKey(String apiKey, ReadableMap configReadableMap,
129161 configBuilder .setAuthHandler (this );
130162 }
131163
132- if (configReadableMap .hasKey ("enableEmbeddedMessaging" )) {
133- configBuilder .setEnableEmbeddedMessaging (configReadableMap .getBoolean ("enableEmbeddedMessaging" ));
134- }
135-
136164 // NOTE: There does not seem to be a way to set the API endpoint
137165 // override in the Android SDK. Check with @Ayyanchira and @evantk91 to
138166 // see what the best approach is.
139167
140- IterableApi .initialize (reactContext , apiKey , configBuilder .build ());
168+ // Check if embedded messaging is enabled before building config
169+ boolean enableEmbeddedMessaging = configReadableMap .hasKey ("enableEmbeddedMessaging" ) && configReadableMap .getBoolean ("enableEmbeddedMessaging" );
170+
171+ IterableConfig config = configBuilder .build ();
172+ IterableApi .initialize (reactContext , apiKey , config );
173+
174+ // Update retry policy on existing authManager if it was already created
175+ // This fixes the issue where retryInterval is not respected after
176+ // re-initialization
177+ // TODO [SDK-197]: Fix the root cause of this issue, instead of this hack
178+ try {
179+ // Use reflection to access package-private fields and methods
180+ java .lang .reflect .Field configRetryPolicyField = config .getClass ().getDeclaredField ("retryPolicy" );
181+ configRetryPolicyField .setAccessible (true );
182+ Object retryPolicy = configRetryPolicyField .get (config );
183+
184+ if (retryPolicy != null ) {
185+ java .lang .reflect .Method getAuthManagerMethod = IterableApi .getInstance ().getClass ().getDeclaredMethod ("getAuthManager" );
186+ getAuthManagerMethod .setAccessible (true );
187+ IterableAuthManager authManager = (IterableAuthManager ) getAuthManagerMethod .invoke (IterableApi .getInstance ());
188+
189+ if (authManager != null ) {
190+ // Update the retry policy field on the authManager
191+ java .lang .reflect .Field authRetryPolicyField = authManager .getClass ().getDeclaredField ("authRetryPolicy" );
192+ authRetryPolicyField .setAccessible (true );
193+ authRetryPolicyField .set (authManager , retryPolicy );
194+ IterableLogger .d (TAG , "Updated retry policy on existing authManager" );
195+ }
196+ }
197+ } catch (Exception e ) {
198+ IterableLogger .e (TAG , "Failed to update retry policy: " + e .getMessage ());
199+ }
200+
141201 IterableApi .getInstance ().setDeviceAttribute ("reactNativeSDKVersion" , version );
142202
143203 IterableApi .getInstance ().getInAppManager ().addListener (this );
144204 IterableApi .getInstance ().getEmbeddedManager ().syncMessages ();
145205
206+ // Add embedded update listener if embedded messaging is enabled
207+ if (enableEmbeddedMessaging ) {
208+ IterableApi .getInstance ().getEmbeddedManager ().addUpdateListener (this );
209+ }
210+
146211 // MOB-10421: Figure out what the error cases are and handle them appropriately
147212 // This is just here to match the TS types and let the JS thread know when we are done initializing
148213 promise .resolve (true );
@@ -616,11 +681,6 @@ public void onTokenRegistrationSuccessful(String authToken) {
616681 sendEvent (EventName .handleAuthSuccessCalled .name (), null );
617682 }
618683
619- public void onTokenRegistrationFailed (Throwable object ) {
620- IterableLogger .v (TAG , "Failed to set authToken" );
621- sendEvent (EventName .handleAuthFailureCalled .name (), null );
622- }
623-
624684 public void addListener (String eventName ) {
625685 // Keep: Required for RN built in Event Emitter Calls.
626686 }
@@ -645,6 +705,18 @@ public void sendEvent(@NonNull String eventName, @Nullable Object eventData) {
645705 public void onInboxUpdated () {
646706 sendEvent (EventName .receivedIterableInboxChanged .name (), null );
647707 }
708+
709+ @ Override
710+ public void onMessagesUpdated () {
711+ IterableLogger .d (TAG , "onMessagesUpdated" );
712+ sendEvent (EventName .handleEmbeddedMessageUpdateCalled .name (), null );
713+ }
714+
715+ @ Override
716+ public void onEmbeddedMessagingDisabled () {
717+ IterableLogger .d (TAG , "onEmbeddedMessagingDisabled" );
718+ sendEvent (EventName .handleEmbeddedMessagingDisabledCalled .name (), null );
719+ }
648720 // ---------------------------------------------------------------------------------------
649721 // endregion
650722
@@ -667,43 +739,32 @@ public void endEmbeddedSession() {
667739 }
668740
669741 public void startEmbeddedImpression (String messageId , int placementId ) {
742+ IterableLogger .d (TAG , "startEmbeddedImpression" );
670743 IterableApi .getInstance ().getEmbeddedManager ().getEmbeddedSessionManager ().startImpression (messageId , placementId );
671744 }
672745
673746 public void pauseEmbeddedImpression (String messageId ) {
747+ IterableLogger .d (TAG , "pauseEmbeddedImpression" );
674748 IterableApi .getInstance ().getEmbeddedManager ().getEmbeddedSessionManager ().pauseImpression (messageId );
675749 }
676750
677- public void getEmbeddedPlacementIds (Promise promise ) {
678- IterableLogger .d (TAG , "getEmbeddedPlacementIds" );
679- try {
680- List <Long > placementIds = IterableApi .getInstance ().getEmbeddedManager ().getPlacementIds ();
681- WritableArray writableArray = Arguments .createArray ();
682- if (placementIds != null ) {
683- for (Long placementId : placementIds ) {
684- writableArray .pushDouble (placementId .doubleValue ());
685- }
686- }
687- promise .resolve (writableArray );
688- } catch (Exception e ) {
689- IterableLogger .e (TAG , "Error getting placement IDs: " + e .getLocalizedMessage ());
690- promise .reject ("" , "Failed to get placement IDs: " + e .getLocalizedMessage ());
691- }
692- }
693-
694751 public void getEmbeddedMessages (@ Nullable ReadableArray placementIds , Promise promise ) {
695752 IterableLogger .d (TAG , "getEmbeddedMessages for placements: " + placementIds );
696753
697754 try {
698755 List <IterableEmbeddedMessage > allMessages = new ArrayList <>();
699756
700757 if (placementIds == null || placementIds .size () == 0 ) {
701- // If no placement IDs provided, we need to get messages for all possible placements
702- // Since the Android SDK requires a placement ID, we'll use 0 as a default
703- // This might need to be adjusted based on the actual SDK behavior
704- List <IterableEmbeddedMessage > messages = IterableApi .getInstance ().getEmbeddedManager ().getMessages (0L );
705- if (messages != null ) {
706- allMessages .addAll (messages );
758+ // If no placement IDs provided, get messages from all placements
759+ // Get all available placement IDs and fetch messages for each
760+ List <Long > allPlacementIds = IterableApi .getInstance ().getEmbeddedManager ().getPlacementIds ();
761+ IterableLogger .d (TAG , "Getting messages for all placement IDs: " + allPlacementIds );
762+
763+ for (Long placementId : allPlacementIds ) {
764+ List <IterableEmbeddedMessage > messages = IterableApi .getInstance ().getEmbeddedManager ().getMessages (placementId );
765+ if (messages != null ) {
766+ allMessages .addAll (messages );
767+ }
707768 }
708769 } else {
709770 // Convert ReadableArray to individual placement IDs and get messages for each
@@ -745,6 +806,8 @@ enum EventName {
745806 handleAuthFailureCalled ,
746807 handleAuthSuccessCalled ,
747808 handleCustomActionCalled ,
809+ handleEmbeddedMessageUpdateCalled ,
810+ handleEmbeddedMessagingDisabledCalled ,
748811 handleInAppCalled ,
749812 handleUrlCalled ,
750813 receivedIterableEmbeddedMessagesChanged ,
0 commit comments