Skip to content

Commit e36d5b5

Browse files
authored
Merge pull request #660 from qonversion/tech/sc-38278
Added request trigger and attempt index headers to restore and purchase requests.
2 parents 21e6d0b + d032204 commit e36d5b5

14 files changed

+169
-119
lines changed

config/detekt/baseline.xml

+12-11
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
<ID>EmptyFunctionBlock:QAutomationsManagerTest.kt$QAutomationsManagerTest.&lt;no name provided&gt;${}</ID>
1313
<ID>EmptyFunctionBlock:QIdentityManagerTest.kt$QIdentityManagerTest.Identify.&lt;no name provided&gt;${}</ID>
1414
<ID>EmptyFunctionBlock:QProductCenterManager.kt$QProductCenterManager.&lt;no name provided&gt;${}</ID>
15-
<ID>EmptyFunctionBlock:QonversionInternal.kt$QonversionInternal.&lt;no name provided&gt;${}</ID>
1615
<ID>Filename:com.qonversion.android.sdk.internal.storage.util.kt:1</ID>
1716
<ID>FinalNewline:com.qonversion.android.sdk.automations.internal.AutomationsEventMapperTest.kt:1</ID>
1817
<ID>FinalNewline:com.qonversion.android.sdk.automations.internal.QAutomationsManagerTest.kt:1</ID>
@@ -122,6 +121,7 @@
122121
<ID>MaxLineLength:QonversionError.kt$QonversionErrorCode$RemoteConfigurationNotAvailable : QonversionErrorCode</ID>
123122
<ID>MaxLineLength:QonversionInternal.kt$QonversionInternal$@Deprecated("Use the new purchase() method", replaceWith = ReplaceWith("purchase(context, TODO(\"pass product here\"), callback)"))</ID>
124123
<ID>MaxLineLength:QonversionInternal.kt$QonversionInternal$@Deprecated("Use the new updatePurchase() method", replaceWith = ReplaceWith("updatePurchase(context, TODO(\"pass product here\"), TODO(\"pass purchase options here\"), callback)"))</ID>
124+
<ID>MaxLineLength:QonversionInternal.kt$QonversionInternal$productCenterManager</ID>
125125
<ID>MaxLineLength:QonversionRepositoryIntegrationTest.kt$QonversionRepositoryIntegrationTest$"""HTTP status code=400, data={"message":"Invalid access token received","code":10003,"status":400,"extra":[]}. """</ID>
126126
<ID>MaxLineLength:QonversionRepositoryIntegrationTest.kt$QonversionRepositoryIntegrationTest$"efnkoceomiocidgigbalneag.AO-J1Ow8JyXX8gs8W9blILbU9Nqy3Mr-RMTLgFG2DLOhO1urkWpr80PUSE6eA0IuEzl_k4Guecep5JZJwcnSYOWzTZhqwusafayRCbv4kRMUR-rR9Ot11nQ"</ID>
127127
<ID>MaxLineLength:QonversionRepositoryIntegrationTest.kt$QonversionRepositoryIntegrationTest$"lgeigljfpmeoddkcebkcepjc.AO-J1Oy305qZj99jXTPEVBN8UZGoYAtjDLj4uTjRQvUFaG0vie-nr6VBlN0qnNDMU8eJR-sI7o3CwQyMOEHKl8eJsoQ86KSFzxKBR07PSpHLI_o7agXhNKY"</ID>
@@ -157,20 +157,21 @@
157157
<ID>MaximumLineLength:com.qonversion.android.sdk.dto.products.QProduct.kt:120</ID>
158158
<ID>MaximumLineLength:com.qonversion.android.sdk.dto.products.QProduct.kt:139</ID>
159159
<ID>MaximumLineLength:com.qonversion.android.sdk.dto.products.QProductStoreDetails.kt:130</ID>
160-
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.OutagerIntegrationTest.kt:214</ID>
161-
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.OutagerIntegrationTest.kt:371</ID>
162-
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.OutagerIntegrationTest.kt:90</ID>
163-
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QProductCenterManager.kt:333</ID>
160+
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.OutagerIntegrationTest.kt:216</ID>
161+
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.OutagerIntegrationTest.kt:373</ID>
162+
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.OutagerIntegrationTest.kt:91</ID>
163+
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QProductCenterManager.kt:341</ID>
164164
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QProductCenterManagerTest.kt:152</ID>
165165
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QProductCenterManagerTest.kt:153</ID>
166166
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QRemoteConfigManager.kt:225</ID>
167167
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QUserPropertiesManagerTest.kt:178</ID>
168-
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QonversionInternal.kt:164</ID>
169-
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QonversionInternal.kt:215</ID>
170-
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QonversionRepositoryIntegrationTest.kt:287</ID>
171-
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QonversionRepositoryIntegrationTest.kt:356</ID>
172-
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QonversionRepositoryIntegrationTest.kt:878</ID>
173-
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QonversionRepositoryIntegrationTest.kt:89</ID>
168+
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QonversionInternal.kt:144</ID>
169+
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QonversionInternal.kt:155</ID>
170+
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QonversionInternal.kt:206</ID>
171+
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QonversionRepositoryIntegrationTest.kt:290</ID>
172+
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QonversionRepositoryIntegrationTest.kt:359</ID>
173+
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QonversionRepositoryIntegrationTest.kt:882</ID>
174+
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.QonversionRepositoryIntegrationTest.kt:90</ID>
174175
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.api.ApiErrorMapper.kt:118</ID>
175176
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.api.ApiErrorMapper.kt:119</ID>
176177
<ID>MaximumLineLength:com.qonversion.android.sdk.internal.billing.QonversionBillingService.kt:253</ID>

