Skip to content

Commit 39691a9

Browse files
committed
Make IAM influence after IAM dismiss
Add click action handler * Changes Tests to accomplish new functionality * Minor improvements changes * If the user sends and outcome from the click action handler callback, that outcome should be DIRECT influenced by IAM DIRECT influences by IAM can be from click action handler or click action outcome
1 parent 33c17e2 commit 39691a9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+595
-718
lines changed

OneSignalSDK/app/src/main/java/com/onesignal/MainActivity.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
import com.onesignal.example.R;
5252
import com.onesignal.example.iap.IabHelper;
5353
import com.onesignal.example.iap.IabResult;
54-
import com.onesignal.outcomes.model.OSOutcomeEventParams;
5554

5655
import org.json.JSONException;
5756
import org.json.JSONObject;
@@ -371,7 +370,7 @@ public void onFailure(OneSignal.EmailUpdateError error) {
371370
public void onSendOutcomeClicked(View view) {
372371
OneSignal.sendOutcome(outcomeName.getText().toString(), new OneSignal.OutcomeCallback() {
373372
@Override
374-
public void onSuccess(@Nullable OSOutcomeEventParams outcomeEvent) {
373+
public void onSuccess(@Nullable OutcomeEvent outcomeEvent) {
375374
if (outcomeEvent != null)
376375
updateTextView(outcomeEvent.toString());
377376
}
@@ -381,7 +380,7 @@ public void onSuccess(@Nullable OSOutcomeEventParams outcomeEvent) {
381380
public void onSendUniqueOutcomeClicked(View view) {
382381
OneSignal.sendUniqueOutcome(outcomeUnique.getText().toString(), new OneSignal.OutcomeCallback() {
383382
@Override
384-
public void onSuccess(@Nullable OSOutcomeEventParams outcomeEvent) {
383+
public void onSuccess(@Nullable OutcomeEvent outcomeEvent) {
385384
if (outcomeEvent != null)
386385
updateTextView(outcomeEvent.toString());
387386
}
@@ -394,7 +393,7 @@ public void onSendOutcomeWithValueClicked(View view) {
394393

395394
OneSignal.sendOutcomeWithValue(outcomeValueName.getText().toString(), Float.parseFloat(outcomeValue.getText().toString()), new OneSignal.OutcomeCallback() {
396395
@Override
397-
public void onSuccess(@Nullable OSOutcomeEventParams outcomeEvent) {
396+
public void onSuccess(@Nullable OutcomeEvent outcomeEvent) {
398397
if (outcomeEvent != null)
399398
updateTextView(outcomeEvent.toString());
400399
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ protected void sendTime(@NonNull FocusEventType focusType) {
124124

125125
@Override
126126
protected void saveInfluences(List<OSInfluence> influences) {
127-
// We don't save influences for unattributed
127+
// We don't save influences for unattributed, there is no session duration influenced
128128
}
129129
}
130130

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ void onMessageActionOccurredOnMessage(@NonNull final OSInAppMessage message, @No
271271
final OSInAppMessageAction action = new OSInAppMessageAction(actionJson);
272272
action.firstClick = message.takeActionAsUnique();
273273

274-
firePublicClickHandler(action);
274+
firePublicClickHandler(message.messageId, action);
275275
beginProcessingPrompts(message, action.prompts);
276276
fireClickAction(action);
277277
fireRESTCallForClick(message, action);
@@ -283,7 +283,7 @@ void onMessageActionOccurredOnPreview(@NonNull final OSInAppMessage message, @No
283283
final OSInAppMessageAction action = new OSInAppMessageAction(actionJson);
284284
action.firstClick = message.takeActionAsUnique();
285285

286-
firePublicClickHandler(action);
286+
firePublicClickHandler(message.messageId, action);
287287
beginProcessingPrompts(message, action.prompts);
288288
fireClickAction(action);
289289
logInAppMessagePreviewActions(action);
@@ -369,13 +369,18 @@ private void fireTagCallForClick(@NonNull final OSInAppMessageAction action) {
369369
}
370370
}
371371

372-
private void firePublicClickHandler(@NonNull final OSInAppMessageAction action) {
372+
private void firePublicClickHandler(@NonNull final String messageId, @NonNull final OSInAppMessageAction action) {
373373
if (OneSignal.mInitBuilder.mInAppMessageClickHandler == null)
374374
return;
375375

376376
OSUtils.runOnMainUIThread(new Runnable() {
377377
@Override
378378
public void run() {
379+
// Send public outcome from handler
380+
// Send public outcome not from handler
381+
// Check that only on the handler
382+
// Any outcome sent on this callback should count as DIRECT from this IAM
383+
OneSignal.getSessionManager().onDirectInfluenceFromIAMClick(messageId);
379384
OneSignal.mInitBuilder.mInAppMessageClickHandler.inAppMessageClicked(action);
380385
}
381386
});
@@ -531,6 +536,9 @@ void messageWasDismissed(@NonNull OSInAppMessage message) {
531536
}
532537

533538
void messageWasDismissed(@NonNull OSInAppMessage message, boolean failed) {
539+
// Remove DIRECT influence due to ClickHandler of ClickAction outcomes
540+
OneSignal.getSessionManager().onDirectInfluenceFromIAMClickFinished();
541+
534542
if (!message.isPreview) {
535543
dismissedMessages.add(message.messageId);
536544
// If failed we will retry on next session

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,20 @@
66
class OSLogWrapper implements OSLogger {
77

88

9-
public void log(@NonNull String message) {
9+
public void verbose(@NonNull String message) {
1010
OneSignal.Log(OneSignal.LOG_LEVEL.VERBOSE, message);
1111
}
1212

13-
@Override
14-
public void log(@NonNull OneSignal.LOG_LEVEL level, @NonNull String message) {
15-
OneSignal.Log(level, message);
13+
public void debug(@NonNull String message) {
14+
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, message);
1615
}
1716

18-
@Override
19-
public void log(@NonNull OneSignal.LOG_LEVEL level, @NonNull String message, @Nullable Throwable throwable) {
20-
OneSignal.Log(level, message, throwable);
17+
public void warning(@NonNull String message) {
18+
OneSignal.Log(OneSignal.LOG_LEVEL.WARN, message);
2119
}
20+
21+
public void error(@NonNull String message, @Nullable Throwable throwable) {
22+
OneSignal.Log(OneSignal.LOG_LEVEL.ERROR, message, throwable);
23+
}
24+
2225
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,12 @@
55

66
public interface OSLogger {
77

8-
void log(@NonNull OneSignal.LOG_LEVEL level, @NonNull String message);
8+
void verbose(@NonNull String message);
99

10-
void log(@NonNull final OneSignal.LOG_LEVEL level, @NonNull String message, @Nullable Throwable throwable);
10+
void debug(@NonNull String message);
11+
12+
void warning(@NonNull String message);
13+
14+
void error(@NonNull String message, @Nullable Throwable throwable);
1115

1216
}

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

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,6 @@ void sendClickActionOutcomes(List<OSInAppMessageOutcome> outcomes) {
104104
sendOutcomeEvent(name, null);
105105
}
106106
}
107-
// Requests are sent or cached at this point
108-
osSessionManager.onDirectInfluenceFromIAMClickFinished();
109107
}
110108

111109
void sendUniqueOutcomeEvent(@NonNull final String name, @Nullable OneSignal.OutcomeCallback callback) {
@@ -135,15 +133,12 @@ private void sendUniqueOutcomeEvent(@NonNull final String name, @NonNull List<OS
135133
}
136134

137135
boolean attributed = false;
138-
boolean unattributed = false;
139136
for (OSInfluence influence : influences) {
140137
if (influence.getInfluenceType().isAttributed()) {
141138
// At least one channel attributed this outcome
142139
attributed = true;
143140
break;
144-
} else if (influence.getInfluenceType().isUnattributed()) {
145-
unattributed = true;
146-
} // else DISABLED
141+
}
147142
}
148143

149144
// Special handling for unique outcomes in the attributed and unattributed scenarios
@@ -164,7 +159,7 @@ private void sendUniqueOutcomeEvent(@NonNull final String name, @NonNull List<OS
164159
}
165160

166161
sendAndCreateOutcomeEvent(name, 0, uniqueInfluences, callback);
167-
} else if (unattributed) {
162+
} else {
168163
// Make sure unique outcome has not been sent for current unattributed session
169164
if (unattributedUniqueOutcomeEventsSentOnSession.contains(name)) {
170165
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG,
@@ -181,8 +176,6 @@ private void sendUniqueOutcomeEvent(@NonNull final String name, @NonNull List<OS
181176

182177
unattributedUniqueOutcomeEventsSentOnSession.add(name);
183178
sendAndCreateOutcomeEvent(name, 0, influences, callback);
184-
} else {
185-
OneSignal.Log(OneSignal.LOG_LEVEL.VERBOSE, "Outcomes disabled");
186179
}
187180
}
188181

@@ -232,7 +225,7 @@ public void onSuccess(String response) {
232225

233226
// The only case where an actual success has occurred and the OutcomeEvent should be sent back
234227
if (callback != null)
235-
callback.onSuccess(eventParams);
228+
callback.onSuccess(OutcomeEvent.fromOutcomeEventParamsV2toOutcomeEventV1(eventParams));
236229
}
237230

238231
@Override

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

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,28 +40,28 @@ public OSSessionManager(@NonNull SessionListener sessionListener, OSTrackerFacto
4040
}
4141

4242
void initSessionFromCache() {
43-
logger.log(OneSignal.LOG_LEVEL.DEBUG, "OneSignal SessionManager initSessionFromCache");
43+
logger.debug("OneSignal SessionManager initSessionFromCache");
4444
trackerFactory.initFromCache();
4545
}
4646

4747
void addSessionIds(@NonNull JSONObject jsonObject, List<OSInfluence> endingInfluences) {
48-
logger.log(OneSignal.LOG_LEVEL.DEBUG, "OneSignal SessionManager addSessionData with influences: " + endingInfluences.toString());
48+
logger.debug("OneSignal SessionManager addSessionData with influences: " + endingInfluences.toString());
4949
trackerFactory.addSessionData(jsonObject, endingInfluences);
50-
logger.log(OneSignal.LOG_LEVEL.DEBUG, "OneSignal SessionManager addSessionIds on jsonObject: " + jsonObject);
50+
logger.debug("OneSignal SessionManager addSessionIds on jsonObject: " + jsonObject);
5151
}
5252

5353
void restartSessionIfNeeded(OneSignal.AppEntryAction entryAction) {
54-
List<OSChannelTracker> channelTrackers = trackerFactory.getChannelToResetByEntryAction(entryAction);
54+
List<OSChannelTracker> channelTrackers = trackerFactory.getChannelsToResetByEntryAction(entryAction);
5555
List<OSInfluence> updatedInfluences = new ArrayList<>();
5656

57-
logger.log(OneSignal.LOG_LEVEL.DEBUG, "OneSignal SessionManager restartSessionIfNeeded with entryAction: " + entryAction + "\n channelTrackers: " + channelTrackers.toString());
57+
logger.debug("OneSignal SessionManager restartSessionIfNeeded with entryAction: " + entryAction + "\n channelTrackers: " + channelTrackers.toString());
5858
for (OSChannelTracker channelTracker : channelTrackers) {
5959
JSONArray lastIds = channelTracker.getLastReceivedIds();
60-
logger.log(OneSignal.LOG_LEVEL.DEBUG, "OneSignal SessionManager restartSessionIfNeeded lastIds: " + lastIds);
60+
logger.debug("OneSignal SessionManager restartSessionIfNeeded lastIds: " + lastIds);
6161

6262
OSInfluence influence = channelTracker.getCurrentSessionInfluence();
6363
boolean updated;
64-
if (lastIds != null && lastIds.length() > 0)
64+
if (lastIds.length() > 0)
6565
updated = setSession(channelTracker, OSInfluenceType.INDIRECT, null, lastIds);
6666
else
6767
updated = setSession(channelTracker, OSInfluenceType.UNATTRIBUTED, null, null);
@@ -74,34 +74,35 @@ void restartSessionIfNeeded(OneSignal.AppEntryAction entryAction) {
7474
}
7575

7676
void onInAppMessageReceived(@NonNull String messageId) {
77-
logger.log(OneSignal.LOG_LEVEL.DEBUG, "OneSignal SessionManager onInAppMessageReceived messageId: " + messageId);
77+
logger.debug("OneSignal SessionManager onInAppMessageReceived messageId: " + messageId);
7878
OSChannelTracker inAppMessageTracker = trackerFactory.getIAMChannelTracker();
7979
inAppMessageTracker.saveLastId(messageId);
80+
inAppMessageTracker.resetAndInitInfluence();
8081
}
8182

8283
void onDirectInfluenceFromIAMClick(@NonNull String messageId) {
83-
logger.log(OneSignal.LOG_LEVEL.DEBUG, "OneSignal SessionManager onDirectInfluenceFromIAMClick messageId: " + messageId);
84+
logger.debug("OneSignal SessionManager onDirectInfluenceFromIAMClick messageId: " + messageId);
8485
OSChannelTracker inAppMessageTracker = trackerFactory.getIAMChannelTracker();
8586
// We don't care about ending the session duration because IAM doesn't influence a session
8687
setSession(inAppMessageTracker, OSInfluenceType.DIRECT, messageId, null);
8788
}
8889

8990
void onDirectInfluenceFromIAMClickFinished() {
90-
logger.log(OneSignal.LOG_LEVEL.DEBUG, "OneSignal SessionManager onDirectInfluenceFromIAMClickFinished");
91+
logger.debug("OneSignal SessionManager onDirectInfluenceFromIAMClickFinished");
9192
OSChannelTracker inAppMessageTracker = trackerFactory.getIAMChannelTracker();
9293
inAppMessageTracker.resetAndInitInfluence();
9394
}
9495

9596
void onNotificationReceived(@Nullable String notificationId) {
96-
logger.log(OneSignal.LOG_LEVEL.DEBUG, "OneSignal SessionManager onNotificationReceived notificationId: " + notificationId);
97+
logger.debug("OneSignal SessionManager onNotificationReceived notificationId: " + notificationId);
9798
if (notificationId == null || notificationId.isEmpty())
9899
return;
99100
OSChannelTracker notificationTracker = trackerFactory.getNotificationChannelTracker();
100101
notificationTracker.saveLastId(notificationId);
101102
}
102103

103104
void onDirectInfluenceFromNotificationOpen(OneSignal.AppEntryAction entryAction, @Nullable String notificationId) {
104-
logger.log(OneSignal.LOG_LEVEL.DEBUG, "OneSignal SessionManager onDirectInfluenceFromNotificationOpen notificationId: " + notificationId);
105+
logger.debug("OneSignal SessionManager onDirectInfluenceFromNotificationOpen notificationId: " + notificationId);
105106
if (notificationId == null || notificationId.isEmpty())
106107
return;
107108

@@ -126,9 +127,9 @@ void attemptSessionUpgrade(OneSignal.AppEntryAction entryAction) {
126127
}
127128

128129
private void attemptSessionUpgrade(OneSignal.AppEntryAction entryAction, @Nullable String directId) {
129-
logger.log(OneSignal.LOG_LEVEL.DEBUG, "OneSignal SessionManager attemptSessionUpgrade with entryAction: " + entryAction);
130+
logger.debug("OneSignal SessionManager attemptSessionUpgrade with entryAction: " + entryAction);
130131
OSChannelTracker channelTrackerByAction = trackerFactory.getChannelByEntryAction(entryAction);
131-
List<OSChannelTracker> channelTrackersToReset = trackerFactory.getChannelToResetByEntryAction(entryAction);
132+
List<OSChannelTracker> channelTrackersToReset = trackerFactory.getChannelsToResetByEntryAction(entryAction);
132133
List<OSInfluence> influencesToEnd = new ArrayList<>();
133134
OSInfluence lastInfluence = null;
134135

@@ -143,7 +144,7 @@ private void attemptSessionUpgrade(OneSignal.AppEntryAction entryAction, @Nullab
143144
}
144145

145146
if (updated) {
146-
logger.log(OneSignal.LOG_LEVEL.DEBUG, "OneSignal SessionManager attemptSessionUpgrade channel updated, search for ending direct influences on channels: " + channelTrackersToReset);
147+
logger.debug("OneSignal SessionManager attemptSessionUpgrade channel updated, search for ending direct influences on channels: " + channelTrackersToReset);
147148
influencesToEnd.add(lastInfluence);
148149
// Only one session influence channel can be DIRECT at the same time
149150
// Reset other DIRECT channels, they will init an INDIRECT influence
@@ -155,13 +156,13 @@ private void attemptSessionUpgrade(OneSignal.AppEntryAction entryAction, @Nullab
155156
}
156157
}
157158
}
158-
logger.log(OneSignal.LOG_LEVEL.DEBUG, "OneSignal SessionManager attemptSessionUpgrade try UNATTRIBUTED to INDIRECT upgrade");
159+
logger.debug("OneSignal SessionManager attemptSessionUpgrade try UNATTRIBUTED to INDIRECT upgrade");
159160
// We will try to override the UNATTRIBUTED session with INDIRECT
160161
for (OSChannelTracker channelTracker : channelTrackersToReset) {
161162
if (channelTracker.getInfluenceType().isUnattributed()) {
162163
JSONArray lastIds = channelTracker.getLastReceivedIds();
163164
// There are new ids for attribution and the application was open again without resetting session
164-
if (lastIds != null && lastIds.length() > 0 && !entryAction.isAppClose()) {
165+
if (lastIds.length() > 0 && !entryAction.isAppClose()) {
165166
// Save influence to ended it later if needed
166167
// This influence will be unattributed
167168
OSInfluence influence = channelTracker.getCurrentSessionInfluence();
@@ -229,7 +230,7 @@ private boolean willChangeSession(@NonNull OSChannelTracker channelTracker,
229230
}
230231

231232
private void sendSessionEndingWithInfluences(List<OSInfluence> endingInfluences) {
232-
logger.log(OneSignal.LOG_LEVEL.DEBUG, "OneSignal SessionManager sendSessionEndingWithInfluences with influences: " + endingInfluences);
233+
logger.debug("OneSignal SessionManager sendSessionEndingWithInfluences with influences: " + endingInfluences);
233234
// Only end session if there are influences available to end
234235
if (endingInfluences.size() > 0)
235236
sessionListener.onSessionEnding(endingInfluences);

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
import com.onesignal.influence.OSTrackerFactory;
5151
import com.onesignal.influence.model.OSInfluence;
5252
import com.onesignal.outcomes.OSOutcomeEventsFactory;
53-
import com.onesignal.outcomes.model.OSOutcomeEventParams;
5453

5554
import org.json.JSONArray;
5655
import org.json.JSONException;
@@ -1045,10 +1044,10 @@ public void complete(OneSignalRemoteParams.Params params) {
10451044
);
10461045
OneSignalPrefs.saveBool(
10471046
OneSignalPrefs.PREFS_ONESIGNAL,
1048-
OneSignalPrefs.PREFS_OS_OUTCOMES_V2,
1049-
params.influenceParams.v2Enabled
1047+
preferences.getOutcomesV2KeyName(),
1048+
params.influenceParams.outcomesV2ServiceEnabled
10501049
);
1051-
logger.log(LOG_LEVEL.DEBUG, "OneSignal saveInfluenceParams: " + params.influenceParams.toString());
1050+
logger.debug("OneSignal saveInfluenceParams: " + params.influenceParams.toString());
10521051
trackerFactory.saveInfluenceParams(params.influenceParams);
10531052

10541053
NotificationChannelManager.processChannelList(
@@ -3258,7 +3257,7 @@ private static boolean isValidOutcomeEntry(String name) {
32583257
* 3. Unique OutcomeEventParams already sent for UNATTRIBUTED session during session
32593258
*/
32603259
public interface OutcomeCallback {
3261-
void onSuccess(@Nullable OSOutcomeEventParams outcomeEvent);
3260+
void onSuccess(@Nullable OutcomeEvent outcomeEvent);
32623261
}
32633262
/*
32643263
* End OneSignalOutcome module

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ class OneSignalPrefs {
102102
// Receive Receipts (aka Confirmed Deliveries)
103103
public static final String PREFS_OS_RECEIVE_RECEIPTS_ENABLED = "PREFS_OS_RECEIVE_RECEIPTS_ENABLED";
104104
// Outcomes
105-
public static final String PREFS_OS_OUTCOMES_V2 = "PREFS_OS_OUTCOMES_V2";
105+
static final String PREFS_OS_OUTCOMES_V2 = "PREFS_OS_OUTCOMES_V2";
106106
// Player Purchase Keys
107107
static final String PREFS_PURCHASE_TOKENS = "purchaseTokens";
108108
static final String PREFS_EXISTING_PURCHASES = "ExistingPurchases";

0 commit comments

Comments
 (0)