Skip to content

Commit 0bf69c9

Browse files
committed
pause operationRepo until useIdentityVerification is determined from remote params
1 parent 138a6e1 commit 0bf69c9

File tree

7 files changed

+73
-10
lines changed

7 files changed

+73
-10
lines changed

Examples/OneSignalDemo/app/src/main/java/com/onesignal/sdktest/application/MainApplication.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ public void onUserStateChange(@NonNull UserChangedState state) {
144144
OneSignal.addUserJwtInvalidatedListner(new IUserJwtInvalidatedListener() {
145145
@Override
146146
public void onUserJwtInvalidated(@NonNull UserJwtInvalidatedEvent event) {
147+
// !!! For manual testing only
148+
String jwt = "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiIxNjg4ZDhmMi1kYTdmLTQ4MTUtOGVlMy05ZDEzNzg4NDgyYzgiLCJpYXQiOjE3MTgzMDk5NzIsImlkZW50aXR5Ijp7ImV4dGVybmFsX2lkIjoiYWxleC0wNjE0Iiwib25lc2lnbmFsX2lkIjoiYTViYjc4NDYtYzExNC00YzdkLTkzMWYtNGQ0NjhiMGE5OWJhIn0sInN1YnNjcmlwdGlvbnMiOlt7InR5cGUiOiJFbWFpbCIsInRva2VuIjoidGVzdEBkb21haW4uY29tIn0seyJpZCI6ImE2YzQxNmY3LTMxMGUtNDgzNi05Yjc4LWZiZmQ5NTgyNWNjNCJ9XX0.HsjsA2qNPwd9qov_8Px01km-dzRug-YKNNG85cMrGYI9Pdb2uoPQSdAN3Uqu7_o4pL8FRxXliYJrC52-9wH3FQ";
149+
OneSignal.updateUserJwt(event.getExternalId(), jwt);
147150
Log.v(Tag.LOG_TAG, "onUserJwtInvalidated fired with ID:" + event.getExternalId());
148151
}
149152
});

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/config/ConfigModel.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.onesignal.core.internal.config
22

3+
import com.onesignal.common.events.EventProducer
34
import com.onesignal.common.modeling.Model
5+
import com.onesignal.core.internal.backend.ParamsObject
46
import org.json.JSONArray
57
import org.json.JSONObject
68

@@ -319,6 +321,20 @@ class ConfigModel : Model() {
319321

320322
return null
321323
}
324+
325+
var fetchParamsNotifier = EventProducer<FetchParamsObserver>()
326+
327+
fun addFetchParamsObserver(observer: FetchParamsObserver) {
328+
fetchParamsNotifier.subscribe(observer)
329+
}
330+
331+
fun removeFetchParamsObserver(observer: FetchParamsObserver) {
332+
fetchParamsNotifier.unsubscribe(observer)
333+
}
334+
335+
fun notifyFetchParams(params: ParamsObject) {
336+
fetchParamsNotifier.fire { it.onParamsFetched(params) }
337+
}
322338
}
323339

