Skip to content

Commit a83b990

Browse files
authored
Merge pull request #2036 from OneSignal/fix/limit_some_rest_calls_to_foreground
[Improvement] limit refresh User and GET IAMs to foreground
2 parents b44b489 + 3b85296 commit a83b990

File tree

4 files changed

+77
-7
lines changed

4 files changed

+77
-7
lines changed

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -323,12 +323,6 @@ internal class OneSignalImp : IOneSignal, IServiceProvider {
323323
}
324324
} else {
325325
Logging.debug("initWithContext: using cached user ${identityModelStore!!.model.onesignalId}")
326-
operationRepo!!.enqueue(
327-
RefreshUserOperation(
328-
configModel!!.appId,
329-
identityModelStore!!.model.onesignalId,
330-
),
331-
)
332326
}
333327

334328
startupService!!.start()

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/UserModule.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.onesignal.common.modules.IModule
44
import com.onesignal.common.services.ServiceBuilder
55
import com.onesignal.core.internal.operations.IOperationExecutor
66
import com.onesignal.core.internal.startup.IBootstrapService
7+
import com.onesignal.core.internal.startup.IStartableService
78
import com.onesignal.user.internal.UserManager
89
import com.onesignal.user.internal.backend.IIdentityBackendService
910
import com.onesignal.user.internal.backend.ISubscriptionBackendService
@@ -24,6 +25,7 @@ import com.onesignal.user.internal.operations.impl.listeners.IdentityModelStoreL
2425
import com.onesignal.user.internal.operations.impl.listeners.PropertiesModelStoreListener
2526
import com.onesignal.user.internal.operations.impl.listeners.SubscriptionModelStoreListener
2627
import com.onesignal.user.internal.properties.PropertiesModelStore
28+
import com.onesignal.user.internal.service.UserRefreshService
2729
import com.onesignal.user.internal.subscriptions.ISubscriptionManager
2830
import com.onesignal.user.internal.subscriptions.SubscriptionModelStore
2931
import com.onesignal.user.internal.subscriptions.impl.SubscriptionManager
@@ -61,5 +63,7 @@ internal class UserModule : IModule {
6163
builder.register<LoginUserFromSubscriptionOperationExecutor>().provides<IOperationExecutor>()
6264
builder.register<RefreshUserOperationExecutor>().provides<IOperationExecutor>()
6365
builder.register<UserManager>().provides<IUserManager>()
66+
67+
builder.register<UserRefreshService>().provides<IStartableService>()
6468
}
6569
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.onesignal.user.internal.service
2+
3+
import com.onesignal.core.internal.application.IApplicationLifecycleHandler
4+
import com.onesignal.core.internal.application.IApplicationService
5+
import com.onesignal.core.internal.config.ConfigModelStore
6+
import com.onesignal.core.internal.operations.IOperationRepo
7+
import com.onesignal.core.internal.startup.IStartableService
8+
import com.onesignal.user.internal.identity.IdentityModelStore
9+
import com.onesignal.user.internal.operations.RefreshUserOperation
10+
11+
// Ensure cache for the user is refreshed once per cold start when app
12+
// is in the foreground. This saves resources as there are a number of
13+
// events (such as push received or non-OneSignal events) that start
14+
// the app in the background but will never read/write any user
15+
// properties.
16+
class UserRefreshService(
17+
private val _applicationService: IApplicationService,
18+
private val _operationRepo: IOperationRepo,
19+
private val _configModelStore: ConfigModelStore,
20+
private val _identityModelStore: IdentityModelStore,
21+
) : IStartableService,
22+
IApplicationLifecycleHandler {
23+
private fun refreshUser() {
24+
_operationRepo.enqueue(
25+
RefreshUserOperation(
26+
_configModelStore.model.appId,
27+
_identityModelStore.model.onesignalId,
28+
),
29+
)
30+
}
31+
32+
override fun start() {
33+
if (_applicationService.isInForeground) {
34+
refreshUser()
35+
} else {
36+
_applicationService.addApplicationLifecycleHandler(this)
37+
}
38+
}
39+
40+
private var onFocusCalled: Boolean = false
41+
42+
override fun onFocus() {
43+
if (onFocusCalled) return
44+
onFocusCalled = true
45+
refreshUser()
46+
}
47+
48+
override fun onUnfocused() { }
49+
}

OneSignalSDK/onesignal/in-app-messages/src/main/java/com/onesignal/inAppMessages/internal/InAppMessagesManager.kt

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.onesignal.common.exceptions.BackendException
99
import com.onesignal.common.modeling.ISingletonModelStoreChangeHandler
1010
import com.onesignal.common.modeling.ModelChangedArgs
1111
import com.onesignal.common.threading.suspendifyOnThread
12+
import com.onesignal.core.internal.application.IApplicationLifecycleHandler
1213
import com.onesignal.core.internal.application.IApplicationService
1314
import com.onesignal.core.internal.config.ConfigModel
1415
import com.onesignal.core.internal.config.ConfigModelStore
@@ -71,7 +72,8 @@ internal class InAppMessagesManager(
7172
ISingletonModelStoreChangeHandler<ConfigModel>,
7273
IInAppLifecycleEventHandler,
7374
ITriggerHandler,
74-
ISessionLifecycleHandler {
75+
ISessionLifecycleHandler,
76+
IApplicationLifecycleHandler {
7577
private val lifecycleCallback = EventProducer<IInAppMessageLifecycleListener>()
7678
private val messageClickCallback = EventProducer<IInAppMessageClickListener>()
7779

@@ -133,6 +135,7 @@ internal class InAppMessagesManager(
133135
_lifecycle.subscribe(this)
134136
_triggerController.subscribe(this)
135137
_sessionService.subscribe(this)
138+
_applicationService.addApplicationLifecycleHandler(this)
136139

137140
suspendifyOnThread {
138141
_repository.cleanCachedInAppMessages()
@@ -225,6 +228,14 @@ internal class InAppMessagesManager(
225228

226229
// called when a new push subscription is added, or the app id is updated, or a new session starts
227230
private suspend fun fetchMessages() {
231+
// We only want to fetch IAMs if we know the app is in the
232+
// foreground, as we don't want to do this for background
233+
// events (such as push received), wasting resources for
234+
// IAMs that are never shown.
235+
if (!_applicationService.isInForeground) {
236+
return
237+
}
238+
228239
val appId = _configModelStore.model.appId
229240
val subscriptionId = _subscriptionManager.subscriptions.push.id
230241

@@ -869,4 +880,16 @@ internal class InAppMessagesManager(
869880
.setPositiveButton(android.R.string.ok) { _, _ -> suspendifyOnThread { showMultiplePrompts(inAppMessage, prompts) } }
870881
.show()
871882
}
883+
884+
private var onFocusCalled: Boolean = false
885+
886+
override fun onFocus() {
887+
if (onFocusCalled) return
888+
onFocusCalled = true
889+
suspendifyOnThread {
890+
fetchMessages()
891+
}
892+
}
893+
894+
override fun onUnfocused() { }
872895
}

0 commit comments

Comments
 (0)