Skip to content

Commit 8b72576

Browse files
committed
address review comments
1 parent b4a7360 commit 8b72576

File tree

5 files changed

+430
-486
lines changed

5 files changed

+430
-486
lines changed

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/common/AndroidUtils.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ object AndroidUtils {
6868
return appVersion?.toString()
6969
}
7070

71+
// return Build.VERSION.SDK_INT; can be mocked to test specific functionalities under different SDK levels
72+
val androidSDKInt: Int = Build.VERSION.SDK_INT
73+
7174
fun getManifestMeta(
7275
context: Context,
7376
metaName: String?,

OneSignalSDK/onesignal/in-app-messages/src/test/java/com/onesignal/inAppMessages/internal/InAppMessagesManagerTests.kt

Lines changed: 44 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -66,26 +66,26 @@ private class Mocks {
6666
val identityModelStore = MockHelper.identityModelStore()
6767
val pushSubscription = mockk<IPushSubscription>(relaxed = true)
6868
val outcomeEventsController = mockk<IOutcomeEventsController>(relaxed = true)
69-
val state = mockk<InAppStateService>(relaxed = true)
70-
val prefs = mockk<IInAppPreferencesController>(relaxed = true)
69+
val inAppStateService = mockk<InAppStateService>(relaxed = true)
70+
val inAppPreferencesController = mockk<IInAppPreferencesController>(relaxed = true)
7171
val repository = mockk<IInAppRepository>(relaxed = true)
7272
val backend = mockk<IInAppBackendService>(relaxed = true)
7373
val triggerController = mockk<ITriggerController>(relaxed = true)
7474
val triggerModelStore = mockk<TriggerModelStore>(relaxed = true)
75-
val inAppDisplay = mockk<IInAppDisplayer>(relaxed = true)
76-
val lifecycle = mockk<IInAppLifecycleService>(relaxed = true)
75+
val inAppDisplayer = mockk<IInAppDisplayer>(relaxed = true)
76+
val inAppLifecycleService = mockk<IInAppLifecycleService>(relaxed = true)
7777
val languageContext = MockHelper.languageContext()
7878
val time = MockHelper.time(1000)
7979
val inAppMessageLifecycleListener = spyk<IInAppMessageLifecycleListener>()
8080
val inAppMessageClickListener = spyk<IInAppMessageClickListener>()
8181
val rywData = RywData("token", 100L)
8282

83-
val deferred = mockk<CompletableDeferred<RywData?>>() {
83+
val rywDeferred = mockk<CompletableDeferred<RywData?>> {
8484
coEvery { await() } returns rywData
8585
}
8686

8787
val consistencyManager = mockk<IConsistencyManager>(relaxed = true) {
88-
coEvery { getRywDataFromAwaitableCondition(any<IamFetchReadyCondition>()) } returns deferred
88+
coEvery { getRywDataFromAwaitableCondition(any<IamFetchReadyCondition>()) } returns rywDeferred
8989
}
9090

9191
val subscriptionManager = mockk<ISubscriptionManager>(relaxed = true) {
@@ -94,7 +94,7 @@ private class Mocks {
9494
}
9595
}
9696

97-
val outcome =
97+
val testOutcome =
9898
run {
9999
val outcome = mockk<InAppMessageOutcome>(relaxed = true)
100100
every { outcome.name } returns "outcome-name"
@@ -105,7 +105,7 @@ private class Mocks {
105105
run {
106106
val result = mockk<InAppMessageClickResult>(relaxed = true)
107107
every { result.prompts } returns mutableListOf()
108-
every { result.outcomes } returns mutableListOf(outcome)
108+
every { result.outcomes } returns mutableListOf(testOutcome)
109109
every { result.tags } returns null
110110
every { result.url } returns null
111111
every { result.clickId } returns "click-id"
@@ -140,14 +140,14 @@ private class Mocks {
140140
identityModelStore,
141141
subscriptionManager,
142142
outcomeEventsController,
143-
state,
144-
prefs,
143+
inAppStateService,
144+
inAppPreferencesController,
145145
repository,
146146
backend,
147147
triggerController,
148148
triggerModelStore,
149-
inAppDisplay,
150-
lifecycle,
149+
inAppDisplayer,
150+
inAppLifecycleService,
151151
languageContext,
152152
time,
153153
consistencyManager,
@@ -194,13 +194,9 @@ class InAppMessagesManagerTests : FunSpec({
194194
iamManager.clearTriggers()
195195

196196
// Then
197-
triggerModelSlots[0].key shouldBe "trigger-key1"
198-
triggerModelSlots[0].value shouldBe "trigger-value1"
199-
triggerModelSlots[1].key shouldBe "trigger-key2"
200-
triggerModelSlots[1].value shouldBe "trigger-value2"
201-
triggerModelSlots[2].key shouldBe "trigger-key3"
202-
triggerModelSlots[2].value shouldBe "trigger-value3"
203-
197+
with(triggerModelSlots[0]) { key to value } shouldBe ("trigger-key1" to "trigger-value1")
198+
with(triggerModelSlots[1]) { key to value } shouldBe ("trigger-key2" to "trigger-value2")
199+
with(triggerModelSlots[2]) { key to value } shouldBe ("trigger-key3" to "trigger-value3")
204200
verify(exactly = 1) { mockTriggerModelStore.remove("trigger-key4") }
205201
verify(exactly = 1) { mockTriggerModelStore.remove("trigger-key5") }
206202
verify(exactly = 1) { mockTriggerModelStore.remove("trigger-key6") }
@@ -238,15 +234,14 @@ class InAppMessagesManagerTests : FunSpec({
238234

239235
// Then
240236
triggerModelSlots.size shouldBe 1
241-
triggerModelSlots[0].key shouldBe "new-key"
242-
triggerModelSlots[0].value shouldBe "new-value"
237+
with(triggerModelSlots[0]) { key to value } shouldBe ("new-key" to "new-value")
243238
}
244239
}
245240

246241
context("Initialization and Start") {
247242
test("start loads dismissed messages from preferences") {
248243
// Given
249-
val mockPrefs = mocks.prefs
244+
val mockPrefs = mocks.inAppPreferencesController
250245
val dismissedSet = setOf("dismissed-1", "dismissed-2")
251246
val mockRepository = mocks.repository
252247
every { mockPrefs.dismissedMessagesId } returns dismissedSet
@@ -264,8 +259,8 @@ class InAppMessagesManagerTests : FunSpec({
264259

265260
test("start loads last dismissal time from preferences") {
266261
// Given
267-
val mockPrefs = mocks.prefs
268-
val mockState = mocks.state
262+
val mockPrefs = mocks.inAppPreferencesController
263+
val mockState = mocks.inAppStateService
269264
val lastDismissalTime = 5000L
270265
every { mockPrefs.dismissedMessagesId } returns null
271266
every { mockPrefs.lastTimeInAppDismissed } returns lastDismissalTime
@@ -310,7 +305,7 @@ class InAppMessagesManagerTests : FunSpec({
310305

311306
// Then
312307
verify { mocks.subscriptionManager.subscribe(any()) }
313-
verify { mocks.lifecycle.subscribe(any()) }
308+
verify { mocks.inAppLifecycleService.subscribe(any()) }
314309
verify { mocks.triggerController.subscribe(any()) }
315310
verify { mocks.sessionService.subscribe(any()) }
316311
verify { mocks.applicationService.addApplicationLifecycleHandler(any()) }
@@ -320,7 +315,7 @@ class InAppMessagesManagerTests : FunSpec({
320315
context("Paused Property") {
321316
test("paused getter returns state paused value") {
322317
// Given
323-
every { mocks.state.paused } returns true
318+
every { mocks.inAppStateService.paused } returns true
324319

325320
// When
326321
val result = mocks.inAppMessagesManager.paused
@@ -331,11 +326,11 @@ class InAppMessagesManagerTests : FunSpec({
331326

332327
test("setting paused to true does nothing when no message showing") {
333328
// Given
334-
val mockState = mocks.state
335-
val mockDisplayer = mocks.inAppDisplay
329+
val mockState = mocks.inAppStateService
330+
val mockDisplayer = mocks.inAppDisplayer
336331
val iamManager = mocks.inAppMessagesManager
337332
every { mockState.paused } returns false
338-
every { mocks.state.inAppMessageIdShowing } returns null
333+
every { mocks.inAppStateService.inAppMessageIdShowing } returns null
339334

340335
// When
341336
iamManager.paused = true
@@ -413,7 +408,7 @@ class InAppMessagesManagerTests : FunSpec({
413408
context("Config Model Changes") {
414409
test("onModelUpdated fetches messages when appId property changes") {
415410
// Given
416-
val mockDeferred = mocks.deferred
411+
val mockDeferred = mocks.rywDeferred
417412
every { mocks.userManager.onesignalId } returns "onesignal-id"
418413
every { mocks.applicationService.isInForeground } returns true
419414
every { mocks.pushSubscription.id } returns "subscription-id"
@@ -473,7 +468,7 @@ class InAppMessagesManagerTests : FunSpec({
473468
context("Subscription Changes") {
474469
test("onSubscriptionChanged fetches messages when push subscription id changes") {
475470
// Given
476-
val mockDeferred = mocks.deferred
471+
val mockDeferred = mocks.rywDeferred
477472
val subscriptionModel = SubscriptionModel()
478473
val args = ModelChangedArgs(
479474
subscriptionModel,
@@ -566,7 +561,7 @@ class InAppMessagesManagerTests : FunSpec({
566561
val message1 = mocks.testInAppMessage
567562
val message2 = mocks.testInAppMessage
568563
val mockRywData = mocks.rywData
569-
val mockDeferred = mocks.deferred
564+
val mockDeferred = mocks.rywDeferred
570565
val mockRepository = mocks.repository
571566

572567
message1.isDisplayedInSession = true
@@ -698,7 +693,7 @@ class InAppMessagesManagerTests : FunSpec({
698693

699694
test("onMessageWasDismissed calls messageWasDismissed") {
700695
// Given
701-
every { mocks.state.inAppMessageIdShowing } returns null
696+
every { mocks.inAppStateService.inAppMessageIdShowing } returns null
702697

703698
// When
704699
mocks.inAppMessagesManager.onMessageWasDismissed(mocks.testInAppMessage)
@@ -786,7 +781,7 @@ class InAppMessagesManagerTests : FunSpec({
786781
val mockPrompt = mockk<InAppMessagePrompt>(relaxed = true)
787782
every { mockPrompt.hasPrompted() } returns false
788783
coEvery { mockPrompt.handlePrompt() } returns InAppMessagePrompt.PromptActionResult.PERMISSION_GRANTED
789-
every { mocks.state.currentPrompt } returns null
784+
every { mocks.inAppStateService.currentPrompt } returns null
790785
mocks.inAppMessagesManager.addClickListener(mockClickListener)
791786

792787
// When
@@ -950,14 +945,14 @@ class InAppMessagesManagerTests : FunSpec({
950945
every { mocks.triggerController.evaluateMessageTriggers(message) } returns true
951946
every { mocks.triggerController.isTriggerOnMessage(any(), any()) } returns false
952947
every { mocks.triggerController.messageHasOnlyDynamicTriggers(any()) } returns false
953-
every { mocks.state.inAppMessageIdShowing } returns null
954-
every { mocks.state.paused } returns true
948+
every { mocks.inAppStateService.inAppMessageIdShowing } returns null
949+
every { mocks.inAppStateService.paused } returns true
955950

956951
// When - fetch messages while paused
957952
mocks.inAppMessagesManager.onSessionStarted()
958953

959954
// Then - should not display
960-
coVerify(exactly = 0) { mocks.inAppDisplay.displayMessage(any()) }
955+
coVerify(exactly = 0) { mocks.inAppDisplayer.displayMessage(any()) }
961956
}
962957
}
963958

@@ -971,11 +966,11 @@ class InAppMessagesManagerTests : FunSpec({
971966
every { mocks.triggerController.evaluateMessageTriggers(message) } returns true
972967
every { mocks.triggerController.isTriggerOnMessage(any(), any()) } returns false
973968
every { mocks.triggerController.messageHasOnlyDynamicTriggers(any()) } returns false
974-
every { mocks.state.inAppMessageIdShowing } returns null
975-
every { mocks.state.paused } returns true
969+
every { mocks.inAppStateService.inAppMessageIdShowing } returns null
970+
every { mocks.inAppStateService.paused } returns true
976971
coEvery { mocks.applicationService.waitUntilSystemConditionsAvailable() } returns true
977972
coEvery { mocks.backend.listInAppMessages(any(), any(), any(), any()) } returns listOf(message)
978-
coEvery { mocks.inAppDisplay.displayMessage(any()) } returns true
973+
coEvery { mocks.inAppDisplayer.displayMessage(any()) } returns true
979974

980975
// Fetch messages first
981976
mocks.inAppMessagesManager.onSessionStarted()
@@ -996,7 +991,7 @@ class InAppMessagesManagerTests : FunSpec({
996991
every { mocks.triggerController.evaluateMessageTriggers(message) } returns true
997992
every { mocks.triggerController.isTriggerOnMessage(any(), any()) } returns false
998993
every { mocks.triggerController.messageHasOnlyDynamicTriggers(any()) } returns false
999-
every { mocks.state.paused } returns false
994+
every { mocks.inAppStateService.paused } returns false
1000995

1001996
// Fetch messages
1002997
mocks.inAppMessagesManager.onSessionStarted()
@@ -1008,7 +1003,7 @@ class InAppMessagesManagerTests : FunSpec({
10081003
mocks.inAppMessagesManager.paused = false
10091004

10101005
// Then - should not display dismissed message
1011-
coVerify(exactly = 0) { mocks.inAppDisplay.displayMessage(message) }
1006+
coVerify(exactly = 0) { mocks.inAppDisplayer.displayMessage(message) }
10121007
}
10131008
}
10141009

@@ -1026,7 +1021,7 @@ class InAppMessagesManagerTests : FunSpec({
10261021
test("onMessageActionOccurredOnMessage fires outcomes with weight") {
10271022
// Given
10281023
val weight = 5.0f
1029-
every { mocks.outcome.weight } returns weight
1024+
every { mocks.testOutcome.weight } returns weight
10301025

10311026
// When
10321027
mocks.inAppMessagesManager.onMessageActionOccurredOnMessage(mocks.testInAppMessage, mocks.inAppMessageClickResult)
@@ -1121,14 +1116,14 @@ class InAppMessagesManagerTests : FunSpec({
11211116
every { mockPrompt.setPrompted(any()) } just runs
11221117
// currentPrompt starts as null, then gets set to the prompt during processing
11231118
var currentPrompt: InAppMessagePrompt? = null
1124-
every { mocks.state.currentPrompt } answers { currentPrompt }
1125-
every { mocks.state.currentPrompt = any() } answers { currentPrompt = firstArg() }
1119+
every { mocks.inAppStateService.currentPrompt } answers { currentPrompt }
1120+
every { mocks.inAppStateService.currentPrompt = any() } answers { currentPrompt = firstArg() }
11261121

11271122
// When
11281123
mocks.inAppMessagesManager.onMessageActionOccurredOnMessage(mocks.testInAppMessage, mocks.inAppMessageClickResult)
11291124

11301125
// Then
1131-
coVerify { mocks.inAppDisplay.dismissCurrentInAppMessage() }
1126+
coVerify { mocks.inAppDisplayer.dismissCurrentInAppMessage() }
11321127
coVerify { mockPrompt.setPrompted(any()) }
11331128
}
11341129

@@ -1139,7 +1134,7 @@ class InAppMessagesManagerTests : FunSpec({
11391134
mocks.inAppMessagesManager.onMessageActionOccurredOnMessage(mocks.testInAppMessage, mocks.inAppMessageClickResult)
11401135

11411136
// Then
1142-
coVerify(exactly = 0) { mocks.inAppDisplay.dismissCurrentInAppMessage() }
1137+
coVerify(exactly = 0) { mocks.inAppDisplayer.dismissCurrentInAppMessage() }
11431138
}
11441139
}
11451140

@@ -1148,8 +1143,8 @@ class InAppMessagesManagerTests : FunSpec({
11481143
// Given
11491144
val message = mocks.testInAppMessage
11501145
coEvery { mocks.repository.saveInAppMessage(any()) } just runs
1151-
every { mocks.state.lastTimeInAppDismissed } returns 500L
1152-
every { mocks.state.currentPrompt } returns null
1146+
every { mocks.inAppStateService.lastTimeInAppDismissed } returns 500L
1147+
every { mocks.inAppStateService.currentPrompt } returns null
11531148

11541149
// When
11551150
mocks.inAppMessagesManager.onMessageWasDismissed(message)

OneSignalSDK/onesignal/location/src/main/java/com/onesignal/location/internal/LocationManager.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,12 @@ internal class LocationManager(
9595
_capturer.locationCoarse = true
9696
}
9797

98-
if (Build.VERSION.SDK_INT >= 29) {
98+
val androidSDKInt = AndroidUtils.androidSDKInt
99+
if (androidSDKInt >= 29) {
99100
hasBackgroundPermissionGranted = AndroidUtils.hasPermission(LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING, true, _applicationService)
100101
}
101102

102-
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
103+
if (androidSDKInt < Build.VERSION_CODES.M) {
103104
if (!hasFinePermissionGranted && !hasCoarsePermissionGranted) {
104105
// Permission missing on manifest
105106
Logging.error("Location permissions not added on AndroidManifest file < M")
@@ -130,7 +131,7 @@ internal class LocationManager(
130131
// ACCESS_COARSE_LOCATION permission defined on Manifest, prompt for permission
131132
// If permission already given prompt will return positive, otherwise will prompt again or show settings
132133
requestPermission = LocationConstants.ANDROID_COARSE_LOCATION_PERMISSION_STRING
133-
} else if (Build.VERSION.SDK_INT >= 29 && permissionList.contains(LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING)) {
134+
} else if (androidSDKInt >= 29 && permissionList.contains(LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING)) {
134135
// ACCESS_BACKGROUND_LOCATION permission defined on Manifest, prompt for permission
135136
requestPermission = LocationConstants.ANDROID_BACKGROUND_LOCATION_PERMISSION_STRING
136137
}
@@ -151,7 +152,7 @@ internal class LocationManager(
151152
} else {
152153
hasCoarsePermissionGranted
153154
}
154-
} else if (Build.VERSION.SDK_INT >= 29 && !hasBackgroundPermissionGranted) {
155+
} else if (androidSDKInt >= 29 && !hasBackgroundPermissionGranted) {
155156
result = backgroundLocationPermissionLogic(true)
156157
} else {
157158
result = true

0 commit comments

Comments
 (0)