Skip to content

Commit 3be69a5

Browse files
committed
Add push prompt handling for IAM clicks
* Add prompt to IAM action * Show iOS prompt for location permission * Add test for prompt
1 parent b6f98eb commit 3be69a5

File tree

6 files changed

+86
-8
lines changed

6 files changed

+86
-8
lines changed

OneSignalSDK/onesignal/src/main/java/com/onesignal/LocationGMS.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,8 +334,7 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
334334
fireFailedComplete();
335335
}
336336
}
337-
338-
337+
339338
static class LocationUpdateListener implements LocationListener {
340339

341340
private GoogleApiClient mGoogleApiClient;

OneSignalSDK/onesignal/src/main/java/com/onesignal/OSInAppMessageAction.java

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import java.util.ArrayList;
1111
import java.util.List;
1212

13+
import static com.onesignal.OSInAppMessageLocationPrompt.LOCATION_PROMPT_KEY;
14+
1315
public class OSInAppMessageAction {
1416

1517
private static final String ID = "id";
@@ -25,6 +27,8 @@ public class OSInAppMessageAction {
2527
private static final String OUTCOMES = "outcomes";
2628
//TODO when backend is ready check if key match
2729
private static final String TAGS = "tags";
30+
//TODO when backend is ready check if key match
31+
private static final String PROMPTS = "prompts";
2832

2933
/**
3034
* UUID assigned by OneSignal for internal use.
@@ -57,6 +61,12 @@ public class OSInAppMessageAction {
5761
@NonNull
5862
public List<OSInAppMessageOutcome> outcomes = new ArrayList<>();
5963

64+
/**
65+
* Prompts for action
66+
*/
67+
@NonNull
68+
public List<OSInAppMessagePrompt> prompts = new ArrayList<>();
69+
6070
/** Tags for action */
6171
public OSInAppMessageTag tags;
6272

@@ -80,15 +90,30 @@ public class OSInAppMessageAction {
8090

8191
closesMessage = json.optBoolean(CLOSE, true);
8292

83-
if (json.has(OUTCOMES)) {
84-
JSONArray outcomesJsonArray = json.getJSONArray(OUTCOMES);
85-
for (int i = 0; i < outcomesJsonArray.length(); i++) {
86-
outcomes.add(new OSInAppMessageOutcome((JSONObject) outcomesJsonArray.get(i)));
87-
}
88-
}
93+
if (json.has(OUTCOMES))
94+
parseOutcomes(json);
8995

9096
if (json.has(TAGS))
9197
tags = new OSInAppMessageTag(json.getJSONObject(TAGS));
98+
99+
if (json.has(PROMPTS))
100+
parsePrompts(json);
101+
}
102+
103+
private void parseOutcomes(JSONObject json) throws JSONException {
104+
JSONArray outcomesJsonArray = json.getJSONArray(OUTCOMES);
105+
for (int i = 0; i < outcomesJsonArray.length(); i++) {
106+
outcomes.add(new OSInAppMessageOutcome((JSONObject) outcomesJsonArray.get(i)));
107+
}
108+
}
109+
110+
private void parsePrompts(JSONObject json) throws JSONException {
111+
JSONArray promptsJsonArray = json.getJSONArray(PROMPTS);
112+
for (int i = 0; i < promptsJsonArray.length(); i++) {
113+
if (promptsJsonArray.get(i).equals(LOCATION_PROMPT_KEY) ) {
114+
prompts.add(new OSInAppMessageLocationPrompt());
115+
}
116+
}
92117
}
93118

94119
public JSONObject toJSONObject() {

OneSignalSDK/onesignal/src/main/java/com/onesignal/OSInAppMessageController.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ void onMessageActionOccurredOnMessage(@NonNull final OSInAppMessage message, @No
272272
action.firstClick = message.takeActionAsUnique();
273273

274274
firePublicClickHandler(action);
275+
firePrompt(message, action.prompts);
275276
fireClickAction(action);
276277
fireRESTCallForClick(message, action);
277278
fireTagCallForClick(action);
@@ -286,6 +287,19 @@ void onMessageActionOccurredOnPreview(@NonNull final OSInAppMessage message, @No
286287
fireClickAction(action);
287288
}
288289

290+
private void firePrompt(OSInAppMessage message, final List<OSInAppMessagePrompt> prompts) {
291+
for (OSInAppMessagePrompt prompt : prompts) {
292+
// TODO until we don't fix the activity going forward or back dismissing the IAM, we need to auto dismiss
293+
messageWasDismissed(message);
294+
prompt.handlePrompt(new OneSignal.OperationCompletedCallback() {
295+
@Override
296+
public void completed(boolean result) {
297+
// TODO take care of multiple prompts
298+
}
299+
});
300+
}
301+
}
302+
289303
//TODO This is a temporal solution for IAMs outcomes
290304
// and will potentially change when we track IAMs
291305
private void fireOutcomesForClick(@NonNull final List<OSInAppMessageOutcome> outcomes) {
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.onesignal;
2+
3+
class OSInAppMessageLocationPrompt extends OSInAppMessagePrompt {
4+
5+
static final String LOCATION_PROMPT_KEY = "location";
6+
7+
@Override
8+
void handlePrompt(OneSignal.OperationCompletedCallback callback) {
9+
OneSignal.promptLocation(callback);
10+
}
11+
12+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.onesignal;
2+
3+
abstract class OSInAppMessagePrompt {
4+
5+
private boolean didAppear = false;
6+
7+
OSInAppMessagePrompt() {
8+
}
9+
10+
abstract void handlePrompt(OneSignal.OperationCompletedCallback callback);
11+
12+
public boolean didAppear() {
13+
return didAppear;
14+
}
15+
16+
public void setDidAppear(boolean didAppear) {
17+
this.didAppear = didAppear;
18+
}
19+
}

OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignal.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2486,7 +2486,10 @@ public static void setLocationShared(boolean enable) {
24862486
* @see <a href="https://documentation.onesignal.com/docs/permission-requests">Permission Requests | OneSignal Docs</a>
24872487
*/
24882488
public static void promptLocation() {
2489+
promptLocation(null);
2490+
}
24892491

2492+
static void promptLocation(@Nullable final OperationCompletedCallback callback) {
24902493
//if applicable, check if the user provided privacy consent
24912494
if (shouldLogUserPrivacyConsentErrorMessageForMethodName("promptLocation()"))
24922495
return;
@@ -2501,6 +2504,9 @@ public LocationGMS.CALLBACK_TYPE getType() {
25012504
}
25022505
@Override
25032506
public void complete(LocationGMS.LocationPoint point) {
2507+
if (callback != null) {
2508+
callback.completed(point != null);
2509+
}
25042510
//if applicable, check if the user provided privacy consent
25052511
if (shouldLogUserPrivacyConsentErrorMessageForMethodName("promptLocation()"))
25062512
return;
@@ -3226,4 +3232,7 @@ public interface OutcomeCallback {
32263232
* End OneSignalOutcome module
32273233
*/
32283234

3235+
interface OperationCompletedCallback {
3236+
void completed(boolean result);
3237+
}
32293238
}

0 commit comments

Comments
 (0)