Skip to content

Commit fef3aad

Browse files
authored
Merge pull request #1922 from OneSignal/update_between_sessions
Update push subscription model properties between sessions
2 parents a5bfd21 + 7c8167d commit fef3aad

File tree

8 files changed

+151
-18
lines changed

8 files changed

+151
-18
lines changed

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.onesignal.internal
22

33
import android.content.Context
4+
import android.os.Build
45
import com.onesignal.IOneSignal
6+
import com.onesignal.common.AndroidUtils
7+
import com.onesignal.common.DeviceUtils
58
import com.onesignal.common.IDManager
69
import com.onesignal.common.OneSignalUtils
710
import com.onesignal.common.modeling.ModelChangeTags
@@ -285,6 +288,12 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
285288
legacyUserSyncJSON.safeString("identifier") ?: ""
286289
pushSubscriptionModel.status = SubscriptionStatus.fromInt(notificationTypes)
287290
?: SubscriptionStatus.NO_PERMISSION
291+
292+
pushSubscriptionModel.sdk = OneSignalUtils.SDK_VERSION
293+
pushSubscriptionModel.deviceOS = Build.VERSION.RELEASE
294+
pushSubscriptionModel.carrier = DeviceUtils.getCarrierName(services.getService<IApplicationService>().appContext) ?: ""
295+
pushSubscriptionModel.appVersion = AndroidUtils.getAppVersion(services.getService<IApplicationService>().appContext) ?: ""
296+
288297
configModel!!.pushSubscriptionId = legacyPlayerId
289298
subscriptionModelStore!!.add(
290299
pushSubscriptionModel,
@@ -466,6 +475,10 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
466475
newPushSubscription.optedIn = currentPushSubscription?.optedIn ?: true
467476
newPushSubscription.address = currentPushSubscription?.address ?: ""
468477
newPushSubscription.status = currentPushSubscription?.status ?: SubscriptionStatus.NO_PERMISSION
478+
newPushSubscription.sdk = OneSignalUtils.SDK_VERSION
479+
newPushSubscription.deviceOS = Build.VERSION.RELEASE
480+
newPushSubscription.carrier = DeviceUtils.getCarrierName(services.getService<IApplicationService>().appContext) ?: ""
481+
newPushSubscription.appVersion = AndroidUtils.getAppVersion(services.getService<IApplicationService>().appContext) ?: ""
469482

470483
// ensure we always know this devices push subscription ID
471484
configModel!!.pushSubscriptionId = newPushSubscription.id

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/operations/impl/executors/RefreshUserOperationExecutor.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,10 @@ internal class RefreshUserOperationExecutor(
106106
}
107107
}
108108
subscriptionModel.optedIn = subscriptionModel.status != SubscriptionStatus.UNSUBSCRIBE
109+
subscriptionModel.sdk = subscription.sdk ?: ""
110+
subscriptionModel.deviceOS = subscription.deviceOS ?: ""
111+
subscriptionModel.carrier = subscription.carrier ?: ""
112+
subscriptionModel.appVersion = subscription.appVersion ?: ""
109113

