From d051d0f6d9510b7b79f5c0de62fe43d6e70081d4 Mon Sep 17 00:00:00 2001 From: Jan Hudzik Date: Fri, 16 Oct 2020 10:37:45 +0200 Subject: [PATCH] Integration of getPlacement() method to Android bridge --- BridgeAPI.md | 68 +++++++++++++++++++ README.md | 47 +++++++++++++ android/build.gradle | 2 +- .../qubit/reactnative/sdk/QubitSDKModule.java | 61 +++++++++++++++-- 4 files changed, 172 insertions(+), 6 deletions(-) diff --git a/BridgeAPI.md b/BridgeAPI.md index 0d955de..1f74cd1 100644 --- a/BridgeAPI.md +++ b/BridgeAPI.md @@ -293,3 +293,71 @@ None ### Example QubitSDK.experienceShown("https://sse.qubit.com/v1/callback?data=igK....n0="); + +------------------------------------------------------- + +## **getPlacement**(placementId, mode, attributes, campaignId, experienceId, placementPromise) + +### Description +Returns Placement for given parameters. + +### Parameters +- placementId + - Type: String + - Constraints: Not null + - Description: Unique ID of the placement. +- mode + - Type: String + - Constraints: Can be one of LIVE/SAMPLE/PREVIEW. + - Description: The mode to fetch placements content with. Defaults to LIVE. +- attributes + - Type: String + - Constraints: Should be string description of JSON or null + - Description: JSON string containing custom attributes to be used to query for the placement. "visitor" attribute will be ignored as it is set by SDK. +- campaignId + - Type: String + - Constraints: Nullable + - Description: Campaign identifier +- experienceId + - Type: String + - Constraints: Nullable + - Description: Experience identifier +- placementPromise + - Type: Promise + - Constraints: Not null + - Description: Promise with query result + +### Result +Promise with a map describing Placement object. Example: + + { + "data": { + "placementContent": { + "content": { + "image": "https://image.store.com/images/example.jpeg", + "message": "Hello World", + "url": "https://www.qubit.com" + }, + "callbacks": { + "impression": "https://api.qubit.com/placements/callback?data=ggW4eyJtZXRhIjp7ImlkIjo", + "clickthrough": "https://api.qubit.com/placements/callback?data=mQW4eyJtZXRhIjp7Imlkx" + } + } + } + } + + +### Exceptions +- Exception is thrown, when SDK is not initialized. + +### Example + async () => { + const placement = await getPlacement( + "placement_id", + "LIVE", + "{ \"color\": \"blue\"}", + "campaign_id", + "experience_id" + ); + ... + } diff --git a/README.md b/README.md index fe7f2ae..dccb30e 100644 --- a/README.md +++ b/README.md @@ -214,6 +214,53 @@ async () => { Returns **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)<[array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<Experience>>** Promise with an array of Experience objects. +#### getPlacement + +Returns Placement for given parameters. + +##### Parameters + +- `placementId` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** Unique ID of the placement. +- `mode` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** The mode to fetch placements content with, can be one of LIVE/SAMPLE/PREVIEW. Defaults to LIVE. +- `attributes` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** JSON string containing custom attributes to be used to query for the placement. "visitor" attribute will be ignored as it is set by SDK. +- `campaignId` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Optional. +- `experienceId` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Optional. +- `placementPromise` **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)<Placement>** Promise with query result. + + +##### Example + +```javascript +async () => { + const placement = await getPlacement( + "placement_id", + "LIVE", + "{ \"color\": \"blue\"}", + "campaign_id", + "experience_id" + ); + ... +} + +{ + "data": { + "placementContent": { + "content": { + "image": "https://image.store.com/images/example.jpeg", + "message": "Hello World", + "url": "https://www.qubit.com" + }, + "callbacks": { + "impression": "https://api.qubit.com/placements/callback?data=ggW4eyJtZXRhIjp7ImlkIjo", + "clickthrough": "https://api.qubit.com/placements/callback?data=mQW4eyJtZXRhIjp7Imlkx" + } + } + } +} +``` + +Returns **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)<Placement>** with a map describing Placement object. + ### Compatibility Qubit SDK React Native is compatible with React Native 0.58 and higher diff --git a/android/build.gradle b/android/build.gradle index c60967d..5df2d85 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -58,6 +58,6 @@ dependencies { implementation "androidx.annotation:annotation:1.0.0" implementation "com.google.code.gson:gson:2.8.2" - implementation 'com.qubit:qubit-sdk-android:1.4.1' + implementation 'com.qubit:qubit-sdk-android:1.5.0' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.0" } diff --git a/android/src/main/java/com/qubit/reactnative/sdk/QubitSDKModule.java b/android/src/main/java/com/qubit/reactnative/sdk/QubitSDKModule.java index 7cca174..0b91f6b 100644 --- a/android/src/main/java/com/qubit/reactnative/sdk/QubitSDKModule.java +++ b/android/src/main/java/com/qubit/reactnative/sdk/QubitSDKModule.java @@ -1,7 +1,7 @@ package com.qubit.reactnative.sdk; import android.util.Log; -import androidx.annotation.NonNull; + import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; @@ -12,18 +12,24 @@ import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import com.qubit.android.sdk.api.QubitSDK; import com.qubit.android.sdk.api.logging.QBLogLevel; +import com.qubit.android.sdk.api.placement.PlacementMode; +import com.qubit.android.sdk.api.placement.PlacementPreviewOptions; import com.qubit.android.sdk.api.tracker.event.QBEvent; import com.qubit.android.sdk.api.tracker.event.QBEvents; import com.qubit.android.sdk.internal.experience.Experience; -import com.qubit.android.sdk.internal.experience.callback.CallbackConnector; -import com.qubit.android.sdk.internal.experience.callback.CallbackConnectorImpl; +import com.qubit.android.sdk.internal.experience.callback.ExperienceCallbackConnector; +import com.qubit.android.sdk.internal.experience.callback.ExperienceCallbackConnectorImpl; import com.qubit.android.sdk.internal.experience.model.ExperiencePayload; import com.qubit.android.sdk.internal.lookup.LookupData; + import java.util.ArrayList; import java.util.List; +import androidx.annotation.NonNull; + public class QubitSDKModule extends ReactContextBaseJavaModule { private static ReactApplicationContext reactContext; @@ -139,10 +145,55 @@ public void getExperiences(ReadableArray experienceIds, @ReactMethod public void experienceShown(String callback) { - CallbackConnector callbackConnector = new CallbackConnectorImpl(callback, QubitSDK.getDeviceId()); + ExperienceCallbackConnector callbackConnector = new ExperienceCallbackConnectorImpl(callback, QubitSDK.getDeviceId()); callbackConnector.shown(); } + @ReactMethod + public void getPlacement( + String placementId, + String mode, + String attributes, + String campaignId, + String experienceId, + Promise placementPromise + ) { + QubitSDK.getPlacement( + placementId, + matchMode(mode), + getAttributesJson(attributes), + new PlacementPreviewOptions(campaignId, experienceId), + placement -> { + WritableMap placementContentMap = WritableMapConverter.convertJsonToMap(placement.getContent()); + placementPromise.resolve(placementContentMap); + return null; + }, + throwable -> { + placementPromise.reject(throwable); + return null; + } + ); + } + + private PlacementMode matchMode(String value) { + switch (value) { + case "SAMPLE": + return PlacementMode.SAMPLE; + case "PREVIEW": + return PlacementMode.PREVIEW; + case "LIVE": + default: + return PlacementMode.LIVE; + } + } + + private JsonObject getAttributesJson(String attributes) { + try { + return new JsonParser().parse(attributes).getAsJsonObject(); + } catch (Exception e) { + return null; + } + } private static QBLogLevel defaultLogLevel = QBLogLevel.WARN; @@ -150,7 +201,7 @@ private QBLogLevel parseLogLevel(String logLevel) { if (logLevel == null || logLevel.isEmpty()) { return defaultLogLevel; } - for(QBLogLevel level : QBLogLevel.values()) { + for (QBLogLevel level : QBLogLevel.values()) { if (level.toString().equalsIgnoreCase(logLevel)) return level; }