Skip to content

Commit e0e83b2

Browse files
authored
Merge pull request #744 from Iterable/loren/embedded/MOB-12263-android-add-ability-to-sync-embedded-messages
[MOB-12263] android-add-ability-to-get placements
2 parents 2c7a839 + d4c89e8 commit e0e83b2

File tree

12 files changed

+106
-17
lines changed

12 files changed

+106
-17
lines changed

android/src/main/java/com/iterable/reactnative/RNIterableAPIModuleImpl.java

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import com.facebook.react.bridge.ReadableArray;
1616
import com.facebook.react.bridge.ReadableMap;
1717
import com.facebook.react.bridge.UiThreadUtil;
18+
import com.facebook.react.bridge.WritableArray;
1819
import com.facebook.react.bridge.WritableMap;
1920
import com.facebook.react.modules.core.DeviceEventManagerModule;
2021

@@ -23,11 +24,12 @@
2324
import com.iterable.iterableapi.IterableAction;
2425
import com.iterable.iterableapi.IterableActionContext;
2526
import com.iterable.iterableapi.IterableApi;
27+
import com.iterable.iterableapi.IterableAttributionInfo;
2628
import com.iterable.iterableapi.IterableAuthHandler;
2729
import com.iterable.iterableapi.IterableAuthManager;
2830
import com.iterable.iterableapi.IterableConfig;
2931
import com.iterable.iterableapi.IterableCustomActionHandler;
30-
import com.iterable.iterableapi.IterableAttributionInfo;
32+
import com.iterable.iterableapi.IterableEmbeddedMessage;
3133
import com.iterable.iterableapi.IterableHelper;
3234
import com.iterable.iterableapi.IterableInAppCloseAction;
3335
import com.iterable.iterableapi.IterableInAppHandler;
@@ -46,6 +48,7 @@
4648
import java.util.Map;
4749
import java.util.HashMap;
4850
import java.util.List;
51+
import java.util.ArrayList;
4952
import java.util.concurrent.CountDownLatch;
5053
import java.util.concurrent.TimeUnit;
5154

