|
15 | 15 | import com.facebook.react.bridge.ReadableArray; |
16 | 16 | import com.facebook.react.bridge.ReadableMap; |
17 | 17 | import com.facebook.react.bridge.UiThreadUtil; |
| 18 | +import com.facebook.react.bridge.WritableArray; |
18 | 19 | import com.facebook.react.bridge.WritableMap; |
19 | 20 | import com.facebook.react.modules.core.DeviceEventManagerModule; |
20 | 21 |
|
|
23 | 24 | import com.iterable.iterableapi.IterableAction; |
24 | 25 | import com.iterable.iterableapi.IterableActionContext; |
25 | 26 | import com.iterable.iterableapi.IterableApi; |
| 27 | +import com.iterable.iterableapi.IterableAttributionInfo; |
26 | 28 | import com.iterable.iterableapi.IterableAuthHandler; |
27 | 29 | import com.iterable.iterableapi.IterableAuthManager; |
28 | 30 | import com.iterable.iterableapi.IterableConfig; |
29 | 31 | import com.iterable.iterableapi.IterableCustomActionHandler; |
30 | | -import com.iterable.iterableapi.IterableAttributionInfo; |
| 32 | +import com.iterable.iterableapi.IterableEmbeddedMessage; |
| 33 | +import com.iterable.iterableapi.IterableEmbeddedUpdateHandler; |
31 | 34 | import com.iterable.iterableapi.IterableHelper; |
32 | 35 | import com.iterable.iterableapi.IterableInAppCloseAction; |
33 | 36 | import com.iterable.iterableapi.IterableInAppHandler; |
|
46 | 49 | import java.util.Map; |
47 | 50 | import java.util.HashMap; |
48 | 51 | import java.util.List; |
| 52 | +import java.util.ArrayList; |
49 | 53 | import java.util.concurrent.CountDownLatch; |
50 | 54 | import java.util.concurrent.TimeUnit; |
51 | 55 |
|
52 | | -public class RNIterableAPIModuleImpl implements IterableUrlHandler, IterableCustomActionHandler, IterableInAppHandler, IterableAuthHandler, IterableInAppManager.Listener { |
| 56 | +public class RNIterableAPIModuleImpl implements IterableUrlHandler, IterableCustomActionHandler, IterableInAppHandler, IterableAuthHandler, IterableInAppManager.Listener, IterableEmbeddedUpdateHandler { |
53 | 57 | public static final String NAME = "RNIterableAPI"; |
54 | 58 |
|
55 | 59 | private static String TAG = "RNIterableAPIModule"; |
@@ -89,6 +93,9 @@ public void initializeWithApiKey(String apiKey, ReadableMap configReadableMap, S |
89 | 93 | configBuilder.setAuthHandler(this); |
90 | 94 | } |
91 | 95 |
|
| 96 | + // Check if embedded messaging is enabled before building config |
| 97 | + boolean enableEmbeddedMessaging = configReadableMap.hasKey("enableEmbeddedMessaging") && configReadableMap.getBoolean("enableEmbeddedMessaging"); |
| 98 | + |
92 | 99 | IterableConfig config = configBuilder.build(); |
93 | 100 | IterableApi.initialize(reactContext, apiKey, config); |
94 | 101 |
|
@@ -122,6 +129,12 @@ public void initializeWithApiKey(String apiKey, ReadableMap configReadableMap, S |
122 | 129 | IterableApi.getInstance().setDeviceAttribute("reactNativeSDKVersion", version); |
123 | 130 |
|
124 | 131 | IterableApi.getInstance().getInAppManager().addListener(this); |
| 132 | + IterableApi.getInstance().getEmbeddedManager().syncMessages(); |
| 133 | + |
| 134 | + // Add embedded update listener if embedded messaging is enabled |
| 135 | + if (enableEmbeddedMessaging) { |
| 136 | + IterableApi.getInstance().getEmbeddedManager().addUpdateListener(this); |
| 137 | + } |
125 | 138 |
|
126 | 139 | // MOB-10421: Figure out what the error cases are and handle them appropriately |
127 | 140 | // This is just here to match the TS types and let the JS thread know when we are done initializing |
@@ -152,6 +165,9 @@ public void initialize2WithApiKey(String apiKey, ReadableMap configReadableMap, |
152 | 165 | // override in the Android SDK. Check with @Ayyanchira and @evantk91 to |
153 | 166 | // see what the best approach is. |
154 | 167 |
|
| 168 | + // Check if embedded messaging is enabled before building config |
| 169 | + boolean enableEmbeddedMessaging = configReadableMap.hasKey("enableEmbeddedMessaging") && configReadableMap.getBoolean("enableEmbeddedMessaging"); |
| 170 | + |
155 | 171 | IterableConfig config = configBuilder.build(); |
156 | 172 | IterableApi.initialize(reactContext, apiKey, config); |
157 | 173 |
|
@@ -185,6 +201,12 @@ public void initialize2WithApiKey(String apiKey, ReadableMap configReadableMap, |
185 | 201 | IterableApi.getInstance().setDeviceAttribute("reactNativeSDKVersion", version); |
186 | 202 |
|
187 | 203 | IterableApi.getInstance().getInAppManager().addListener(this); |
| 204 | + IterableApi.getInstance().getEmbeddedManager().syncMessages(); |
| 205 | + |
| 206 | + // Add embedded update listener if embedded messaging is enabled |
| 207 | + if (enableEmbeddedMessaging) { |
| 208 | + IterableApi.getInstance().getEmbeddedManager().addUpdateListener(this); |
| 209 | + } |
188 | 210 |
|
189 | 211 | // MOB-10421: Figure out what the error cases are and handle them appropriately |
190 | 212 | // This is just here to match the TS types and let the JS thread know when we are done initializing |
@@ -683,14 +705,111 @@ public void sendEvent(@NonNull String eventName, @Nullable Object eventData) { |
683 | 705 | public void onInboxUpdated() { |
684 | 706 | sendEvent(EventName.receivedIterableInboxChanged.name(), null); |
685 | 707 | } |
| 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 | + } |
| 720 | + // --------------------------------------------------------------------------------------- |
| 721 | + // endregion |
| 722 | + |
| 723 | + // --------------------------------------------------------------------------------------- |
| 724 | + // region Embedded messaging |
| 725 | + |
| 726 | + public void syncEmbeddedMessages() { |
| 727 | + IterableLogger.d(TAG, "syncEmbeddedMessages"); |
| 728 | + IterableApi.getInstance().getEmbeddedManager().syncMessages(); |
| 729 | + } |
| 730 | + |
| 731 | + public void startEmbeddedSession() { |
| 732 | + IterableLogger.d(TAG, "startEmbeddedSession"); |
| 733 | + IterableApi.getInstance().getEmbeddedManager().getEmbeddedSessionManager().startSession(); |
| 734 | + } |
| 735 | + |
| 736 | + public void endEmbeddedSession() { |
| 737 | + IterableLogger.d(TAG, "endEmbeddedSession"); |
| 738 | + IterableApi.getInstance().getEmbeddedManager().getEmbeddedSessionManager().endSession(); |
| 739 | + } |
| 740 | + |
| 741 | + public void startEmbeddedImpression(String messageId, int placementId) { |
| 742 | + IterableLogger.d(TAG, "startEmbeddedImpression"); |
| 743 | + IterableApi.getInstance().getEmbeddedManager().getEmbeddedSessionManager().startImpression(messageId, placementId); |
| 744 | + } |
| 745 | + |
| 746 | + public void pauseEmbeddedImpression(String messageId) { |
| 747 | + IterableLogger.d(TAG, "pauseEmbeddedImpression"); |
| 748 | + IterableApi.getInstance().getEmbeddedManager().getEmbeddedSessionManager().pauseImpression(messageId); |
| 749 | + } |
| 750 | + |
| 751 | + public void getEmbeddedMessages(@Nullable ReadableArray placementIds, Promise promise) { |
| 752 | + IterableLogger.d(TAG, "getEmbeddedMessages for placements: " + placementIds); |
| 753 | + |
| 754 | + try { |
| 755 | + List<IterableEmbeddedMessage> allMessages = new ArrayList<>(); |
| 756 | + |
| 757 | + if (placementIds == null || placementIds.size() == 0) { |
| 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 | + } |
| 768 | + } |
| 769 | + } else { |
| 770 | + // Convert ReadableArray to individual placement IDs and get messages for each |
| 771 | + for (int i = 0; i < placementIds.size(); i++) { |
| 772 | + long placementId = placementIds.getInt(i); |
| 773 | + List<IterableEmbeddedMessage> messages = IterableApi.getInstance().getEmbeddedManager().getMessages(placementId); |
| 774 | + if (messages != null) { |
| 775 | + allMessages.addAll(messages); |
| 776 | + } |
| 777 | + } |
| 778 | + } |
| 779 | + |
| 780 | + JSONArray embeddedMessageJsonArray = Serialization.serializeEmbeddedMessages(allMessages); |
| 781 | + IterableLogger.d(TAG, "Messages for placements: " + embeddedMessageJsonArray); |
| 782 | + |
| 783 | + promise.resolve(Serialization.convertJsonToArray(embeddedMessageJsonArray)); |
| 784 | + } catch (JSONException e) { |
| 785 | + IterableLogger.e(TAG, e.getLocalizedMessage()); |
| 786 | + promise.reject("", "Failed to fetch messages with error " + e.getLocalizedMessage()); |
| 787 | + } |
| 788 | + } |
| 789 | + |
| 790 | + public void trackEmbeddedClick(ReadableMap messageMap, String buttonId, String clickedUrl) { |
| 791 | + IterableLogger.d(TAG, "trackEmbeddedClick: buttonId: " + buttonId + " clickedUrl: " + clickedUrl); |
| 792 | + IterableEmbeddedMessage message = Serialization.embeddedMessageFromReadableMap(messageMap); |
| 793 | + if (message != null) { |
| 794 | + IterableApi.getInstance().trackEmbeddedClick(message, buttonId, clickedUrl); |
| 795 | + } else { |
| 796 | + IterableLogger.e(TAG, "Failed to convert message map to IterableEmbeddedMessage"); |
| 797 | + } |
| 798 | + } |
| 799 | + |
| 800 | + // --------------------------------------------------------------------------------------- |
| 801 | + // endregion |
686 | 802 | } |
687 | 803 |
|
688 | 804 | enum EventName { |
689 | | - handleUrlCalled, |
690 | | - handleCustomActionCalled, |
691 | | - handleInAppCalled, |
692 | 805 | handleAuthCalled, |
693 | | - receivedIterableInboxChanged, |
| 806 | + handleAuthFailureCalled, |
694 | 807 | handleAuthSuccessCalled, |
695 | | - handleAuthFailureCalled |
| 808 | + handleCustomActionCalled, |
| 809 | + handleEmbeddedMessageUpdateCalled, |
| 810 | + handleEmbeddedMessagingDisabledCalled, |
| 811 | + handleInAppCalled, |
| 812 | + handleUrlCalled, |
| 813 | + receivedIterableEmbeddedMessagesChanged, |
| 814 | + receivedIterableInboxChanged |
696 | 815 | } |
0 commit comments