Skip to content

Commit 1c184ff

Browse files
authored
Merge branch 'user-model/main' into fix/language_not_set
2 parents d49858c + 6839f4c commit 1c184ff

File tree

16 files changed

+53
-32
lines changed

16 files changed

+53
-32
lines changed

OneSignalSDK/onesignal/core/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ android {
4242
jvmTarget = '1.8'
4343
}
4444
namespace 'com.onesignal.core'
45+
46+
kotlinOptions.freeCompilerArgs += ['-module-name', namespace]
4547
}
4648

4749
tasks.withType(Test) {

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/common/TimeUtils.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ object TimeUtils {
1717
return offset / 1000
1818
}
1919

20-
fun getTimeZoneId(): String? {
20+
fun getTimeZoneId(): String {
2121
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
2222
ZoneId.systemDefault().id
2323
} else {

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/common/modeling/IModelStore.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ interface IModelStore<TModel> :
1616
*
1717
* @param jsonObject The optional [JSONObject] to initialize the new model with.
1818
*/
19-
fun create(jsonObject: JSONObject? = null): TModel
19+
fun create(jsonObject: JSONObject? = null): TModel?
2020

2121
/**
2222
* List the models that are owned by this model store.

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/common/modeling/ModelStore.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ abstract class ModelStore<TModel>(
126126
val str = _prefs.getString(PreferenceStores.ONESIGNAL, PreferenceOneSignalKeys.MODEL_STORE_PREFIX + name, "[]")
127127
val jsonArray = JSONArray(str)
128128
for (index in 0 until jsonArray.length()) {
129-
val newModel = create(jsonArray.getJSONObject(index))
129+
val newModel = create(jsonArray.getJSONObject(index)) ?: continue
130130
_models.add(newModel)
131131
// listen for changes to this model
132132
newModel.subscribe(this)

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/common/modeling/SingletonModelStore.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ open class SingletonModelStore<TModel>(
2424
return model
2525
}
2626

27-
val createdModel = store.create()
27+
val createdModel = store.create() ?: throw Exception("Unable to initialize model from store $store")
2828
createdModel.id = _singletonId
2929
store.add(createdModel)
3030
return createdModel

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/operations/IOperationExecutor.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,10 @@ enum class ExecutionResult {
6868
* retried if authorization can be achieved.
6969
*/
7070
FAIL_UNAUTHORIZED,
71+
72+
/**
73+
* Used in special login case.
74+
* The operation failed due to a conflict and can be handled.
75+
*/
76+
FAIL_CONFLICT,
7177
}

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/operations/impl/OperationModelStore.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ package com.onesignal.core.internal.operations.impl
33
import com.onesignal.common.modeling.ModelStore
44
import com.onesignal.core.internal.operations.Operation
55
import com.onesignal.core.internal.preferences.IPreferencesService
6+
import com.onesignal.debug.internal.logging.Logging
67
import com.onesignal.user.internal.operations.CreateSubscriptionOperation
78
import com.onesignal.user.internal.operations.DeleteAliasOperation
89
import com.onesignal.user.internal.operations.DeleteSubscriptionOperation
910
import com.onesignal.user.internal.operations.DeleteTagOperation
1011
import com.onesignal.user.internal.operations.LoginUserOperation
12+
import com.onesignal.user.internal.operations.LoginUserFromSubscriptionOperation
1113
import com.onesignal.user.internal.operations.RefreshUserOperation
1214
import com.onesignal.user.internal.operations.SetAliasOperation
1315
import com.onesignal.user.internal.operations.SetPropertyOperation
@@ -18,6 +20,7 @@ import com.onesignal.user.internal.operations.TrackSessionStartOperation
1820
import com.onesignal.user.internal.operations.TransferSubscriptionOperation
1921
import com.onesignal.user.internal.operations.UpdateSubscriptionOperation
2022
import com.onesignal.user.internal.operations.impl.executors.IdentityOperationExecutor
23+
import com.onesignal.user.internal.operations.impl.executors.LoginUserFromSubscriptionOperationExecutor
2124
import com.onesignal.user.internal.operations.impl.executors.LoginUserOperationExecutor
2225
import com.onesignal.user.internal.operations.impl.executors.RefreshUserOperationExecutor
2326
import com.onesignal.user.internal.operations.impl.executors.SubscriptionOperationExecutor
@@ -30,13 +33,15 @@ internal class OperationModelStore(prefs: IPreferencesService) : ModelStore<Oper
3033
load()
3134
}
3235

33-
override fun create(jsonObject: JSONObject?): Operation {
36+
override fun create(jsonObject: JSONObject?): Operation? {
3437
if (jsonObject == null) {
35-
throw NullPointerException("jsonObject")
38+
Logging.error("null jsonObject sent to OperationModelStore.create")
39+
return null
3640
}
3741

3842
if (!jsonObject.has(Operation::name.name)) {
39-
throw IllegalArgumentException("jsonObject must have '${Operation::name.name}' attribute")
43+
Logging.error("jsonObject must have '${Operation::name.name}' attribute")
44+
return null
4045
}
4146

4247
// Determine the type of operation based on the name property in the json
@@ -48,6 +53,7 @@ internal class OperationModelStore(prefs: IPreferencesService) : ModelStore<Oper
4853
SubscriptionOperationExecutor.DELETE_SUBSCRIPTION -> DeleteSubscriptionOperation()
4954
SubscriptionOperationExecutor.TRANSFER_SUBSCRIPTION -> TransferSubscriptionOperation()
5055
LoginUserOperationExecutor.LOGIN_USER -> LoginUserOperation()
56+
LoginUserFromSubscriptionOperationExecutor.LOGIN_USER_FROM_SUBSCRIPTION_USER -> LoginUserFromSubscriptionOperation()
5157
RefreshUserOperationExecutor.REFRESH_USER -> RefreshUserOperation()
5258
UpdateUserOperationExecutor.SET_TAG -> SetTagOperation()
5359
UpdateUserOperationExecutor.DELETE_TAG -> DeleteTagOperation()

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/operations/impl/OperationRepo.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ internal class OperationRepo(
167167
}
168168
ExecutionResult.FAIL_UNAUTHORIZED, // TODO: Need to provide callback for app to reset JWT. For now, fail with no retry.
169169
ExecutionResult.FAIL_NORETRY,
170+
ExecutionResult.FAIL_CONFLICT,
170171
-> {
171172
Logging.error("Operation execution failed without retry: $operations")
172173
// on failure we remove the operation from the store and wake any waiters

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/operations/impl/executors/IdentityOperationExecutor.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,10 @@ internal class IdentityOperationExecutor(
5151
return when (responseType) {
5252
NetworkUtils.ResponseStatusType.RETRYABLE ->
5353
ExecutionResponse(ExecutionResult.FAIL_RETRY)
54-
NetworkUtils.ResponseStatusType.INVALID,
55-
NetworkUtils.ResponseStatusType.CONFLICT,
56-
->
54+
NetworkUtils.ResponseStatusType.INVALID ->
5755
ExecutionResponse(ExecutionResult.FAIL_NORETRY)
56+
NetworkUtils.ResponseStatusType.CONFLICT ->
57+
ExecutionResponse(ExecutionResult.FAIL_CONFLICT)
5858
NetworkUtils.ResponseStatusType.UNAUTHORIZED ->
5959
ExecutionResponse(ExecutionResult.FAIL_UNAUTHORIZED)
6060
NetworkUtils.ResponseStatusType.MISSING -> {

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/operations/impl/executors/LoginUserOperationExecutor.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,16 @@ internal class LoginUserOperationExecutor(
8282

8383
ExecutionResponse(ExecutionResult.SUCCESS_STARTING_ONLY, mapOf(loginUserOp.onesignalId to backendOneSignalId))
8484
}
85+
ExecutionResult.FAIL_CONFLICT -> {
86+
// When the SetAliasOperation fails with conflict that *most likely* means the externalId provided
87+
// is already associated to a user. This *expected* condition means we must create a user.
88+
// We hardcode the response of "user-2" in the log to provide information to the SDK consumer
89+
Logging.debug("LoginUserOperationExecutor now handling 409 response with \"code\": \"user-2\" by switching to user with \"external_id\": \"${loginUserOp.externalId}\"")
90+
createUser(loginUserOp, operations)
91+
}
8592
ExecutionResult.FAIL_NORETRY -> {
86-
// When the SetAliasOperation fails without retry that *most likely* means the externalId provided
87-
// is already associated to a user. This expected condition means we must create a user.
93+
// Some other failure occurred, still try to recover by creating the user
94+
Logging.error("LoginUserOperationExecutor encountered error. Attempt to recover by switching to user with \"external_id\": \"${loginUserOp.externalId}\"")
8895
createUser(loginUserOp, operations)
8996
}
9097
else -> ExecutionResponse(result.result)

0 commit comments

Comments
 (0)