@@ -122,6 +125,7 @@ public void initializeWithApiKey(String apiKey, ReadableMap configReadableMap, S
122125
IterableApi.getInstance().setDeviceAttribute("reactNativeSDKVersion", version);
123126

124127
IterableApi.getInstance().getInAppManager().addListener(this);
128+
IterableApi.getInstance().getEmbeddedManager().syncMessages();
125129

126130
// MOB-10421: Figure out what the error cases are and handle them appropriately
127131
// This is just here to match the TS types and let the JS thread know when we are done initializing
@@ -185,6 +189,7 @@ public void initialize2WithApiKey(String apiKey, ReadableMap configReadableMap,
185189
IterableApi.getInstance().setDeviceAttribute("reactNativeSDKVersion", version);
186190

187191
IterableApi.getInstance().getInAppManager().addListener(this);
192+
IterableApi.getInstance().getEmbeddedManager().syncMessages();
188193

189194
// MOB-10421: Figure out what the error cases are and handle them appropriately
190195
// This is just here to match the TS types and let the JS thread know when we are done initializing
@@ -683,14 +688,39 @@ public void sendEvent(@NonNull String eventName, @Nullable Object eventData) {
683688
public void onInboxUpdated() {
684689
sendEvent(EventName.receivedIterableInboxChanged.name(), null);
685690
}
691+
// ---------------------------------------------------------------------------------------
692+
// endregion
693+
694+
// ---------------------------------------------------------------------------------------
695+
// region Embedded messaging
696+
public void getEmbeddedPlacementIds(Promise promise) {
697+
IterableLogger.d(TAG, "getEmbeddedPlacementIds");
698+
try {
699+
List<Long> placementIds = IterableApi.getInstance().getEmbeddedManager().getPlacementIds();
700+
WritableArray writableArray = Arguments.createArray();
701+
if (placementIds != null) {
702+
for (Long placementId : placementIds) {
703+
writableArray.pushDouble(placementId.doubleValue());
704+
}
705+
}
706+
promise.resolve(writableArray);
707+
} catch (Exception e) {
708+
IterableLogger.e(TAG, "Error getting placement IDs: " + e.getLocalizedMessage());
709+
promise.reject("", "Failed to get placement IDs: " + e.getLocalizedMessage());
710+
}
711+
}
712+
713+
// ---------------------------------------------------------------------------------------
714+
// endregion
686715
}
687716

688717
enum EventName {
689-
handleUrlCalled,
690-
handleCustomActionCalled,
691-
handleInAppCalled,
692718
handleAuthCalled,
693-
receivedIterableInboxChanged,
719+
handleAuthFailureCalled,
694720
handleAuthSuccessCalled,
695-
handleAuthFailureCalled
721+
handleCustomActionCalled,
722+
handleInAppCalled,
723+
handleUrlCalled,
724+
receivedIterableEmbeddedMessagesChanged,
725+
receivedIterableInboxChanged
696726
}

android/src/main/java/com/iterable/reactnative/Serialization.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,16 @@
1616
import com.iterable.iterableapi.IterableActionContext;
1717
import com.iterable.iterableapi.IterableConfig;
1818
import com.iterable.iterableapi.IterableDataRegion;
19+
import com.iterable.iterableapi.IterableEmbeddedMessage;
1920
import com.iterable.iterableapi.IterableInAppCloseAction;
2021
import com.iterable.iterableapi.IterableInAppDeleteActionType;
2122
import com.iterable.iterableapi.IterableInAppHandler;
2223
import com.iterable.iterableapi.IterableInAppLocation;
2324
import com.iterable.iterableapi.IterableInAppMessage;
2425
import com.iterable.iterableapi.IterableInboxSession;
2526
import com.iterable.iterableapi.IterableLogger;
26-
import com.iterable.iterableapi.RNIterableInternal;
2727
import com.iterable.iterableapi.RetryPolicy;
28+
import com.iterable.iterableapi.RNIterableInternal;
2829

2930
import org.json.JSONArray;
3031
import org.json.JSONException;
@@ -218,6 +219,10 @@ static IterableConfig.Builder getConfigFromReadableMap(ReadableMap iterableConte
218219
configBuilder.setDataRegion(iterableDataRegion);
219220
}
220221

222+
if (iterableContextJSON.has("enableEmbeddedMessaging")) {
223+
configBuilder.setEnableEmbeddedMessaging(iterableContextJSON.optBoolean("enableEmbeddedMessaging"));
224+
}
225+
221226
if (iterableContextJSON.has("retryPolicy")) {
222227
JSONObject retryPolicyJson = iterableContextJSON.getJSONObject("retryPolicy");
223228
int maxRetry = retryPolicyJson.getInt("maxRetry");

android/src/newarch/java/com/RNIterableAPIModule.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,11 @@ public void pauseAuthRetries(boolean pauseRetry) {
224224
moduleImpl.pauseAuthRetries(pauseRetry);
225225
}
226226

227+
@Override
228+
public void getEmbeddedPlacementIds(Promise promise) {
229+
moduleImpl.getEmbeddedPlacementIds(promise);
230+
}
231+
227232
public void sendEvent(@NonNull String eventName, @Nullable Object eventData) {
228233
moduleImpl.sendEvent(eventName, eventData);
229234
}

android/src/oldarch/java/com/RNIterableAPIModule.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,10 @@ public void pauseAuthRetries(boolean pauseRetry) {
228228
moduleImpl.pauseAuthRetries(pauseRetry);
229229
}
230230

231+
@ReactMethod
232+
public void getEmbeddedPlacementIds(Promise promise) {
233+
moduleImpl.getEmbeddedPlacementIds(promise);
234+
}
231235

232236
public void sendEvent(@NonNull String eventName, @Nullable Object eventData) {
233237
moduleImpl.sendEvent(eventName, eventData);

example/src/components/Embedded/Embedded.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
1+
import { Text, TouchableOpacity } from 'react-native';
2+
import { useCallback, useState } from 'react';
13
import { Iterable } from '@iterable/react-native-sdk';
2-
import { Text } from 'react-native';
34
import { SafeAreaView } from 'react-native-safe-area-context';
45

56
import styles from './Embedded.styles';
67

78
export const Embedded = () => {
9+
const [placementIds, setPlacementIds] = useState<number[]>([]);
10+
const getPlacementIds = useCallback(() => {
11+
Iterable.embeddedManager.getPlacementIds().then((ids: unknown) => {
12+
console.log(ids);
13+
setPlacementIds(ids as number[]);
14+
});
15+
}, []);
16+
817
return (
918
<SafeAreaView style={styles.container}>
1019
<Text style={styles.text}>EMBEDDED</Text>
@@ -15,6 +24,12 @@ export const Embedded = () => {
1524
Is embedded manager enabled?{' '}
1625
{Iterable.embeddedManager.isEnabled ? 'Yes' : 'No'}
1726
</Text>
27+
<Text style={styles.text}>
28+
Placement ids: [{placementIds.join(', ')}]
29+
</Text>
30+
<TouchableOpacity style={styles.button} onPress={getPlacementIds}>
31+
<Text style={styles.buttonText}>Get placement ids</Text>
32+
</TouchableOpacity>
1833
</SafeAreaView>
1934
);
2035
};

example/src/hooks/useIterableApp.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@ export const IterableAppProvider: FunctionComponent<
155155
retryBackoff: IterableRetryBackoff.linear,
156156
};
157157

158+
config.enableEmbeddedMessaging = true;
159+
158160
config.onJwtError = (authFailure) => {
159161
console.log('onJwtError', authFailure);
160162

@@ -192,7 +194,7 @@ export const IterableAppProvider: FunctionComponent<
192194

193195
config.logLevel = IterableLogLevel.debug;
194196

195-
config.embeddedMessagingEnabled = true;
197+
config.enableEmbeddedMessaging = true;
196198

197199
config.inAppHandler = () => IterableInAppShowResponse.show;
198200

src/api/NativeRNIterableAPI.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ export interface Spec extends TurboModule {
118118
passAlongAuthToken(authToken?: string | null): void;
119119
pauseAuthRetries(pauseRetry: boolean): void;
120120

121+
// Embedded Messaging
122+
getEmbeddedPlacementIds(): Promise<number[]>;
123+
121124
// Wake app -- android only
122125
wakeApp(): void;
123126

src/core/classes/Iterable.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ describe('Iterable', () => {
307307
expect(config.checkForDeferredDeeplink).toBe(false);
308308
expect(config.customActionHandler).toBe(undefined);
309309
expect(config.dataRegion).toBe(IterableDataRegion.US);
310-
expect(config.embeddedMessagingEnabled).toBe(false);
310+
expect(config.enableEmbeddedMessaging).toBe(false);
311311
expect(config.encryptionEnforced).toBe(false);
312312
expect(config.expiringAuthTokenRefreshPeriod).toBe(60.0);
313313
expect(config.inAppDisplayInterval).toBe(30.0);
@@ -324,7 +324,7 @@ describe('Iterable', () => {
324324
expect(configDict.autoPushRegistration).toBe(true);
325325
expect(configDict.customActionHandlerPresent).toBe(false);
326326
expect(configDict.dataRegion).toBe(IterableDataRegion.US);
327-
expect(configDict.embeddedMessagingEnabled).toBe(false);
327+
expect(configDict.enableEmbeddedMessaging).toBe(false);
328328
expect(configDict.encryptionEnforced).toBe(false);
329329
expect(configDict.expiringAuthTokenRefreshPeriod).toBe(60.0);
330330
expect(configDict.inAppDisplayInterval).toBe(30.0);
@@ -1218,13 +1218,13 @@ describe('Iterable', () => {
12181218
describe('embeddedManager', () => {
12191219
it('should be disabled by default', () => {
12201220
const config = new IterableConfig();
1221-
expect(config.embeddedMessagingEnabled).toBe(false);
1221+
expect(config.enableEmbeddedMessaging).toBe(false);
12221222
expect(Iterable.embeddedManager.isEnabled).toBe(false);
12231223
});
12241224

12251225
it('should enable embeddedManager when config is set', async () => {
12261226
const config = new IterableConfig();
1227-
config.embeddedMessagingEnabled = true;
1227+
config.enableEmbeddedMessaging = true;
12281228
await Iterable.initialize('test-key', config);
12291229
expect(Iterable.embeddedManager.isEnabled).toBe(true);
12301230
});

src/core/classes/Iterable.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ export class Iterable {
196196
IterableLogger.setLogLevel(config.logLevel);
197197

198198
Iterable.embeddedManager.setEnabled(
199-
config.embeddedMessagingEnabled ?? false
199+
config.enableEmbeddedMessaging ?? false
200200
);
201201
}
202202

src/core/classes/IterableApi.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,21 @@ export class IterableApi {
507507
// ---- End IN-APP ---- //
508508

509509
// ====================================================== //
510-
// ======================= MOSC ======================= //
510+
// ======================= EMBEDDED ===================== //
511+
// ====================================================== //
512+
513+
/**
514+
* Get the embedded placement IDs.
515+
*/
516+
static getEmbeddedPlacementIds() {
517+
IterableLogger.log('getEmbeddedPlacementIds');
518+
return RNIterableAPI.getEmbeddedPlacementIds();
519+
}
520+
521+
// ---- End EMBEDDED ---- //
522+
523+
// ====================================================== //
524+
// ======================= MISCELLANEOUS ================ //
511525
// ====================================================== //
512526

513527
/**

0 commit comments

Comments
 (0)