110114
// We only add a push subscription if it is this device's push subscription.
111115
if (subscriptionModel.type != SubscriptionType.PUSH || subscriptionModel.id == _configModelStore.model.pushSubscriptionId) {

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/subscriptions/ISubscriptionManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ interface ISubscriptionManager : IEventNotifier<ISubscriptionChangedHandler> {
1111

1212
fun addEmailSubscription(email: String)
1313

14-
fun addOrUpdatePushSubscription(
14+
fun addOrUpdatePushSubscriptionToken(
1515
pushToken: String?,
1616
pushTokenStatus: SubscriptionStatus,
1717
)

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/subscriptions/SubscriptionModel.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,4 +108,29 @@ class SubscriptionModel : Model() {
108108
set(value) {
109109
setEnumProperty(::status.name, value)
110110
}
111+
112+
// Prior to v5.0.5, we did not save the following properties, so we must default get() to ""
113+
var sdk: String
114+
get() = getStringProperty(::sdk.name) { "" }
115+
set(value) {
116+
setStringProperty(::sdk.name, value)
117+
}
118+
119+
var deviceOS: String
120+
get() = getStringProperty(::deviceOS.name) { "" }
121+
set(value) {
122+
setStringProperty(::deviceOS.name, value)
123+
}
124+
125+
var carrier: String
126+
get() = getStringProperty(::carrier.name) { "" }
127+
set(value) {
128+
setStringProperty(::carrier.name, value)
129+
}
130+
131+
var appVersion: String
132+
get() = getStringProperty(::appVersion.name) { "" }
133+
set(value) {
134+
setStringProperty(::appVersion.name, value)
135+
}
111136
}
Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,34 @@
11
package com.onesignal.user.internal.subscriptions
22

3+
import com.onesignal.common.modeling.ModelChangeTags
34
import com.onesignal.common.modeling.SimpleModelStore
45
import com.onesignal.core.internal.preferences.IPreferencesService
56

67
open class SubscriptionModelStore(prefs: IPreferencesService) : SimpleModelStore<SubscriptionModel>({
78
SubscriptionModel()
8-
}, "subscriptions", prefs)
9+
}, "subscriptions", prefs) {
10+
override fun replaceAll(
11+
models: List<SubscriptionModel>,
12+
tag: String,
13+
) {
14+
if (tag != ModelChangeTags.HYDRATE) {
15+
return super.replaceAll(models, tag)
16+
}
17+
// When hydrating an existing push subscription model, use existing device properties
18+
synchronized(models) {
19+
for (model in models) {
20+
if (model.type == SubscriptionType.PUSH) {
21+
val existingPushModel = get(model.id)
22+
if (existingPushModel != null) {
23+
model.sdk = existingPushModel.sdk
24+
model.deviceOS = existingPushModel.deviceOS
25+
model.carrier = existingPushModel.carrier
26+
model.appVersion = existingPushModel.appVersion
27+
}
28+
break
29+
}
30+
}
31+
super.replaceAll(models, tag)
32+
}
33+
}
34+
}

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/subscriptions/impl/SubscriptionManager.kt

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
package com.onesignal.user.internal.subscriptions.impl
22

3+
import android.os.Build
4+
import com.onesignal.common.AndroidUtils
5+
import com.onesignal.common.DeviceUtils
36
import com.onesignal.common.IDManager
7+
import com.onesignal.common.OneSignalUtils
48
import com.onesignal.common.events.EventProducer
59
import com.onesignal.common.modeling.IModelStoreChangeHandler
610
import com.onesignal.common.modeling.ModelChangedArgs
11+
import com.onesignal.core.internal.application.IApplicationService
712
import com.onesignal.debug.LogLevel
813
import com.onesignal.debug.internal.logging.Logging
14+
import com.onesignal.session.internal.session.ISessionLifecycleHandler
15+
import com.onesignal.session.internal.session.ISessionService
916
import com.onesignal.user.internal.EmailSubscription
1017
import com.onesignal.user.internal.PushSubscription
1118
import com.onesignal.user.internal.SmsSubscription
@@ -32,8 +39,10 @@ import com.onesignal.user.subscriptions.PushSubscriptionChangedState
3239
* subscription model.
3340
*/
3441
internal class SubscriptionManager(
42+
private val _applicationService: IApplicationService,
43+
private val _sessionService: ISessionService,
3544
private val _subscriptionModelStore: SubscriptionModelStore,
36-
) : ISubscriptionManager, IModelStoreChangeHandler<SubscriptionModel> {
45+
) : ISubscriptionManager, IModelStoreChangeHandler<SubscriptionModel>, ISessionLifecycleHandler {
3746
private val events = EventProducer<ISubscriptionChangedHandler>()
3847
override var subscriptions: SubscriptionList = SubscriptionList(listOf(), UninitializedPushSubscription())
3948
override val pushSubscriptionModel: SubscriptionModel
@@ -45,8 +54,17 @@ internal class SubscriptionManager(
4554
}
4655

4756
_subscriptionModelStore.subscribe(this)
57+
_sessionService.subscribe(this)
4858
}
4959

60+
override fun onSessionStarted() {
61+
refreshPushSubscriptionState()
62+
}
63+
64+
override fun onSessionActive() { }
65+
66+
override fun onSessionEnded(duration: Long) { }
67+
5068
override fun addEmailSubscription(email: String) {
5169
addSubscriptionToModels(SubscriptionType.EMAIL, email)
5270
}
@@ -55,7 +73,7 @@ internal class SubscriptionManager(
5573
addSubscriptionToModels(SubscriptionType.SMS, sms)
5674
}
5775

58-
override fun addOrUpdatePushSubscription(
76+
override fun addOrUpdatePushSubscriptionToken(
5977
pushToken: String?,
6078
pushTokenStatus: SubscriptionStatus,
6179
) {
@@ -215,4 +233,29 @@ internal class SubscriptionManager(
215233
}
216234
}
217235
}
236+
237+
/**
238+
* Called when app has gained focus and the subscription state should be refreshed.
239+
*/
240+
private fun refreshPushSubscriptionState() {
241+
val pushSub = subscriptions.push
242+
243+
if (pushSub is UninitializedPushSubscription) {
244+
return
245+
}
246+
val pushSubModel = (pushSub as Subscription).model
247+
248+
pushSubModel.sdk = OneSignalUtils.SDK_VERSION
249+
pushSubModel.deviceOS = Build.VERSION.RELEASE
250+
251+
val carrier = DeviceUtils.getCarrierName(_applicationService.appContext)
252+
carrier?.let {
253+
pushSubModel.carrier = carrier
254+
}
255+
256+
val appVersion = AndroidUtils.getAppVersion(_applicationService.appContext)
257+
appVersion?.let {
258+
pushSubModel.appVersion = appVersion
259+
}
260+
}
218261
}

0 commit comments

Comments
 (0)