diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/session/internal/session/impl/SessionListener.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/session/internal/session/impl/SessionListener.kt index 2b31f30da9..9279d2bf55 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/session/internal/session/impl/SessionListener.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/session/internal/session/impl/SessionListener.kt @@ -1,5 +1,6 @@ package com.onesignal.session.internal.session.impl +import com.onesignal.common.TimeUtils import com.onesignal.common.threading.suspendifyOnIO import com.onesignal.core.internal.config.ConfigModelStore import com.onesignal.core.internal.operations.IOperationRepo @@ -11,6 +12,7 @@ import com.onesignal.session.internal.session.ISessionService import com.onesignal.user.internal.identity.IdentityModelStore import com.onesignal.user.internal.operations.TrackSessionEndOperation import com.onesignal.user.internal.operations.TrackSessionStartOperation +import com.onesignal.user.internal.properties.PropertiesModelStore /** * The [SessionListener] is responsible for subscribing itself as an [ISessionLifecycleHandler] @@ -33,6 +35,7 @@ internal class SessionListener( private val _sessionService: ISessionService, private val _configModelStore: ConfigModelStore, private val _identityModelStore: IdentityModelStore, + private val _propertiesModelStore: PropertiesModelStore, private val _outcomeEventsController: IOutcomeEventsController, ) : IStartableService, ISessionLifecycleHandler { override fun start() { @@ -40,10 +43,12 @@ internal class SessionListener( } override fun onSessionStarted() { + _propertiesModelStore.model.timezone = TimeUtils.getTimeZoneId() _operationRepo.enqueue(TrackSessionStartOperation(_configModelStore.model.appId, _identityModelStore.model.onesignalId), true) } override fun onSessionActive() { + _propertiesModelStore.model.timezone = TimeUtils.getTimeZoneId() } override fun onSessionEnded(duration: Long) { diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/UserManager.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/UserManager.kt index 7b31cac811..2ce3502057 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/UserManager.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/UserManager.kt @@ -2,7 +2,6 @@ package com.onesignal.user.internal import com.onesignal.common.IDManager import com.onesignal.common.OneSignalUtils -import com.onesignal.common.TimeUtils import com.onesignal.common.events.EventProducer import com.onesignal.common.modeling.ISingletonModelStoreChangeHandler import com.onesignal.common.modeling.ModelChangedArgs @@ -266,10 +265,7 @@ internal open class UserManager( } } - override fun onFocus(firedOnSubscribe: Boolean) { - // Detect any user properties updates that changed - _propertiesModel.timezone = TimeUtils.getTimeZoneId() - } + override fun onFocus(firedOnSubscribe: Boolean) { } override fun onUnfocused() { } } diff --git a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/session/internal/session/impl/SessionListenerTests.kt b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/session/internal/session/impl/SessionListenerTests.kt index 99a6337313..77dd1c7d64 100644 --- a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/session/internal/session/impl/SessionListenerTests.kt +++ b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/session/internal/session/impl/SessionListenerTests.kt @@ -1,25 +1,38 @@ package com.onesignal.session.internal.session.impl +import com.onesignal.common.TimeUtils import com.onesignal.mocks.MockHelper import com.onesignal.user.internal.operations.TrackSessionStartOperation import io.kotest.core.spec.style.FunSpec +import io.mockk.every import io.mockk.mockk +import io.mockk.mockkObject +import io.mockk.unmockkAll import io.mockk.verify +private class Mocks { + val mockOperationRepo = mockk(relaxed = true) + + val propertiesModelStore = MockHelper.propertiesModelStore() + + val sessionListener = + SessionListener( + mockOperationRepo, + mockk(relaxed = true), + MockHelper.configModelStore(), + MockHelper.identityModelStore(), + propertiesModelStore, + mockk(relaxed = true), + ) +} + class SessionListenerTests : FunSpec({ test("onSessionStarted enqueues TrackSessionStartOperation") { // Given - val mockOperationRepo = mockk(relaxed = true) - - val sessionListener = - SessionListener( - mockOperationRepo, - mockk(relaxed = true), - MockHelper.configModelStore(), - MockHelper.identityModelStore(), - mockk(relaxed = true), - ) + val mocks = Mocks() + val mockOperationRepo = mocks.mockOperationRepo + val sessionListener = mocks.sessionListener // When sessionListener.onSessionStarted() @@ -29,4 +42,47 @@ class SessionListenerTests : FunSpec({ mockOperationRepo.enqueue(any(), true) } } + + test("onSessionStarted updates timezone") { + // Given + val mocks = Mocks() + val sessionListener = mocks.sessionListener + val propertiesModel = mocks.propertiesModelStore.model + var timezoneId = "1" + mockkObject(TimeUtils) + every { TimeUtils.getTimeZoneId() } returns timezoneId + + // When + sessionListener.onSessionStarted() + + // Then + propertiesModel.timezone = timezoneId + + // Once timezone is changed, repetitive onSessionStarted call will update timezone + timezoneId = "2" + sessionListener.onSessionStarted() + propertiesModel.timezone = timezoneId + + unmockkAll() + } + + test("onSessionActive updates timezone") { + // Given + val mocks = Mocks() + val sessionListener = mocks.sessionListener + val propertiesModel = mocks.propertiesModelStore.model + var timezoneId = "1" + mockkObject(TimeUtils) + every { TimeUtils.getTimeZoneId() } returns timezoneId + + // When + sessionListener.onSessionStarted() + + // Once timezone is changed, onSessionActive will update timezone + timezoneId = "2" + sessionListener.onSessionActive() + propertiesModel.timezone = timezoneId + + unmockkAll() + } }) diff --git a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/UserManagerTests.kt b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/UserManagerTests.kt index f39602c0c3..64039ccc76 100644 --- a/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/UserManagerTests.kt +++ b/OneSignalSDK/onesignal/core/src/test/java/com/onesignal/user/internal/UserManagerTests.kt @@ -1,6 +1,5 @@ package com.onesignal.user.internal -import com.onesignal.common.TimeUtils import com.onesignal.core.internal.language.ILanguageContext import com.onesignal.mocks.MockHelper import com.onesignal.user.internal.subscriptions.ISubscriptionManager @@ -11,10 +10,8 @@ import io.kotest.matchers.shouldNotBe import io.mockk.every import io.mockk.just import io.mockk.mockk -import io.mockk.mockkObject import io.mockk.runs import io.mockk.slot -import io.mockk.unmockkObject import io.mockk.verify class UserManagerTests : FunSpec({ @@ -195,36 +192,4 @@ class UserManagerTests : FunSpec({ verify(exactly = 1) { mockSubscriptionManager.addSmsSubscription("+15558675309") } verify(exactly = 1) { mockSubscriptionManager.removeSmsSubscription("+15558675309") } } - - test("onFocus updates timezone") { - // Given - val mockTimeZone = "Europe/Foo" - mockkObject(TimeUtils) - every { TimeUtils.getTimeZoneId() } returns mockTimeZone - - val mockPropertiesModelStore = MockHelper.propertiesModelStore() - - val userManager = - UserManager( - mockk(), - MockHelper.identityModelStore(), - mockPropertiesModelStore, - MockHelper.languageContext(), - MockHelper.applicationService(), - ) - - val propertiesModel = mockPropertiesModelStore.model - propertiesModel.timezone shouldNotBe mockTimeZone - - try { - // When - userManager.onFocus(firedOnSubscribe = false) - - // Then - propertiesModel.timezone shouldBe mockTimeZone - } finally { - // Clean up the mock - unmockkObject(TimeUtils) - } - } })