8000 Better error handling for subs (#4307) · CodersSampling/DuckDuckGoAndroid@fd0f394 · GitHub
[go: up one dir, main page]

Skip to content

Commit fd0f394

Browse files
Better error handling for subs (duckduckgo#4307)
Task/Issue URL: https://app.asana.com/0/488551667048375/1206350282230200/f ### Description See task ### Steps to test this PR See task
1 parent df9aad3 commit fd0f394

File tree

5 files changed

+46
-20
lines changed

5 files changed

+46
-20
lines changed

subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/SubscriptionsManager.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -388,9 +388,13 @@ class RealSubscriptionsManager @Inject constructor(
388388
val subscription = fetchAndStoreAllData()
389389
if (subscription != null) {
390390
logcat(LogPriority.DEBUG) { "Subs: store login succeeded" }
391-
RecoverSubscriptionResult.Success(subscription)
391+
if (subscription.isActive()) {
392+
RecoverSubscriptionResult.Success(subscription)
393+
} else {
394+
RecoverSubscriptionResult.Failure(SUBSCRIPTION_NOT_FOUND_ERROR)
395+
}
392396
} else {
393-
RecoverSubscriptionResult.Failure(SUBSCRIPTION_NOT_FOUND_ERROR)
397+
RecoverSubscriptionResult.Failure("")
394398
}
395399
} else {
396400
RecoverSubscriptionResult.Failure(SUBSCRIPTION_NOT_FOUND_ERROR)
@@ -433,7 +437,7 @@ class RealSubscriptionsManager @Inject constructor(
433437
return
434438
}
435439

436-
if (subscription == null) {
440+
if (subscription == null && !isUserAuthenticated()) {
437441
createAccount()
438442
exchangeAuthToken(authRepository.getAuthToken()!!)
439443
}

subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/SubscriptionWebViewViewModel.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ class SubscriptionWebViewViewModel @Inject constructor(
9494
}
9595
is CurrentPurchase.Failure -> {
9696
enablePurchaseButton()
97-
Failure(it.message)
97+
Failure
9898
}
9999
is CurrentPurchase.Waiting -> {
100100
subscriptionsChecker.runChecker()
@@ -182,7 +182,7 @@ class SubscriptionWebViewViewModel @Inject constructor(
182182
val id = runCatching { data?.getString("id") }.getOrNull()
183183
if (id.isNullOrBlank()) {
184184
pixelSender.reportPurchaseFailureOther()
185-
_currentPurchaseViewState.emit(currentPurchaseViewState.value.copy(purchaseState = Failure("")))
185+
_currentPurchaseViewState.emit(currentPurchaseViewState.value.copy(purchaseState = Failure))
186186
} else {
187187
command.send(SubscriptionSelected(id))
188188
}
@@ -268,7 +268,7 @@ class SubscriptionWebViewViewModel @Inject constructor(
268268
data class Success(val subscriptionEventData: SubscriptionEventData) : PurchaseStateView()
269269
data object Waiting : PurchaseStateView()
270270
data object Recovered : PurchaseStateView()
271-
data class Failure(val message: String) : PurchaseStateView()
271+
data object Failure : PurchaseStateView()
272272
}
273273

274274
sealed class Command {

subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/ui/SubscriptionsWebViewActivity.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ class SubscriptionsWebViewActivity : DuckDuckGoActivity(), DownloadConfirmationD
441441
onPurchaseRecovered()
442442
}
443443
is PurchaseStateView.Failure -> {
444-
onPurchaseFailure(purchaseState.message)
444+
onPurchaseFailure()
445445
}
446446
}
447447
}
@@ -480,16 +480,15 @@ class SubscriptionsWebViewActivity : DuckDuckGoActivity(), DownloadConfirmationD
480480
.show()
481481
}
482482

483-
private fun onPurchaseFailure(message: String) {
483+
private fun onPurchaseFailure() {
484484
TextAlertDialogBuilder(this)
485485
.setTitle(getString(string.purchaseErrorTitle))
486-
.setMessage(message)
487-
.setDestructiveButtons(true)
488-
.setPositiveButton(string.ok)
486+
.setMessage(getString(string.purchaseError))
487+
.setPositiveButton(string.backToSettings)
489488
.addEventListener(
490489
object : TextAlertDialogBuilder.EventListener() {
491490
override fun onPositiveButtonClicked() {
492-
// NOOP
491+
finish()
493492
}
494493
},
495494
)

subscriptions/subscriptions-impl/src/main/res/values/donottranslate.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@
3535
<string name="addDeviceGooglePlayDescription">Privacy Pro is available on any device signed in to your Google Play Store account.</string>
3636

3737
<!--Restore Subscriptions Activity-->
38-
<string name="somethingWentWrong">Something Went Wrong</string>
38+
<string name="backToSettings">Back to Settings</string>
39+
<string name="somethingWentWrong">Something went wrong</string>
3940
<string name="somethingWentWrongDescription">Google Play was unable to process your purchase. Please try again later.</string>
4041
<string name="youAreSet">You\'re all set.</string>
4142
<string name="viewPlans">View Plans</string>
@@ -75,8 +76,8 @@
7576
<string name="purchaseCompletedTitle">You\'re all set.</string>
7677
<string name="purchaseCompletedText">Your purchase was successful</string>
7778
<string name="purchaseRecoveredText">Your already had a subscription and we\'ve recovered that for you.</string>
78-
<string name="purchaseErrorTitle">Something went wrong :(</string>
79-
<string name="purchaseIdNotFound">We couldn\'t find the subscription. Please try again.</string>
79+
<string name="purchaseErrorTitle">Something went wrong</string>
80+
<string name="purchaseError">We\'re having trouble connecting. Please try again later.</string>
8081

8182
<!-- PIR Settings-->
8283
<string name="pirSettingTitle">Personal Information Removal</string>

subscriptions/subscriptions-impl/src/test/java/com/duckduckgo/subscriptions/impl/RealSubscriptionsManagerTest.kt

Lines changed: 27 additions & 5 deletions
< F438 /tr>
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,18 @@ class RealSubscriptionsManagerTest {
145145
assertTrue(subscription.entitlements.firstOrNull { it.product == NetP.value } != null)
146146
}
147147

148+
@Test
149+
fun whenRecoverSubscriptionFromStoreIfSubscriptionExpiredThenReturnFailure() = runTest {
150+
givenPurchaseStored()
151+
givenStoreLoginSucceeds()
152+
givenSubscriptionExists(EXPIRED)
153+
givenAccessTokenSucceeds()
154+
155+
val result = subscriptionsManager.recoverSubscriptionFromStore()
156+
157+
assertTrue(result is RecoverSubscriptionResult.Failure)
158+
}
159+
148160
@Test
149161
fun whenRecoverSubscriptionFromStoreIfValidateTokenFailsReturnFailure() = runTest {
150162
givenUserIsAuthenticated()
@@ -323,9 +335,9 @@ class RealSubscriptionsManagerTest {
323335
}
324336

325337
@Test
326-
fun whenPurchaseFlowIfValidateTokenFailsReturnFailure() = runTest {
327-
givenUserIsAuthenticated()
328-
givenValidateTokenFails("failure")
338+
fun whenPurchaseFlowIfCreateAccountFailsReturnFailure() = runTest {
339+
givenUserIsNotAuthenticated()
340+
givenCreateAccountFails()
329341

330342
subscriptionsManager.currentPurchaseState.test {
331343
subscriptionsManager.purchase(mock(), mock(), "", false)
@@ -335,6 +347,16 @@ class RealSubscriptionsManagerTest {
335347
}
336348
}
337349

350+
@Test
351+
fun whenPurchaseFlowIfNullSubscriptionAndAuthenticatedThenDoNotCreateAccount() = runTest {
352+
givenUserIsAuthenticated()
353+
givenValidateTokenFails("failure")
354+
355+
subscriptionsManager.purchase(mock(), mock(), "", false)
356+
357+
verify(authService, never()).createAccount(any())
358+
}
359+
338360
@Test
339361
fun whenPurchaseFlowIfAccountCreatedThenSetTokens() = runTest {
340362
givenUserIsNotAuthenticated()
@@ -868,11 +890,11 @@ class RealSubscriptionsManagerTest {
868890
)
869891
}
870892

871-
private fun givenSubscriptionExists() {
893+
private fun givenSubscriptionExists(status: SubscriptionStatus = AUTO_RENEWABLE) {
872894
authDataStore.platform = "google"
873895
authDataStore.productId = "productId"
874896
authDataStore.entitlements = """[{"product":"product", "name":"name"}]"""
875-
authDataStore.status = "Auto-Renewable"
897+
authDataStore.status = status.statusName
876898
authDataStore.startedAt = 1000L
877899
authDataStore.expiresOrRenewsAt = 1000L
878900
}

0 commit comments

Comments
 (0)
0