Skip to content

Commit 2216734

Browse files
committed
Fix: update timezone onSessionStart instead
1 parent 709316c commit 2216734

File tree

4 files changed

+54
-52
lines changed

4 files changed

+54
-52
lines changed

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/session/internal/session/impl/SessionListener.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.onesignal.session.internal.session.impl
22

3+
import com.onesignal.common.TimeUtils
34
import com.onesignal.common.threading.suspendifyOnIO
45
import com.onesignal.core.internal.config.ConfigModelStore
56
import com.onesignal.core.internal.operations.IOperationRepo
@@ -11,6 +12,7 @@ import com.onesignal.session.internal.session.ISessionService
1112
import com.onesignal.user.internal.identity.IdentityModelStore
1213
import com.onesignal.user.internal.operations.TrackSessionEndOperation
1314
import com.onesignal.user.internal.operations.TrackSessionStartOperation
15+
import com.onesignal.user.internal.properties.PropertiesModelStore
1416

1517
/**
1618
* The [SessionListener] is responsible for subscribing itself as an [ISessionLifecycleHandler]
@@ -33,17 +35,20 @@ internal class SessionListener(
3335
private val _sessionService: ISessionService,
3436
private val _configModelStore: ConfigModelStore,
3537
private val _identityModelStore: IdentityModelStore,
38+
private val _propertiesModelStore: PropertiesModelStore,
3639
private val _outcomeEventsController: IOutcomeEventsController,
3740
) : IStartableService, ISessionLifecycleHandler {
3841
override fun start() {
3942
_sessionService.subscribe(this)
4043
}
4144

4245
override fun onSessionStarted() {
46+
_propertiesModelStore.model.timezone = TimeUtils.getTimeZoneId()
4347
_operationRepo.enqueue(TrackSessionStartOperation(_configModelStore.model.appId, _identityModelStore.model.onesignalId), true)
4448
}
4549

4650
override fun onSessionActive() {
51+
_propertiesModelStore.model.timezone = TimeUtils.getTimeZoneId()
4752
}
4853

4954
override fun onSessionEnded(duration: Long) {

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

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.onesignal.user.internal
22

33
import com.onesignal.common.IDManager
44
import com.onesignal.common.OneSignalUtils
5-
import com.onesignal.common.TimeUtils
65
import com.onesignal.common.events.EventProducer
76
import com.onesignal.common.modeling.ISingletonModelStoreChangeHandler
87
import com.onesignal.common.modeling.ModelChangedArgs
@@ -266,13 +265,7 @@ internal open class UserManager(
266265
}
267266
}
268267

269-
override fun onFocus(firedOnSubscribe: Boolean) {
270-
// Detect any user properties updates that changed
271-
// Skip updating timezone when onesignalId is not set in the property model
272-
if (_propertiesModel.hasProperty(PropertiesModel::onesignalId.name)) {
273-
_propertiesModel.timezone = TimeUtils.getTimeZoneId()
274-
}
275-
}
268+
override fun onFocus(firedOnSubscribe: Boolean) { }
276269

277270
override fun onUnfocused() { }
278271
}
Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,38 @@
11
package com.onesignal.session.internal.session.impl
22

3+
import com.onesignal.common.TimeUtils
34
import com.onesignal.mocks.MockHelper
45
import com.onesignal.user.internal.operations.TrackSessionStartOperation
56
import io.kotest.core.spec.style.FunSpec
7+
import io.mockk.every
68
import io.mockk.mockk
9+
import io.mockk.mockkObject
10+
import io.mockk.unmockkAll
711
import io.mockk.verify
812

13+
private class Mocks {
14+
val mockOperationRepo = mockk<com.onesignal.core.internal.operations.IOperationRepo>(relaxed = true)
15+
16+
val propertiesModelStore = MockHelper.propertiesModelStore()
17+
18+
val sessionListener =
19+
SessionListener(
20+
mockOperationRepo,
21+
mockk<com.onesignal.session.internal.session.ISessionService>(relaxed = true),
22+
MockHelper.configModelStore(),
23+
MockHelper.identityModelStore(),
24+
propertiesModelStore,
25+
mockk<com.onesignal.session.internal.outcomes.IOutcomeEventsController>(relaxed = true),
26+
)
27+
}
28+
929
class SessionListenerTests : FunSpec({
1030

1131
test("onSessionStarted enqueues TrackSessionStartOperation") {
1232
// Given
13-
val mockOperationRepo = mockk<com.onesignal.core.internal.operations.IOperationRepo>(relaxed = true)
14-
15-
val sessionListener =
16-
SessionListener(
17-
mockOperationRepo,
18-
mockk<com.onesignal.session.internal.session.ISessionService>(relaxed = true),
19-
MockHelper.configModelStore(),
20-
MockHelper.identityModelStore(),
21-
mockk<com.onesignal.session.internal.outcomes.IOutcomeEventsController>(relaxed = true),
22-
)
33+
val mocks = Mocks()
34+
val mockOperationRepo = mocks.mockOperationRepo
35+
val sessionListener = mocks.sessionListener
2336

2437
// When
2538
sessionListener.onSessionStarted()
@@ -29,4 +42,28 @@ class SessionListenerTests : FunSpec({
2942
mockOperationRepo.enqueue(any<TrackSessionStartOperation>(), true)
3043
}
3144
}
45+
46+
test("onSessionStarted updates timezone") {
47+
// Given
48+
val mocks = Mocks()
49+
val mockOperationRepo = mocks.mockOperationRepo
50+
val sessionListener = mocks.sessionListener
51+
val propertiesModel = mocks.propertiesModelStore.model
52+
var timezoneId = "1"
53+
mockkObject(TimeUtils)
54+
every { TimeUtils.getTimeZoneId() } returns timezoneId
55+
56+
// When
57+
sessionListener.onSessionStarted()
58+
59+
// Then
60+
propertiesModel.timezone = timezoneId
61+
62+
// Once timezone is changed, onSessionStarted will update timezone in onSessionStarted
63+
timezoneId = "2"
64+
sessionListener.onSessionStarted()
65+
propertiesModel.timezone = timezoneId
66+
67+
unmockkAll()
68+
}
3269
})

OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/UserManagerTests.kt

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.onesignal.user.internal
33
import com.onesignal.common.TimeUtils
44
import com.onesignal.core.internal.language.ILanguageContext
55
import com.onesignal.mocks.MockHelper
6-
import com.onesignal.user.internal.properties.PropertiesModel
76
import com.onesignal.user.internal.subscriptions.ISubscriptionManager
87
import com.onesignal.user.internal.subscriptions.SubscriptionList
98
import io.kotest.core.spec.style.FunSpec
@@ -197,7 +196,7 @@ class UserManagerTests : FunSpec({
197196
verify(exactly = 1) { mockSubscriptionManager.removeSmsSubscription("+15558675309") }
198197
}
199198

200-
test("onFocus updates timezone when onesignalId exists in property model") {
199+
test("onFocus updates timezone") {
201200
// Given
202201
val mockTimeZone = "Europe/Foo"
203202
mockkObject(TimeUtils)
@@ -228,36 +227,4 @@ class UserManagerTests : FunSpec({
228227
unmockkObject(TimeUtils)
229228
}
230229
}
231-
232-
test("onFocus does not update timezone when onesignalId is missing in property model") {
233-
// Given
234-
val mockTimeZone = "Europe/Foo"
235-
mockkObject(TimeUtils)
236-
every { TimeUtils.getTimeZoneId() } returns mockTimeZone
237-
238-
val mockPropertiesModelStore = MockHelper.propertiesModelStore()
239-
every { mockPropertiesModelStore.model.hasProperty(PropertiesModel::onesignalId.name) } returns false
240-
241-
val userManager =
242-
UserManager(
243-
mockk<ISubscriptionManager>(),
244-
MockHelper.identityModelStore(),
245-
mockPropertiesModelStore,
246-
MockHelper.languageContext(),
247-
MockHelper.applicationService(),
248-
)
249-
250-
val propertiesModel = mockPropertiesModelStore.model
251-
252-
try {
253-
// When
254-
userManager.onFocus(firedOnSubscribe = false)
255-
256-
// Then
257-
verify(exactly = 0) { propertiesModel.timezone = mockTimeZone }
258-
} finally {
259-
// Clean up the mock
260-
unmockkObject(TimeUtils)
261-
}
262-
}
263230
})

0 commit comments

Comments
 (0)