sdk/src/androidTest/java/com/qonversion/android/sdk/internal/OutagerIntegrationTest.kt

+6-3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import com.qonversion.android.sdk.dto.offerings.QOffering
1818
import com.qonversion.android.sdk.dto.offerings.QOfferingTag
1919
import com.qonversion.android.sdk.dto.offerings.QOfferings
2020
import com.qonversion.android.sdk.dto.products.QProduct
21+
import com.qonversion.android.sdk.internal.api.RequestTrigger
2122
import com.qonversion.android.sdk.internal.di.QDependencyInjector
2223
import com.qonversion.android.sdk.internal.dto.QLaunchResult
2324
import com.qonversion.android.sdk.internal.dto.QPermission
@@ -124,7 +125,8 @@ internal class OutagerIntegrationTest {
124125
override fun onError(error: QonversionError) {
125126
fail("Shouldn't fail")
126127
}
127-
}
128+
},
129+
RequestTrigger.Init
128130
)
129131

130132
val repository = initRepository(uid)
@@ -269,7 +271,7 @@ internal class OutagerIntegrationTest {
269271
fail("Failed to create user")
270272
}
271273

272-
repository.restoreRequest(installDate, history, callback)
274+
repository.restoreRequest(installDate, history, callback, RequestTrigger.Restore)
273275
}
274276

275277
signal.await()
@@ -525,7 +527,8 @@ internal class OutagerIntegrationTest {
525527
override fun onError(error: QonversionError) {
526528
onComplete(error)
527529
}
528-
}
530+
},
531+
RequestTrigger.Init
529532
)
530533
repository.init(data)
531534
}

sdk/src/androidTest/java/com/qonversion/android/sdk/internal/QonversionRepositoryIntegrationTest.kt

+9-5
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import com.qonversion.android.sdk.dto.offerings.QOfferingTag
2020
import com.qonversion.android.sdk.dto.offerings.QOfferings
2121
import com.qonversion.android.sdk.dto.products.QProduct
2222
import com.qonversion.android.sdk.dto.properties.QUserProperty
23+
import com.qonversion.android.sdk.internal.api.RequestTrigger
2324
import com.qonversion.android.sdk.internal.di.QDependencyInjector
2425
import com.qonversion.android.sdk.internal.dto.QLaunchResult
2526
import com.qonversion.android.sdk.internal.dto.QPermission
@@ -119,7 +120,8 @@ internal class QonversionRepositoryIntegrationTest {
119120
override fun onError(error: QonversionError) {
120121
fail("Shouldn't fail")
121122
}
122-
}
123+
},
124+
RequestTrigger.Init
123125
)
124126

125127
val repository = initRepository(uid)
@@ -150,7 +152,8 @@ internal class QonversionRepositoryIntegrationTest {
150152
assertIncorrectProjectKeyError(error)
151153
signal.countDown()
152154
}
153-
}
155+
},
156+
RequestTrigger.Init
154157
)
155158

156159
val repository = initRepository(uid, INCORRECT_PROJECT_KEY)
@@ -339,7 +342,7 @@ internal class QonversionRepositoryIntegrationTest {
339342
fail("Failed to create user")
340343
}
341344

342-
repository.restoreRequest(installDate, history, callback)
345+
repository.restoreRequest(installDate, history, callback, RequestTrigger.Restore)
343346
}
344347

345348
signal.await()
@@ -373,7 +376,7 @@ internal class QonversionRepositoryIntegrationTest {
373376
val repository = initRepository(uid, INCORRECT_PROJECT_KEY)
374377

375378
// when
376-
repository.restoreRequest(installDate, history, callback)
379+
repository.restoreRequest(installDate, history, callback, RequestTrigger.Restore)
377380

378381
signal.await()
379382
}
@@ -850,7 +853,8 @@ internal class QonversionRepositoryIntegrationTest {
850853
override fun onError(error: QonversionError) {
851854
onComplete(error)
852855
}
853-
}
856+
},
857+
RequestTrigger.Init
854858
)
855859
repository.init(data)
856860
}

