@@ -6,6 +6,7 @@ import com.onesignal.common.IDManager
6
6
import com.onesignal.common.OneSignalUtils
7
7
import com.onesignal.common.modeling.ModelChangeTags
8
8
import com.onesignal.common.modules.IModule
9
+ import com.onesignal.common.safeString
9
10
import com.onesignal.common.services.IServiceProvider
10
11
import com.onesignal.common.services.ServiceBuilder
11
12
import com.onesignal.common.services.ServiceProvider
@@ -16,6 +17,9 @@ import com.onesignal.core.internal.application.impl.ApplicationService
16
17
import com.onesignal.core.internal.config.ConfigModel
17
18
import com.onesignal.core.internal.config.ConfigModelStore
18
19
import com.onesignal.core.internal.operations.IOperationRepo
20
+ import com.onesignal.core.internal.preferences.IPreferencesService
21
+ import com.onesignal.core.internal.preferences.PreferenceOneSignalKeys
22
+ import com.onesignal.core.internal.preferences.PreferenceStores
19
23
import com.onesignal.core.internal.startup.StartupService
20
24
import com.onesignal.debug.IDebugManager
21
25
import com.onesignal.debug.LogLevel
@@ -33,6 +37,7 @@ import com.onesignal.user.UserModule
33
37
import com.onesignal.user.internal.backend.IdentityConstants
34
38
import com.onesignal.user.internal.identity.IdentityModel
35
39
import com.onesignal.user.internal.identity.IdentityModelStore
40
+ import com.onesignal.user.internal.operations.LoginUserFromSubscriptionOperation
36
41
import com.onesignal.user.internal.operations.LoginUserOperation
37
42
import com.onesignal.user.internal.operations.RefreshUserOperation
38
43
import com.onesignal.user.internal.operations.TransferSubscriptionOperation
@@ -87,6 +92,7 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
87
92
private var _propertiesModelStore : PropertiesModelStore ? = null
88
93
private var _subscriptionModelStore : SubscriptionModelStore ? = null
89
94
private var _startupService : StartupService ? = null
95
+ private var _preferencesService : IPreferencesService ? = null
90
96
91
97
// Other State
92
98
private val _services : ServiceProvider
@@ -182,14 +188,48 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
182
188
_propertiesModelStore = _services .getService()
183
189
_identityModelStore = _services .getService()
184
190
_subscriptionModelStore = _services .getService()
191
+ _preferencesService = _services .getService()
185
192
186
193
// Instantiate and call the IStartableServices
187
194
_startupService = _services .getService()
188
195
_startupService !! .bootstrap()
189
196
190
197
if (forceCreateUser || ! _identityModelStore !! .model.hasProperty(IdentityConstants .ONESIGNAL_ID )) {
191
- createAndSwitchToNewUser()
192
- _operationRepo !! .enqueue(LoginUserOperation (_configModel !! .appId, _identityModelStore !! .model.onesignalId, _identityModelStore !! .model.externalId))
198
+ val legacyPlayerId = _preferencesService !! .getString(PreferenceStores .ONESIGNAL , PreferenceOneSignalKeys .PREFS_LEGACY_PLAYER_ID )
199
+ if (legacyPlayerId == null ) {
200
+ Logging .debug(" initWithContext: creating new device-scoped user" )
201
+ createAndSwitchToNewUser()
202
+ _operationRepo !! .enqueue(LoginUserOperation (_configModel !! .appId, _identityModelStore !! .model.onesignalId, _identityModelStore !! .model.externalId))
203
+ }
204
+ else {
205
+ Logging .debug(" initWithContext: creating user linked to subscription $legacyPlayerId " )
206
+
207
+ // Converting a 4.x SDK to the 5.x SDK. We pull the legacy user sync values to create the subscription model, then enqueue
208
+ // a specialized `LoginUserFromSubscriptionOperation`, which will drive fetching/refreshing of the local user
209
+ // based on the subscription ID we do have.
210
+ val legacyUserSyncString = _preferencesService !! .getString(PreferenceStores .ONESIGNAL , PreferenceOneSignalKeys .PREFS_LEGACY_USER_SYNCVALUES )
211
+ var suppressBackendOperation = false
212
+
213
+ if (legacyUserSyncString != null ) {
214
+ val legacyUserSyncJSON = JSONObject (legacyUserSyncString)
215
+ val notificationTypes = legacyUserSyncJSON.getInt(" notification_types" )
216
+
217
+ val pushSubscriptionModel = SubscriptionModel ()
218
+ pushSubscriptionModel.id = legacyPlayerId
219
+ pushSubscriptionModel.type = SubscriptionType .PUSH
220
+ pushSubscriptionModel.optedIn = notificationTypes != SubscriptionStatus .NO_PERMISSION .value && notificationTypes != SubscriptionStatus .UNSUBSCRIBE .value
221
+ pushSubscriptionModel.address = legacyUserSyncJSON.safeString(" identifier" ) ? : " "
222
+ pushSubscriptionModel.status = SubscriptionStatus .fromInt(notificationTypes) ? : SubscriptionStatus .NO_PERMISSION
223
+ _configModel !! .pushSubscriptionId = legacyPlayerId
224
+ _subscriptionModelStore !! .add(pushSubscriptionModel, ModelChangeTags .NO_PROPOGATE )
225
+ suppressBackendOperation = true
226
+ }
227
+
228
+ createAndSwitchToNewUser(suppressBackendOperation = suppressBackendOperation)
229
+
230
+ _operationRepo !! .enqueue(LoginUserFromSubscriptionOperation (_configModel !! .appId, _identityModelStore !! .model.onesignalId, legacyPlayerId))
231
+ _preferencesService !! .saveString(PreferenceStores .ONESIGNAL , PreferenceOneSignalKeys .PREFS_LEGACY_PLAYER_ID , null )
232
+ }
193
233
} else {
194
234
Logging .debug(" initWithContext: using cached user ${_identityModelStore !! .model.onesignalId} " )
195
235
_operationRepo !! .enqueue(RefreshUserOperation (_configModel !! .appId, _identityModelStore !! .model.onesignalId))
@@ -299,7 +339,7 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
299
339
}
300
340
}
301
341
302
- private fun createAndSwitchToNewUser (modify : ((identityModel: IdentityModel , propertiesModel: PropertiesModel ) -> Unit )? = null) {
342
+ private fun createAndSwitchToNewUser (suppressBackendOperation : Boolean = false, modify : ((identityModel: IdentityModel , propertiesModel: PropertiesModel ) -> Unit )? = null) {
303
343
Logging .debug(" createAndSwitchToNewUser()" )
304
344
305
345
// create a new identity and properties model locally
0 commit comments