Skip to content

Commit c8388e6

Browse files
committed
pause operationRepo until useIdentityVerification is determined from remote params
1 parent 0f766e9 commit c8388e6

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
@@ -131,6 +131,9 @@ public void onUserStateChange(@NonNull UserChangedState state) {
131131
OneSignal.addUserJwtInvalidatedListner(new IUserJwtInvalidatedListener() {
132132
@Override
133133
public void onUserJwtInvalidated(@NonNull UserJwtInvalidatedEvent event) {
134+
// !!! For manual testing only
135+
String jwt = "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiIxNjg4ZDhmMi1kYTdmLTQ4MTUtOGVlMy05ZDEzNzg4NDgyYzgiLCJpYXQiOjE3MTgzMDk5NzIsImlkZW50aXR5Ijp7ImV4dGVybmFsX2lkIjoiYWxleC0wNjE0Iiwib25lc2lnbmFsX2lkIjoiYTViYjc4NDYtYzExNC00YzdkLTkzMWYtNGQ0NjhiMGE5OWJhIn0sInN1YnNjcmlwdGlvbnMiOlt7InR5cGUiOiJFbWFpbCIsInRva2VuIjoidGVzdEBkb21haW4uY29tIn0seyJpZCI6ImE2YzQxNmY3LTMxMGUtNDgzNi05Yjc4LWZiZmQ5NTgyNWNjNCJ9XX0.HsjsA2qNPwd9qov_8Px01km-dzRug-YKNNG85cMrGYI9Pdb2uoPQSdAN3Uqu7_o4pL8FRxXliYJrC52-9wH3FQ";
136+
OneSignal.updateUserJwt(event.getExternalId(), jwt);
134137
Log.v(Tag.LOG_TAG, "onUserJwtInvalidated fired with ID:" + event.getExternalId());
135138
}
136139
});

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
}
@@ -141,7 +143,6 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
141143
private var sessionModel: SessionModel? = null
142144
private var _consentRequired: Boolean? = null
143145
private var _consentGiven: Boolean? = null
144-
private var _useIdentityVerification: Boolean? = false
145146
private var _disableGMSMissingPrompt: Boolean? = null
146147
private val initLock: Any = Any()
147148
private val loginLock: Any = Any()
@@ -255,6 +256,7 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
255256
startupService = services.getService()
256257
startupService!!.bootstrap()
257258

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

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

449456
override fun addUserJwtInvalidatedListener(listener: IUserJwtInvalidatedListener) {
@@ -519,6 +526,23 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
519526
}
520527
}
521528

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

524548
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)