Skip to content

Commit 8b94685

Browse files
authored
Merge pull request #654 from OneSignal/user_model/InAppMessage-method-Impl
[User Model] InAppMessage method implementation + Android
2 parents b6285e1 + 57892f7 commit 8b94685

File tree

8 files changed

+263
-59
lines changed

8 files changed

+263
-59
lines changed

android/.idea/gradle.xml

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

android/.idea/runConfigurations.xml

Lines changed: 0 additions & 12 deletions
This file was deleted.
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
package com.onesignal.flutter;
2+
3+
import com.onesignal.OneSignal;
4+
import com.onesignal.inAppMessages.IInAppMessage;
5+
import com.onesignal.inAppMessages.IInAppMessageClickHandler;
6+
import com.onesignal.inAppMessages.IInAppMessageClickResult;
7+
import com.onesignal.inAppMessages.IInAppMessageLifecycleHandler;
8+
9+
import java.util.Collection;
10+
import java.util.Map;
11+
12+
import io.flutter.plugin.common.BinaryMessenger;
13+
import io.flutter.plugin.common.MethodCall;
14+
import io.flutter.plugin.common.MethodChannel;
15+
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
16+
import io.flutter.plugin.common.MethodChannel.Result;
17+
import io.flutter.plugin.common.PluginRegistry.Registrar;
18+
19+
public class OneSignalInAppMessages extends FlutterRegistrarResponder implements MethodCallHandler,
20+
IInAppMessageClickHandler{
21+
private MethodChannel channel;
22+
23+
private IInAppMessageClickResult inAppMessageClickedResult;
24+
private boolean hasSetInAppMessageClickedHandler = false;
25+
26+
27+
28+
static void registerWith(BinaryMessenger messenger) {
29+
OneSignalInAppMessages sharedInstance = new OneSignalInAppMessages();
30+
31+
sharedInstance.messenger = messenger;
32+
sharedInstance.channel = new MethodChannel(messenger, "OneSignal#inappmessages");
33+
sharedInstance.channel.setMethodCallHandler(sharedInstance);
34+
}
35+
36+
@Override
37+
public void onMethodCall(MethodCall call, Result result) {
38+
if (call.method.contentEquals("OneSignal#addTrigger"))
39+
this.addTriggers(call, result);
40+
else if (call.method.contentEquals("OneSignal#addTriggers"))
41+
this.addTriggers(call, result);
42+
else if (call.method.contentEquals("OneSignal#removeTrigger"))
43+
this.removeTrigger(call, result);
44+
else if (call.method.contentEquals("OneSignal#removeTriggers"))
45+
this.removeTriggers(call, result);
46+
else if (call.method.contentEquals("OneSignal#arePaused"))
47+
replySuccess(result, OneSignal.getInAppMessages().getPaused());
48+
else if (call.method.contentEquals("OneSignal#paused"))
49+
this.paused(call, result);
50+
else if (call.method.contentEquals("OneSignal#initInAppMessageClickedHandlerParams"))
51+
this.initInAppMessageClickedHandlerParams();
52+
else if (call.method.contentEquals("OneSignal#lifecycleInit"))
53+
this.lifecycleInit();
54+
else
55+
replyNotImplemented(result);
56+
}
57+
58+
private void addTriggers(MethodCall call, Result result) {
59+
// call.arguments is being casted to a Map<String, Object> so a try-catch with
60+
// a ClassCastException will be thrown
61+
try {
62+
OneSignal.getInAppMessages().addTriggers((Map<String, Object>) call.arguments);
63+
replySuccess(result, null);
64+
} catch (ClassCastException e) {
65+
replyError(result, "OneSignal", "Add triggers failed with error: " + e.getMessage() + "\n" + e.getStackTrace(), null);
66+
}
67+
}
68+
69+
private void removeTrigger(MethodCall call, Result result) {
70+
OneSignal.getInAppMessages().removeTrigger((String) call.arguments);
71+
replySuccess(result, null);
72+
}
73+
74+
private void removeTriggers(MethodCall call, Result result) {
75+
// call.arguments is being casted to a Collection<String> a try-catch with
76+
// a ClassCastException will be thrown
77+
try {
78+
OneSignal.getInAppMessages().removeTriggers((Collection<String>) call.arguments);
79+
replySuccess(result, null);
80+
} catch (ClassCastException e) {
81+
replyError(result, "OneSignal", "Remove triggers for keys failed with error: " + e.getMessage() + "\n" + e.getStackTrace(), null);
82+
}
83+
}
84+
85+
private void paused(MethodCall call, Result result) {
86+
OneSignal.getInAppMessages().setPaused((boolean) call.arguments);
87+
replySuccess(result, null);
88+
}
89+
90+
private void initInAppMessageClickedHandlerParams() {
91+
this.hasSetInAppMessageClickedHandler = true;
92+
if (this.inAppMessageClickedResult != null) {
93+
this.inAppMessageClicked(this.inAppMessageClickedResult);
94+
this.inAppMessageClickedResult = null;
95+
}
96+
}
97+
98+
public void lifecycleInit() {
99+
this.setInAppMessageLifecycleHandler();
100+
OneSignal.getInAppMessages().setInAppMessageClickHandler(this);
101+
}
102+
103+
public void inAppMessageClicked(IInAppMessageClickResult action) {
104+
if (!this.hasSetInAppMessageClickedHandler) {
105+
this.inAppMessageClickedResult = action;
106+
return;
107+
}
108+
109+
channel.invokeMethod("OneSignal#handleClickedInAppMessage", OneSignalSerializer.convertInAppMessageClickedActionToMap(action));
110+
}
111+
112+
/* in app message lifecycle */
113+
public void setInAppMessageLifecycleHandler() {
114+
OneSignal.getInAppMessages().setInAppMessageLifecycleHandler(new IInAppMessageLifecycleHandler() {
115+
@Override
116+
public void onWillDisplayInAppMessage(IInAppMessage message) {
117+
channel.invokeMethod("OneSignal#onWillDisplayInAppMessage", OneSignalSerializer.convertInAppMessageToMap(message));
118+
}
119+
120+
@Override
121+
public void onDidDisplayInAppMessage(IInAppMessage message) {
122+
channel.invokeMethod("OneSignal#onDidDisplayInAppMessage", OneSignalSerializer.convertInAppMessageToMap(message));
123+
}
124+
125+
@Override
126+
public void onWillDismissInAppMessage(IInAppMessage message) {
127+
channel.invokeMethod("OneSignal#onWillDismissInAppMessage", OneSignalSerializer.convertInAppMessageToMap(message));
128+
}
129+
130+
@Override
131+
public void onDidDismissInAppMessage(IInAppMessage message) {
132+
channel.invokeMethod("OneSignal#onDidDismissInAppMessage", OneSignalSerializer.convertInAppMessageToMap(message));
133+
}
134+
});
135+
}
136+
}

