Skip to content

Commit 9ed0e56

Browse files
committed
Merge branch 'master' into major_release_4.0.0
2 parents 2c0b2d9 + f9eb83c commit 9ed0e56

13 files changed

+496
-157
lines changed

OneSignalSDK.jar

2.48 KB
Binary file not shown.

OneSignalSDK/onesignal/maven-push.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class Global {
2424
static def POM_NAME = 'OneSignal'
2525
static def POM_ARTIFACT_ID = 'OneSignal'
2626
static def POM_PACKAGING = 'aar'
27-
static def VERSION_NAME = '3.15.3'
27+
static def VERSION_NAME = '3.15.4'
2828

2929
static def GROUP_ID = 'com.onesignal'
3030
static def POM_DESCRIPTION = 'OneSignal Android SDK'
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/**
2+
* Modified MIT License
3+
* <p>
4+
* Copyright 2020 OneSignal
5+
* <p>
6+
* Permission is hereby granted, free of charge, to any person obtaining a copy
7+
* of this software and associated documentation files (the "Software"), to deal
8+
* in the Software without restriction, including without limitation the rights
9+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
* copies of the Software, and to permit persons to whom the Software is
11+
* furnished to do so, subject to the following conditions:
12+
* <p>
13+
* 1. The above copyright notice and this permission notice shall be included in
14+
* all copies or substantial portions of the Software.
15+
* <p>
16+
* 2. All copies of substantial portions of the Software may only be used in connection
17+
* with services provided by OneSignal.
18+
* <p>
19+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25+
* THE SOFTWARE.
26+
*/
27+
28+
package com.onesignal;
29+
30+
import org.json.JSONException;
31+
import org.json.JSONObject;
32+
33+
class ImmutableJSONObject {
34+
35+
private final JSONObject jsonObject;
36+
37+
public ImmutableJSONObject() {
38+
this.jsonObject = new JSONObject();
39+
}
40+
41+
public ImmutableJSONObject(JSONObject jsonObject) {
42+
this.jsonObject = jsonObject;
43+
}
44+
45+
public long getLong(String name) throws JSONException {
46+
return jsonObject.getLong(name);
47+
}
48+
49+
public boolean has(String name) {
50+
return jsonObject.has(name);
51+
}
52+
53+
public Object opt(String name) {
54+
return jsonObject.opt(name);
55+
}
56+
57+
public String optString(String name) {
58+
return jsonObject.optString(name);
59+
}
60+
61+
public String optString(String name, String fallback) {
62+
return jsonObject.optString(name, fallback);
63+
}
64+
65+
public boolean optBoolean(String name) {
66+
return jsonObject.optBoolean(name);
67+
}
68+
69+
public boolean optBoolean(String name, boolean fallback) {
70+
return jsonObject.optBoolean(name, fallback);
71+
}
72+
73+
public long optLong(String name) {
74+
return jsonObject.optLong(name);
75+
}
76+
77+
public int optInt(String name) {
78+
return jsonObject.optInt(name);
79+
}
80+
81+
public int optInt(String name, int fallback) {
82+
return jsonObject.optInt(name, fallback);
83+
}
84+
85+
public JSONObject optJSONObject(String name) {
86+
return jsonObject.optJSONObject(name);
87+
}
88+
89+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ static String toStringNE(JSONArray jsonArray) {
130130
return strArray + "]";
131131
}
132132

133-
static JSONObject getJSONObjectWithoutBlankValues(JSONObject jsonObject, String getKey) {
133+
static JSONObject getJSONObjectWithoutBlankValues(ImmutableJSONObject jsonObject, String getKey) {
134134
if (!jsonObject.has(getKey))
135135
return null;
136136

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

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -230,8 +230,31 @@ public static class SendTagsError {
230230
public String getMessage() { return message; }
231231
}
232232

233+
public enum ExternalIdErrorType {
234+
REQUIRES_EXTERNAL_ID_AUTH, INVALID_OPERATION, NETWORK
235+
}
236+
237+
public static class ExternalIdError {
238+
private ExternalIdErrorType type;
239+
private String message;
240+
241+
ExternalIdError(ExternalIdErrorType type, String message) {
242+
this.type = type;
243+
this.message = message;
244+
}
245+
246+
public ExternalIdErrorType getType() {
247+
return type;
248+
}
249+
250+
public String getMessage() {
251+
return message;
252+
}
253+
}
254+
233255
public interface OSExternalUserIdUpdateCompletionHandler {
234256
void onComplete(JSONObject results);
257+
void onFailure(ExternalIdError error);
235258
}
236259

237260
interface OSInternalExternalUserIdUpdateCompletionHandler {
@@ -324,7 +347,7 @@ static void setInForeground(boolean inForeground) {
324347
private static TrackAmazonPurchase trackAmazonPurchase;
325348
private static TrackFirebaseAnalytics trackFirebaseAnalytics;
326349

327-
public static final String VERSION = "031503";
350+
public static final String VERSION = "031504";
328351

329352
private static OSLogger logger = new OSLogWrapper();
330353
private static FocusTimeController focusTimeController = new FocusTimeController(new OSFocusTimeProcessorFactory(), logger);
@@ -1417,33 +1440,53 @@ public void run() {
14171440
}
14181441

14191442
public static void setExternalUserId(@NonNull final String externalId) {
1420-
setExternalUserId(externalId, null);
1443+
setExternalUserId(externalId, null, null);
14211444
}
14221445

14231446
public static void setExternalUserId(@NonNull final String externalId, @Nullable final OSExternalUserIdUpdateCompletionHandler completionCallback) {
1447+
setExternalUserId(externalId, null, completionCallback);
1448+
}
1449+
1450+
public static void setExternalUserId(@NonNull final String externalId, @Nullable final String externalIdAuthHash) {
1451+
setExternalUserId(externalId, externalIdAuthHash, null);
1452+
}
1453+
1454+
public static void setExternalUserId(@NonNull final String externalId, @Nullable final String externalIdAuthHash, @Nullable final OSExternalUserIdUpdateCompletionHandler completionCallback) {
14241455
if (taskController.shouldQueueTaskForInit(OSTaskController.SET_EXTERNAL_USER_ID)) {
14251456
logger.error("Waiting for remote params. " +
14261457
"Moving " + OSTaskController.SET_EXTERNAL_USER_ID + " operation to a pending task queue.");
14271458
taskController.addTaskToQueue(new Runnable() {
14281459
@Override
14291460
public void run() {
14301461
logger.debug("Running " + OSTaskController.SET_EXTERNAL_USER_ID + " operation from pending task queue.");
1431-
setExternalUserId(externalId, completionCallback);
1462+
setExternalUserId(externalId, externalIdAuthHash, completionCallback);
14321463
}
14331464
});
14341465
return;
14351466
}
14361467

1437-
if (shouldLogUserPrivacyConsentErrorMessageForMethodName(OSTaskController.SET_EXTERNAL_USER_ID))
1468+
if (shouldLogUserPrivacyConsentErrorMessageForMethodName("setExternalUserId()"))
14381469
return;
14391470

14401471
if (externalId == null) {
14411472
logger.warning("External id can't be null, set an empty string to remove an external id");
14421473
return;
14431474
}
14441475

1476+
if (getRemoteParams() != null && getRemoteParams().useUserIdAuth && externalIdAuthHash == null) {
1477+
String errorMessage = "External Id authentication (auth token) is set to REQUIRED for this application. Please provide an auth token from your backend server or change the setting in the OneSignal dashboard.";
1478+
if (completionCallback != null)
1479+
completionCallback.onFailure(new ExternalIdError(ExternalIdErrorType.REQUIRES_EXTERNAL_ID_AUTH, errorMessage));
1480+
logger.error(errorMessage);
1481+
return;
1482+
}
1483+
1484+
String lowerCaseIdAuthHash = externalIdAuthHash;
1485+
if (lowerCaseIdAuthHash != null)
1486+
lowerCaseIdAuthHash = externalIdAuthHash.toLowerCase();
1487+
14451488
try {
1446-
OneSignalStateSynchronizer.setExternalUserId(externalId, completionCallback);
1489+
OneSignalStateSynchronizer.setExternalUserId(externalId, lowerCaseIdAuthHash, completionCallback);
14471490
} catch (JSONException exception) {
14481491
String operation = externalId.equals("") ? "remove" : "set";
14491492
logger.error("Attempted to " + operation + " external ID but encountered a JSON exception");

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ static class Params {
7676
String googleProjectNumber;
7777
boolean enterprise;
7878
boolean useEmailAuth;
79+
boolean useUserIdAuth;
7980
JSONArray notificationChannels;
8081
boolean firebaseAnalytics;
8182
boolean restoreTTLFilter;
@@ -172,6 +173,7 @@ static private void processJson(String json, final @NonNull Callback callBack) {
172173
Params params = new Params() {{
173174
enterprise = responseJson.optBoolean("enterp", false);
174175
useEmailAuth = responseJson.optBoolean("use_email_auth", false);
176+
useUserIdAuth = responseJson.optBoolean("require_user_id_auth", false);
175177
notificationChannels = responseJson.optJSONArray("chnl_lst");
176178
firebaseAnalytics = responseJson.optBoolean("fba", false);
177179
restoreTTLFilter = responseJson.optBoolean("restore_ttl_filter", true);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ static void logoutEmail() {
187187
getEmailStateSynchronizer().logoutEmail();
188188
}
189189

190-
static void setExternalUserId(String externalId, final OneSignal.OSExternalUserIdUpdateCompletionHandler completionHandler) throws JSONException {
190+
static void setExternalUserId(String externalId, String externalIdAuthHash, final OneSignal.OSExternalUserIdUpdateCompletionHandler completionHandler) throws JSONException {
191191
final JSONObject responses = new JSONObject();
192192
// Create a handler for internal usage, this is where the developers completion handler will be called,
193193
// which happens once all handlers for each channel have been processed
@@ -222,11 +222,11 @@ public void run() {
222222
}
223223
};
224224

225-
getPushStateSynchronizer().setExternalUserId(externalId, handler);
225+
getPushStateSynchronizer().setExternalUserId(externalId, externalIdAuthHash, handler);
226226

227227
// Make sure we are only setting external user id for email when an email is actually set
228228
if (OneSignal.hasEmailId())
229-
getEmailStateSynchronizer().setExternalUserId(externalId, handler);
229+
getEmailStateSynchronizer().setExternalUserId(externalId, externalIdAuthHash, handler);
230230
}
231231

232232
// This is to indicate that StateSynchronizer can start making REST API calls

0 commit comments

Comments
 (0)