sdk/src/main/java/com/qonversion/android/sdk/internal/QProductCenterManager.kt

+36-21
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.qonversion.android.sdk.dto.entitlements.QEntitlementsCacheLifetime
2828
import com.qonversion.android.sdk.dto.offerings.QOfferings
2929
import com.qonversion.android.sdk.dto.products.QProduct
3030
import com.qonversion.android.sdk.dto.products.QProductType
31+
import com.qonversion.android.sdk.internal.api.RequestTrigger
3132
import com.qonversion.android.sdk.internal.dto.QProductRenewState
3233
import com.qonversion.android.sdk.internal.billing.BillingError
3334
import com.qonversion.android.sdk.internal.billing.BillingService
@@ -126,7 +127,7 @@ internal class QProductCenterManager internal constructor(
126127
processPendingInitIfAvailable()
127128
}
128129

129-
fun launch(callback: QonversionLaunchCallback? = null) {
130+
fun launch(requestTrigger: RequestTrigger, callback: QonversionLaunchCallback? = null) {
130131
val launchCallback: QonversionLaunchCallback = getLaunchCallback(callback)
131132
launchError = null
132133
launchResultCache.resetSessionCache()
@@ -136,15 +137,15 @@ internal class QProductCenterManager internal constructor(
136137
adProvider.init(context, object : AdvertisingProvider.Callback {
137138
override fun onSuccess(advertisingId: String) {
138139
advertisingID = advertisingId
139-
continueLaunchWithPurchasesInfo(launchCallback)
140+
continueLaunchWithPurchasesInfo(launchCallback, requestTrigger)
140141
}
141142

142143
override fun onFailure(t: Throwable) {
143-
continueLaunchWithPurchasesInfo(launchCallback)
144+
continueLaunchWithPurchasesInfo(launchCallback, requestTrigger)
144145
}
145146
})
146147
} else {
147-
continueLaunchWithPurchasesInfo(launchCallback)
148+
continueLaunchWithPurchasesInfo(launchCallback, requestTrigger)
148149
}
149150
}
150151

@@ -156,7 +157,7 @@ internal class QProductCenterManager internal constructor(
156157

157158
launchResultCache.sessionLaunchResult?.let {
158159
loadStoreProductsIfPossible()
159-
} ?: launch()
160+
} ?: launch(RequestTrigger.Products)
160161
}
161162

162163
fun offerings(
@@ -204,7 +205,13 @@ internal class QProductCenterManager internal constructor(
204205
}
205206
}
206207