android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public OneSignalPlugin() {
3636
}
3737

3838
private void init(Context context, BinaryMessenger messenger)
39-
{
39+
{
4040
this.context = context;
4141
this.messenger = messenger;
4242

@@ -49,6 +49,7 @@ private void init(Context context, BinaryMessenger messenger)
4949
OneSignalDebug.registerWith(messenger);
5050
OneSignalLocation.registerWith(messenger);
5151
OneSignalSession.registerWith(messenger);
52+
OneSignalInAppMessages.registerWith(messenger);
5253
// OneSignalTagsController.registerWith(messenger);
5354
// OneSignalInAppMessagingController.registerWith(messenger);
5455
// OneSignalOutcomeEventsController.registerWith(messenger);
@@ -118,7 +119,6 @@ public void onMethodCall(MethodCall call, Result result) {
118119
private void initWithContext(MethodCall call, Result reply) {
119120
String appId = call.argument("appId");
120121
OneSignal.initWithContext(context, appId);
121-
122122
// if (hasSetRequiresPrivacyConsent && !OneSignal.userProvidedPrivacyConsent())
123123
// this.waitingForUserPrivacyConsent = true;
124124
// else
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package com.onesignal.flutter;
2+
3+
import android.util.Log;
4+
5+
6+
import com.onesignal.inAppMessages.IInAppMessage;
7+
import com.onesignal.inAppMessages.IInAppMessageClickHandler;
8+
import com.onesignal.inAppMessages.IInAppMessageClickResult;
9+
import com.onesignal.inAppMessages.IInAppMessageLifecycleHandler;
10+
11+
import org.json.JSONArray;
12+
import org.json.JSONException;
13+
import org.json.JSONObject;
14+
15+
import java.util.ArrayList;
16+
import java.util.HashMap;
17+
import java.util.Iterator;
18+
import java.util.List;
19+
20+
class OneSignalSerializer {
21+
static HashMap<String, Object> convertInAppMessageClickedActionToMap(IInAppMessageClickResult result) {
22+
HashMap<String, Object> hash = new HashMap<>();
23+
24+
hash.put("click_name", result.getAction().getClickName());
25+
hash.put("click_url", result.getAction().getClickUrl());
26+
hash.put("first_click", result.getAction().isFirstClick());
27+
hash.put("closes_message", result.getAction().getClosesMessage());
28+
29+
return hash;
30+
}
31+
32+
static HashMap<String, Object> convertInAppMessageToMap(IInAppMessage message) {
33+
HashMap<String, Object> hash = new HashMap<>();
34+
35+
hash.put("message_id", message.getMessageId());
36+
37+
return hash;
38+
}
39+
40+
41+
static HashMap<String, Object> convertJSONObjectToHashMap(JSONObject object) throws JSONException {
42+
HashMap<String, Object> hash = new HashMap<>();
43+
44+
if (object == null || object == JSONObject.NULL)
45+
return hash;
46+
47+
Iterator<String> keys = object.keys();
48+
49+
while (keys.hasNext()) {
50+
String key = keys.next();
51+
52+
if (object.isNull(key))
53+
continue;
54+
55+
Object val = object.get(key);
56+
57+
if (val instanceof JSONArray) {
58+
val = convertJSONArrayToList((JSONArray)val);
59+
} else if (val instanceof JSONObject) {
60+
val = convertJSONObjectToHashMap((JSONObject)val);
61+
}
62+
63+
hash.put(key, val);
64+
}
65+
66+
return hash;
67+
}
68+
69+
private static List<Object> convertJSONArrayToList(JSONArray array) throws JSONException {
70+
List<Object> list = new ArrayList<>();
71+
72+
for (int i = 0; i < array.length(); i++) {
73+
Object val = array.get(i);
74+
75+
if (val instanceof JSONArray)
76+
val = OneSignalSerializer.convertJSONArrayToList((JSONArray)val);
77+
else if (val instanceof JSONObject)
78+
val = convertJSONObjectToHashMap((JSONObject)val);
79+
80+
list.add(val);
81+
}
82+
83+
return list;
84+
}
85+
}

example/lib/main.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class _MyAppState extends State<MyApp> with OneSignalPushSubscriptionObserver {
3232
Future<void> initPlatformState() async {
3333
if (!mounted) return;
3434

35-
OneSignal.Debug.setLogLevel(OSLogLevel.none);
35+
OneSignal.Debug.setLogLevel(OSLogLevel.debug);
3636

3737
OneSignal.Debug.setAlertLevel(OSLogLevel.none);
3838

@@ -44,7 +44,7 @@ class _MyAppState extends State<MyApp> with OneSignalPushSubscriptionObserver {
4444
// Outcome Examples
4545
oneSignalOutcomeExamples();
4646

47-
OneSignal.shared.login("Testtesttest");
47+
// OneSignal.shared.login("Testtesttest");
4848

4949
// OneSignal.shared.setRequiresUserPrivacyConsent(_requireConsent);
5050

@@ -103,8 +103,8 @@ class _MyAppState extends State<MyApp> with OneSignalPushSubscriptionObserver {
103103
// _enableConsentButton = requiresConsent;
104104
// });
105105

106-
// // Some examples of how to use In App Messaging public methods with OneSignal SDK
107-
// oneSignalInAppMessagingTriggerExamples();
106+
// Some examples of how to use In App Messaging public methods with OneSignal SDK
107+
oneSignalInAppMessagingTriggerExamples();
108108

109109
// OneSignal.shared.disablePush(false);
110110

@@ -293,7 +293,7 @@ class _MyAppState extends State<MyApp> with OneSignalPushSubscriptionObserver {
293293
List<String> keys = ["trigger_1", "trigger_3"];
294294
OneSignal.InAppMessages.removeTriggers(keys);
295295

296-
OneSignal.InAppMessages.clearTriggers();
296+
// OneSignal.InAppMessages.clearTriggers();
297297

298298
// Toggle pausing (displaying or not) of IAMs
299299
OneSignal.InAppMessages.paused(false);

0 commit comments

Comments
 (0)