Skip to content

Commit 11f11a0

Browse files
committed
Adding Android Impl behind in app messages
1 parent b6285e1 commit 11f11a0

File tree

6 files changed

+231
-24
lines changed

6 files changed

+231
-24
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: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
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+
private static final OneSignalInAppMessages sharedInstance = new OneSignalInAppMessages();
27+
28+
static void registerWith(BinaryMessenger messenger) {
29+
30+
sharedInstance.messenger = messenger;
31+
sharedInstance.channel = new MethodChannel(messenger, "OneSignal#inappmessages");
32+
sharedInstance.channel.setMethodCallHandler(sharedInstance);
33+
34+
35+
OneSignalInAppMessages.sharedInstance.setInAppMessageLifecycleHandler();
36+
OneSignal.getInAppMessages().setInAppMessageClickHandler(null);
37+
}
38+
39+
@Override
40+
public void onMethodCall(MethodCall call, Result result) {
41+
if (call.method.contentEquals("OneSignal#addTrigger"))
42+
this.addTriggers(call, result);
43+
else if (call.method.contentEquals("OneSignal#addTriggers"))
44+
this.addTriggers(call, result);
45+
else if (call.method.contentEquals("OneSignal#removeTrigger"))
46+
this.removeTrigger(call, result);
47+
else if (call.method.contentEquals("OneSignal#removeTriggers"))
48+
this.removeTriggers(call, result);
49+
else if (call.method.contentEquals("OneSignal#arePaused"))
50+
replySuccess(result, OneSignal.getInAppMessages().getPaused());
51+
else if (call.method.contentEquals("OneSignal#paused"))
52+
this.paused(call, result);
53+
else if (call.method.contentEquals("OneSignal#initInAppMessageClickedHandlerParams"))
54+
this.initInAppMessageClickedHandlerParams();
55+
else
56+
replyNotImplemented(result);
57+
}
58+
59+
private void addTriggers(MethodCall call, Result result) {
60+
// call.arguments is being casted to a Map<String, Object> so a try-catch with
61+
// a ClassCastException will be thrown
62+
try {
63+
OneSignal.getInAppMessages().addTriggers((Map<String, Object>) call.arguments);
64+
replySuccess(result, null);
65+
} catch (ClassCastException e) {
66+
replyError(result, "OneSignal", "Add triggers failed with error: " + e.getMessage() + "\n" + e.getStackTrace(), null);
67+
}
68+
}
69+
70+
private void removeTrigger(MethodCall call, Result result) {
71+
OneSignal.getInAppMessages().removeTrigger((String) call.arguments);
72+
replySuccess(result, null);
73+
}
74+
75+
private void removeTriggers(MethodCall call, Result result) {
76+
// call.arguments is being casted to a Collection<String> a try-catch with
77+
// a ClassCastException will be thrown
78+
try {
79+
OneSignal.getInAppMessages().removeTriggers((Collection<String>) call.arguments);
80+
replySuccess(result, null);
81+
} catch (ClassCastException e) {
82+
replyError(result, "OneSignal", "Remove triggers for keys failed with error: " + e.getMessage() + "\n" + e.getStackTrace(), null);
83+
}
84+
}
85+
86+
private void paused(MethodCall call, Result result) {
87+
OneSignal.getInAppMessages().setPaused((boolean) call.arguments);
88+
replySuccess(result, null);
89+
}
90+
91+
private void initInAppMessageClickedHandlerParams() {
92+
this.hasSetInAppMessageClickedHandler = true;
93+
if (this.inAppMessageClickedResult != null) {
94+
this.inAppMessageClicked(this.inAppMessageClickedResult);
95+
this.inAppMessageClickedResult = null;
96+
}
97+
}
98+
99+
public void inAppMessageClicked(IInAppMessageClickResult action) {
100+
if (!OneSignalInAppMessages.sharedInstance.hasSetInAppMessageClickedHandler) {
101+
OneSignalInAppMessages.sharedInstance.inAppMessageClickedResult = action;
102+
return;
103+
}
104+
105+
invokeMethodOnUiThread("OneSignal#handleClickedInAppMessage", OneSignalSerializer.convertInAppMessageClickedActionToMap(action));
106+
}
107+
108+
/* in app message lifecycle */
109+
public void setInAppMessageLifecycleHandler() {
110+
OneSignal.getInAppMessages().setInAppMessageLifecycleHandler(new IInAppMessageLifecycleHandler() {
111+
@Override
112+
public void onWillDisplayInAppMessage(IInAppMessage message) {
113+
invokeMethodOnUiThread("OneSignal#onWillDisplayInAppMessage", OneSignalSerializer.convertInAppMessageToMap(message));
114+
}
115+
116+
@Override
117+
public void onDidDisplayInAppMessage(IInAppMessage message) {
118+
invokeMethodOnUiThread("OneSignal#onDidDisplayInAppMessage", OneSignalSerializer.convertInAppMessageToMap(message));
119+
}
120+
121+
@Override
122+
public void onWillDismissInAppMessage(IInAppMessage message) {
123+
invokeMethodOnUiThread("OneSignal#onWillDismissInAppMessage", OneSignalSerializer.convertInAppMessageToMap(message));
124+
}
125+
126+
@Override
127+
public void onDidDismissInAppMessage(IInAppMessage message) {
128+
invokeMethodOnUiThread("OneSignal#onDidDismissInAppMessage", OneSignalSerializer.convertInAppMessageToMap(message));
129+
}
130+
});
131+
}
132+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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);
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: 11 additions & 11 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);
@@ -302,14 +302,14 @@ class _MyAppState extends State<MyApp> with OneSignalPushSubscriptionObserver {
302302
}
303303

304304
oneSignalOutcomeExamples() async {
305-
OneSignal.Session.addOutcome("normal_1");
306-
OneSignal.Session.addOutcome("normal_2");
305+
// OneSignal.Session.addOutcome("normal_1");
306+
// OneSignal.Session.addOutcome("normal_2");
307307

308-
OneSignal.Session.addUniqueOutcome("unique_1");
309-
OneSignal.Session.addUniqueOutcome("unique_2");
308+
// OneSignal.Session.addUniqueOutcome("unique_1");
309+
// OneSignal.Session.addUniqueOutcome("unique_2");
310310

311-
OneSignal.Session.addOutcomeWithValue("value_1", 3.2);
312-
OneSignal.Session.addOutcomeWithValue("value_2", 3.9);
311+
// OneSignal.Session.addOutcomeWithValue("value_1", 3.2);
312+
// OneSignal.Session.addOutcomeWithValue("value_2", 3.9);
313313
}
314314

315315
void _handleOptIn() {

0 commit comments

Comments
 (0)