207-
val initRequestData = InitRequestData(installDate, advertisingID, callback = launchCallback)
208+
val initRequestData = InitRequestData(
209+
installDate,
210+
advertisingID,
211+
null,
212+
launchCallback,
213+
RequestTrigger.Identify
214+
)
208215
repository.init(initRequestData)
209216
} else {
210217
processIdentity(identityId)
@@ -226,7 +233,7 @@ internal class QProductCenterManager internal constructor(
226233
internalConfig.uid = qonversionUid
227234
remoteConfigManager.onUserUpdate()
228235
launchResultCache.clearPermissionsCache()
229-
launch(object : QonversionLaunchCallback {
236+
launch(RequestTrigger.Identify, object : QonversionLaunchCallback {
230237
override fun onSuccess(launchResult: QLaunchResult) {
231238
fireIdentitySuccess(identityId)
232239
}
@@ -309,7 +316,8 @@ internal class QProductCenterManager internal constructor(
309316
if (launchError != null) {
310317
retryLaunch(
311318
onSuccess = { tryToPurchase() },
312-
onError = { tryToPurchase() }
319+
onError = { tryToPurchase() },
320+
requestTrigger = RequestTrigger.Purchase,
313321
)
314322
} else {
315323
tryToPurchase()
@@ -394,7 +402,7 @@ internal class QProductCenterManager internal constructor(
394402
handlePendingRequests()
395403
}
396404

397-
fun restore(callback: QonversionEntitlementsCallback? = null) {
405+
fun restore(requestTrigger: RequestTrigger, callback: QonversionEntitlementsCallback? = null) {
398406
callback?.let { restoreCallbacks.add(it) }
399407

400408
if (isRestoreInProgress) {
@@ -422,12 +430,14 @@ internal class QProductCenterManager internal constructor(
422430
executeRestoreBlocksOnError(error)
423431
}
424432
}
425-
})
433+
},
434+
requestTrigger
435+
)
426436
}
427437
}
428438

429439
fun syncPurchases() {
430-
restore()
440+
restore(RequestTrigger.SyncPurchases)
431441
}
432442

433443
override fun onPurchasesCompleted(purchases: List<Purchase>) {
@@ -657,11 +667,12 @@ internal class QProductCenterManager internal constructor(
657667
}
658668

659669
private fun continueLaunchWithPurchasesInfo(
660-
callback: QonversionLaunchCallback?
670+
callback: QonversionLaunchCallback,
671+
requestTrigger: RequestTrigger,
661672
) {
662673
fun processInitDefault() {
663674
val initRequestData =
664-
InitRequestData(installDate, advertisingID, callback = callback)
675+
InitRequestData(installDate, advertisingID, null, callback, requestTrigger)
665676
processInit(initRequestData)
666677
}
667678

@@ -687,27 +698,28 @@ internal class QProductCenterManager internal constructor(
687698
installDate,
688699
advertisingID,
689700
purchasesInfo,
690-
handledPurchasesCallback
701+
handledPurchasesCallback,
702+
requestTrigger
691703
)
692704
processInit(initRequestData)
693705
}
694706
}
695707

696708
private fun getWrappedPurchasesCallback(
697709
trackingPurchases: List<Purchase>,
698-
outerCallback: QonversionLaunchCallback?
710+
outerCallback: QonversionLaunchCallback
699711
): QonversionLaunchCallback {
700712
return object : QonversionLaunchCallback {
701713
override fun onSuccess(launchResult: QLaunchResult) {
702714
handledPurchasesCache.saveHandledPurchases(trackingPurchases)
703715
trackingPurchases.forEach {
704716
removePurchaseOptions(it.productId)
705717
}
706-
outerCallback?.onSuccess(launchResult)
718+
outerCallback.onSuccess(launchResult)
707719
}
708720

709721
override fun onError(error: QonversionError) {
710-
outerCallback?.onError(error)
722+
outerCallback.onError(error)
711723
}
712724
}
713725
}
@@ -773,7 +785,7 @@ internal class QProductCenterManager internal constructor(
773785

774786
private fun handleLogout() {
775787
unhandledLogoutAvailable = false
776-
launch()
788+
launch(RequestTrigger.Logout)
777789
}
778790

779791
private fun updateLaunchResult(launchResult: QLaunchResult) {
@@ -918,9 +930,10 @@ internal class QProductCenterManager internal constructor(
918930

919931
private fun retryLaunch(
920932
onSuccess: (QLaunchResult) -> Unit,
921-
onError: (QonversionError) -> Unit
933+
onError: (QonversionError) -> Unit,
934+
requestTrigger: RequestTrigger,
922935
) {
923-
launch(object : QonversionLaunchCallback {
936+
launch(requestTrigger, object : QonversionLaunchCallback {
924937
override fun onSuccess(launchResult: QLaunchResult) = onSuccess(launchResult)
925938
override fun onError(error: QonversionError) = onError(error)
926939
})
@@ -954,7 +967,9 @@ internal class QProductCenterManager internal constructor(
954967
cachedPermissions?.let {
955968
onSuccess(it)
956969
} ?: onError(error)
957-
})
970+
},
971+
requestTrigger = RequestTrigger.ActualizePermissions
972+
)
958973
}
959974

960975
val permissions = launchResultCache.getActualPermissions() ?: emptyMap()

sdk/src/main/java/com/qonversion/android/sdk/internal/QUserPropertiesManager.kt

+12-8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.qonversion.android.sdk.dto.properties.QUserPropertyKey
88
import com.qonversion.android.sdk.dto.QonversionError
99
import com.qonversion.android.sdk.dto.QonversionErrorCode
1010
import com.qonversion.android.sdk.dto.properties.QUserProperties
11+
import com.qonversion.android.sdk.internal.api.RequestTrigger
1112
import com.qonversion.android.sdk.listeners.QonversionLaunchCallback
1213
import com.qonversion.android.sdk.internal.dto.QLaunchResult
1314
import com.qonversion.android.sdk.internal.logger.Logger
@@ -106,15 +107,18 @@ internal class QUserPropertiesManager @Inject internal constructor(
106107
isRequestInProgress = false
107108

108109
if (it.code === QonversionErrorCode.InvalidClientUid) {
109-
productCenterManager?.launch(callback = object : QonversionLaunchCallback {
110-
override fun onSuccess(launchResult: QLaunchResult) {
111-
retryPropertiesRequest()
110+
productCenterManager?.launch(
111+
RequestTrigger.UserProperties,
112+
object : QonversionLaunchCallback {
113+
override fun onSuccess(launchResult: QLaunchResult) {
114+
retryPropertiesRequest()
115+
}
116+
117+
override fun onError(error: QonversionError) {
118+
retryPropertiesRequest()
119+
}
112120
}
113-
114-
override fun onError(error: QonversionError) {
115-
retryPropertiesRequest()
116-
}
117-
})
121+
)
118122
} else {
119123
retryPropertiesRequest()
120124
}

0 commit comments

Comments
 (0)