324340
/**
@@ -425,3 +441,7 @@ class FCMConfigModel(parentModel: Model, parentProperty: String) : Model(parentM
425441
setOptStringProperty(::apiKey.name, value)
426442
}
427443
}
444+
445+
interface FetchParamsObserver {
446+
fun onParamsFetched(params: ParamsObject)
447+
}

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/config/impl/ConfigModelStoreListener.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ internal class ConfigModelStoreListener(
7272
// copy current model into new model, then override with what comes down.
7373
val config = ConfigModel()
7474
config.initializeFromModel(null, _configModelStore.model)
75-
75+
config.fetchParamsNotifier = _configModelStore.model.fetchParamsNotifier
7676
config.isInitializedWithRemote = true
7777

7878
// these are always copied from the backend params
@@ -105,6 +105,7 @@ internal class ConfigModelStoreListener(
105105

106106
_configModelStore.replace(config, ModelChangeTags.HYDRATE)
107107
success = true
108+
config.notifyFetchParams(params)
108109
} catch (ex: BackendException) {
109110
if (ex.statusCode == HttpURLConnection.HTTP_FORBIDDEN) {
110111
Logging.fatal("403 error getting OneSignal params, omitting further retries!")

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ interface IOperationRepo {
4242
suspend fun awaitInitialized()
4343

4444
fun forceExecuteOperations()
45+
46+
fun setPaused(paused: Boolean)
4547
}
4648

4749
// Extension function so the syntax containsInstanceOf<Operation>() can be used over

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,10 @@ internal class OperationRepo(
189189
waiter.wake(LoopWaiterMessage(false))
190190
}
191191

192+
override fun setPaused(paused: Boolean) {
193+
this.paused = paused
194+
}
195+
192196
/**
193197
* Waits until a new operation is enqueued, then wait an additional
194198
* amount of time afterwards, so operations can be grouped/batched.
@@ -262,7 +266,15 @@ internal class OperationRepo(
262266
ops.forEach { _operationModelStore.remove(it.operation.id) }
263267
ops.forEach { it.waiter?.wake(true) }
264268
}
265-
ExecutionResult.FAIL_UNAUTHORIZED, // TODO: Need to provide callback for app to reset JWT. For now, fail with no retry.
269+
ExecutionResult.FAIL_UNAUTHORIZED -> {
270+
Logging.error("Operation execution failed with invalid jwt, pausing the operation repo: $operations")
271+
// keep the failed operation and pause the operation repo from executing
272+
paused = true
273+
// add back all operations to the front of the queue to be re-executed.
274+
synchronized(queue) {
275+
ops.reversed().forEach { queue.add(0, it) }
276+
}
277+
}
266278
ExecutionResult.FAIL_NORETRY,
267279
ExecutionResult.FAIL_CONFLICT,
268280
-> {

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/internal/OneSignalImp.kt

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ import com.onesignal.common.threading.suspendifyOnThread
1919
import com.onesignal.core.CoreModule
2020
import com.onesignal.core.internal.application.IApplicationService
2121
import com.onesignal.core.internal.application.impl.ApplicationService
22+
import com.onesignal.core.internal.backend.ParamsObject
2223
import com.onesignal.core.internal.config.ConfigModel
2324
import com.onesignal.core.internal.config.ConfigModelStore
25+
import com.onesignal.core.internal.config.FetchParamsObserver
2426
import com.onesignal.core.internal.operations.IOperationRepo
2527
import com.onesignal.core.internal.preferences.IPreferencesService
2628
import com.onesignal.core.internal.preferences.PreferenceOneSignalKeys
@@ -74,7 +76,7 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
7476
val oldValue = _consentGiven
7577
_consentGiven = value
7678
configModel?.consentGiven = value
77-
if (oldValue != value && value) {
79+
if (oldValue != value && value && !useIdentityVerification) {
7880
operationRepo?.forceExecuteOperations()
7981
}
8082
}
@@ -147,7 +149,6 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
147149
private var sessionModel: SessionModel? = null
148150
private var _consentRequired: Boolean? = null
149151
private var _consentGiven: Boolean? = null
150-
private var _useIdentityVerification: Boolean? = false
151152
private var _disableGMSMissingPrompt: Boolean? = null
152153
private val initLock: Any = Any()
153154
private val loginLock: Any = Any()
@@ -250,6 +251,7 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
250251
// bootstrap services
251252
startupService.bootstrap()
252253

254+
resumeOperationRepoAfterFetchParams(configModel!!)
253255
if (forceCreateUser || !identityModelStore!!.model.hasProperty(IdentityConstants.ONESIGNAL_ID)) {
254256
val legacyPlayerId =
255257
preferencesService!!.getString(
@@ -436,13 +438,18 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
436438
externalId: String,
437439
token: String,
438440
) {
439-
if (!identityModelStore!!.model.externalId.equals(externalId)) {
440-
Logging.log(LogLevel.DEBUG, "JWT $token is NOT updated for externalId $externalId")
441-
return
441+
// update the model with the given externalId
442+
for (model in identityModelStore!!.store.list()) {
443+
if (externalId == model.externalId) {
444+
identityModelStore!!.model.jwtToken = token
445+
operationRepo!!.setPaused(false)
446+
operationRepo!!.forceExecuteOperations()
447+
Logging.log(LogLevel.DEBUG, "JWT $token is updated for externalId $externalId")
448+
return
449+
}
442450
}
443451

444-
Logging.log(LogLevel.DEBUG, "JWT $token is updated for externalId $externalId")
445-
identityModelStore!!.model.jwtToken = token
452+
Logging.log(LogLevel.DEBUG, "No identity found for externalId $externalId")
446453
}
447454

448455
override fun addUserJwtInvalidatedListener(listener: IUserJwtInvalidatedListener) {
@@ -518,6 +525,23 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
518525
}
519526
}
520527

528+
private fun resumeOperationRepoAfterFetchParams(configModel: ConfigModel) {
529+
// pause operation repo until useIdentityVerification is determined
530+
operationRepo!!.setPaused(true)
531+
configModel.addFetchParamsObserver(
532+
object : FetchParamsObserver {
533+
override fun onParamsFetched(params: ParamsObject) {
534+
// resume operations if identity verification is turned off or a jwt is cached
535+
if (params.useIdentityVerification == false || identityModelStore!!.model.jwtToken != null) {
536+
operationRepo!!.setPaused(false)
537+
} else {
538+
Logging.log(LogLevel.ERROR, "A valid JWT is required for user ${identityModelStore!!.model.externalId}.")
539+
}
540+
}
541+
},
542+
)
543+
}
544+
521545
override fun <T> hasService(c: Class<T>): Boolean = services.hasService(c)
522546

523547
override fun <T> getService(c: Class<T>): T = services.getService(c)

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/identity/IdentityModel.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.onesignal.user.internal.identity
22

33
import com.onesignal.common.modeling.MapModel
4+
import com.onesignal.common.modeling.ModelChangeTags
45
import com.onesignal.user.internal.backend.IdentityConstants
56

67
/**
@@ -37,6 +38,6 @@ class IdentityModel : MapModel<String>() {
3738
var jwtToken: String?
3839
get() = getOptStringProperty(IdentityConstants.JWT_TOKEN)
3940
set(value) {
40-
setOptStringProperty(IdentityConstants.JWT_TOKEN, value)
41+
setOptStringProperty(IdentityConstants.JWT_TOKEN, value, ModelChangeTags.NO_PROPOGATE)
4142
}
4243
}

0 commit comments

Comments
 (0)