@@ -3,6 +3,7 @@ package com.onesignal.internal
33import android.content.Context
44import android.os.Build
55import com.onesignal.IOneSignal
6+ import com.onesignal.IUserJwtInvalidatedListener
67import com.onesignal.common.AndroidUtils
78import com.onesignal.common.DeviceUtils
89import com.onesignal.common.IDManager
@@ -18,8 +19,10 @@ import com.onesignal.common.threading.suspendifyOnThread
1819import com.onesignal.core.CoreModule
1920import com.onesignal.core.internal.application.IApplicationService
2021import com.onesignal.core.internal.application.impl.ApplicationService
22+ import com.onesignal.core.internal.backend.ParamsObject
2123import com.onesignal.core.internal.config.ConfigModel
2224import com.onesignal.core.internal.config.ConfigModelStore
25+ import com.onesignal.core.internal.config.FetchParamsObserver
2326import com.onesignal.core.internal.operations.IOperationRepo
2427import com.onesignal.core.internal.preferences.IPreferencesService
2528import com.onesignal.core.internal.preferences.PreferenceOneSignalKeys
@@ -56,6 +59,8 @@ import org.json.JSONObject
5659internal class OneSignalImp : IOneSignal , IServiceProvider {
5760 override val sdkVersion: String = OneSignalUtils .SDK_VERSION
5861 override var isInitialized: Boolean = false
62+ override val useIdentityVerification: Boolean
63+ get() = configModel?.useIdentityVerification ? : true
5964
6065 override var consentRequired: Boolean
6166 get() = configModel?.consentRequired ? : (_consentRequired == true )
@@ -255,6 +260,7 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
255260 // bootstrap services
256261 startupService.bootstrap()
257262
263+ resumeOperationRepoAfterFetchParams(configModel!! )
258264 if (forceCreateUser || ! identityModelStore!! .model.hasProperty(IdentityConstants .ONESIGNAL_ID )) {
259265 val legacyPlayerId =
260266 preferencesService!! .getString(
@@ -292,7 +298,8 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
292298 pushSubscriptionModel.id = legacyPlayerId
293299 pushSubscriptionModel.type = SubscriptionType .PUSH
294300 pushSubscriptionModel.optedIn =
295- notificationTypes != SubscriptionStatus .NO_PERMISSION .value && notificationTypes != SubscriptionStatus .UNSUBSCRIBE .value
301+ notificationTypes != SubscriptionStatus .NO_PERMISSION .value &&
302+ notificationTypes != SubscriptionStatus .UNSUBSCRIBE .value
296303 pushSubscriptionModel.address =
297304 legacyUserSyncJSON.safeString(" identifier" ) ? : " "
298305 if (notificationTypes != null ) {
@@ -365,12 +372,16 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
365372 currentIdentityOneSignalId = identityModelStore!! .model.onesignalId
366373
367374 if (currentIdentityExternalId == externalId) {
375+ // login is for same user that is already logged in, fetch (refresh)
376+ // the current user.
377+ identityModelStore!! .model.jwtToken = jwtBearerToken
368378 return
369379 }
370380
371381 // TODO: Set JWT Token for all future requests.
372382 createAndSwitchToNewUser { identityModel, _ ->
373383 identityModel.externalId = externalId
384+ identityModel.jwtToken = jwtBearerToken
374385 }
375386
376387 newIdentityOneSignalId = identityModelStore!! .model.onesignalId
@@ -413,6 +424,7 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
413424 return
414425 }
415426
427+ // calling createAndSwitchToNewUser() replaces model with a default empty jwt
416428 createAndSwitchToNewUser()
417429 operationRepo!! .enqueue(
418430 LoginUserOperation (
@@ -421,8 +433,6 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
421433 identityModelStore!! .model.externalId,
422434 ),
423435 )
424-
425- // TODO: remove JWT Token for all future requests.
426436 }
427437 }
428438
@@ -435,6 +445,32 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
435445 PreferenceOneSignalKeys .PREFS_LEGACY_APP_ID ,
436446 )
437447 }
448+
449+ override fun updateUserJwt (
450+ externalId : String ,
451+ token : String ,
452+ ) {
453+ // update the model with the given externalId
454+ for (model in identityModelStore!! .store.list()) {
455+ if (externalId == model.externalId) {
456+ identityModelStore!! .model.jwtToken = token
457+ operationRepo!! .setPaused(false )
458+ operationRepo!! .forceExecuteOperations()
459+ Logging .log(LogLevel .DEBUG , " JWT $token is updated for externalId $externalId " )
460+ return
461+ }
462+ }
463+
464+ Logging .log(LogLevel .DEBUG , " No identity found for externalId $externalId " )
465+ }
466+
467+ override fun addUserJwtInvalidatedListener (listener : IUserJwtInvalidatedListener ) {
468+ user.addUserJwtInvalidatedListener(listener)
469+ }
470+
471+ override fun removeUserJwtInvalidatedListener (listener : IUserJwtInvalidatedListener ) {
472+ user.removeUserJwtInvalidatedListener(listener)
473+ }
438474
439475 private fun createAndSwitchToNewUser (
440476 suppressBackendOperation : Boolean = false,
@@ -501,6 +537,23 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
501537 }
502538 }
503539
540+ private fun resumeOperationRepoAfterFetchParams (configModel : ConfigModel ) {
541+ // pause operation repo until useIdentityVerification is determined
542+ operationRepo!! .setPaused(true )
543+ configModel.addFetchParamsObserver(
544+ object : FetchParamsObserver {
545+ override fun onParamsFetched (params : ParamsObject ) {
546+ // resume operations if identity verification is turned off or a jwt is cached
547+ if (params.useIdentityVerification == false || identityModelStore!! .model.jwtToken != null ) {
548+ operationRepo!! .setPaused(false )
549+ } else {
550+ Logging .log(LogLevel .ERROR , " A valid JWT is required for user ${identityModelStore!! .model.externalId} ." )
551+ }
552+ }
553+ },
554+ )
555+ }
556+
504557 override fun <T > hasService (c : Class <T >): Boolean = services.hasService(c)
505558
506559 override fun <T > getService (c : Class <T >): T = services.getService(c)
0 commit comments