@@ -3,6 +3,7 @@ package com.onesignal.internal
3
3
import android.content.Context
4
4
import android.os.Build
5
5
import com.onesignal.IOneSignal
6
+ import com.onesignal.IUserJwtInvalidatedListener
6
7
import com.onesignal.common.AndroidUtils
7
8
import com.onesignal.common.DeviceUtils
8
9
import com.onesignal.common.IDManager
@@ -18,8 +19,10 @@ import com.onesignal.common.threading.suspendifyOnThread
18
19
import com.onesignal.core.CoreModule
19
20
import com.onesignal.core.internal.application.IApplicationService
20
21
import com.onesignal.core.internal.application.impl.ApplicationService
22
+ import com.onesignal.core.internal.backend.ParamsObject
21
23
import com.onesignal.core.internal.config.ConfigModel
22
24
import com.onesignal.core.internal.config.ConfigModelStore
25
+ import com.onesignal.core.internal.config.FetchParamsObserver
23
26
import com.onesignal.core.internal.operations.IOperationRepo
24
27
import com.onesignal.core.internal.preferences.IPreferencesService
25
28
import com.onesignal.core.internal.preferences.PreferenceOneSignalKeys
@@ -56,6 +59,8 @@ import org.json.JSONObject
56
59
internal class OneSignalImp : IOneSignal , IServiceProvider {
57
60
override val sdkVersion: String = OneSignalUtils .SDK_VERSION
58
61
override var isInitialized: Boolean = false
62
+ override val useIdentityVerification: Boolean
63
+ get() = configModel?.useIdentityVerification ? : true
59
64
60
65
override var consentRequired: Boolean
61
66
get() = configModel?.consentRequired ? : (_consentRequired == true )
@@ -255,6 +260,7 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
255
260
// bootstrap services
256
261
startupService.bootstrap()
257
262
263
+ resumeOperationRepoAfterFetchParams(configModel!! )
258
264
if (forceCreateUser || ! identityModelStore!! .model.hasProperty(IdentityConstants .ONESIGNAL_ID )) {
259
265
val legacyPlayerId =
260
266
preferencesService!! .getString(
@@ -292,7 +298,8 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
292
298
pushSubscriptionModel.id = legacyPlayerId
293
299
pushSubscriptionModel.type = SubscriptionType .PUSH
294
300
pushSubscriptionModel.optedIn =
295
- notificationTypes != SubscriptionStatus .NO_PERMISSION .value && notificationTypes != SubscriptionStatus .UNSUBSCRIBE .value
301
+ notificationTypes != SubscriptionStatus .NO_PERMISSION .value &&
302
+ notificationTypes != SubscriptionStatus .UNSUBSCRIBE .value
296
303
pushSubscriptionModel.address =
297
304
legacyUserSyncJSON.safeString(" identifier" ) ? : " "
298
305
if (notificationTypes != null ) {
@@ -365,12 +372,16 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
365
372
currentIdentityOneSignalId = identityModelStore!! .model.onesignalId
366
373
367
374
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
368
378
return
369
379
}
370
380
371
381
// TODO: Set JWT Token for all future requests.
372
382
createAndSwitchToNewUser { identityModel, _ ->
373
383
identityModel.externalId = externalId
384
+ identityModel.jwtToken = jwtBearerToken
374
385
}
375
386
376
387
newIdentityOneSignalId = identityModelStore!! .model.onesignalId
@@ -413,6 +424,7 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
413
424
return
414
425
}
415
426
427
+ // calling createAndSwitchToNewUser() replaces model with a default empty jwt
416
428
createAndSwitchToNewUser()
417
429
operationRepo!! .enqueue(
418
430
LoginUserOperation (
@@ -421,8 +433,6 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
421
433
identityModelStore!! .model.externalId,
422
434
),
423
435
)
424
-
425
- // TODO: remove JWT Token for all future requests.
426
436
}
427
437
}
428
438
@@ -435,6 +445,32 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
435
445
PreferenceOneSignalKeys .PREFS_LEGACY_APP_ID ,
436
446
)
437
447
}
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
+ }
438
474
439
475
private fun createAndSwitchToNewUser (
440
476
suppressBackendOperation : Boolean = false,
@@ -501,6 +537,23 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
501
537
}
502
538
}
503
539
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
+
504
557
override fun <T > hasService (c : Class <T >): Boolean = services.hasService(c)
505
558
506
559
override fun <T > getService (c : Class <T >): T = services.getService(c)
0 commit comments