Skip to content

Commit 9b5b254

Browse files
committed
Add duck.ai categories to feedback
1 parent 7026706 commit 9b5b254

File tree

7 files changed

+175
-20
lines changed

7 files changed

+175
-20
lines changed

subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/feedback/FeedbackSubCategoryProvider.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.duckduckgo.subscriptions.impl.feedback
1818

1919
import com.duckduckgo.di.scopes.FragmentScope
2020
import com.duckduckgo.subscriptions.impl.R
21+
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.DUCK_AI
2122
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.ITR
2223
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.PIR
2324
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.SUBS_AND_PAYMENTS
@@ -37,6 +38,7 @@ class RealFeedbackSubCategoryProvider @Inject constructor() : FeedbackSubCategor
3738
SUBS_AND_PAYMENTS -> getSubsSubCategories()
3839
PIR -> getPirSubCategories()
3940
ITR -> getItrSubCategories()
41+
DUCK_AI -> getDuckAiSubCategories()
4042
}
4143
}
4244

@@ -76,4 +78,12 @@ class RealFeedbackSubCategoryProvider @Inject constructor() : FeedbackSubCategor
7678
R.string.feedbackSubCategoryItrOther to SubscriptionFeedbackItrSubCategory.OTHER,
7779
)
7880
}
81+
82+
private fun getDuckAiSubCategories(): Map<Int, SubscriptionFeedbackSubCategory> {
83+
return mapOf(
84+
R.string.feedbackSubCategoryDuckAiSubscriberModels to SubscriptionFeedbackDuckAiSubCategory.ACCESS_SUBSCRIPTION_MODELS,
85+
R.string.feedbackSubCategoryDuckAiLoginThirdPartyBrowser to SubscriptionFeedbackDuckAiSubCategory.LOGIN_THIRD_PARTY_BROWSER,
86+
R.string.feedbackSubCategoryDuckAiOther to SubscriptionFeedbackDuckAiSubCategory.OTHER,
87+
)
88+
}
7989
}

subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/feedback/SubscriptionFeedbackCategoryFragment.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,19 @@ import androidx.lifecycle.withStarted
2424
import com.duckduckgo.anvil.annotations.InjectWith
2525
import com.duckduckgo.common.ui.viewbinding.viewBinding
2626
import com.duckduckgo.di.scopes.FragmentScope
27+
import com.duckduckgo.subscriptions.api.Product
28+
import com.duckduckgo.subscriptions.impl.PrivacyProFeature
2729
import com.duckduckgo.subscriptions.impl.R
2830
import com.duckduckgo.subscriptions.impl.SubscriptionsConstants.MONTHLY_PLAN_US
2931
import com.duckduckgo.subscriptions.impl.SubscriptionsConstants.YEARLY_PLAN_US
3032
import com.duckduckgo.subscriptions.impl.databinding.ContentFeedbackCategoryBinding
33+
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.DUCK_AI
3134
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.ITR
3235
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.PIR
3336
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.SUBS_AND_PAYMENTS
3437
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.VPN
3538
import com.duckduckgo.subscriptions.impl.repository.AuthRepository
39+
import com.duckduckgo.subscriptions.impl.repository.toProductList
3640
import javax.inject.Inject
3741
import kotlinx.coroutines.launch
3842

@@ -43,6 +47,9 @@ class SubscriptionFeedbackCategoryFragment : SubscriptionFeedbackFragment(R.layo
4347
@Inject
4448
lateinit var authRepository: AuthRepository
4549

50+
@Inject
51+
lateinit var subscriptionFeature: PrivacyProFeature
52+
4653
override fun onViewCreated(
4754
view: View,
4855
savedInstanceState: Bundle?,
@@ -62,6 +69,16 @@ class SubscriptionFeedbackCategoryFragment : SubscriptionFeedbackFragment(R.layo
6269
binding.categoryPir.setOnClickListener {
6370
listener.onUserClickedCategory(PIR)
6471
}
72+
binding.categoryDuckAi.setOnClickListener {
73+
listener.onUserClickedCategory(DUCK_AI)
74+
}
75+
76+
lifecycleScope.launch {
77+
val duckAiAvailable = isDuckAiAvailable()
78+
withStarted {
79+
binding.categoryDuckAi.isVisible = duckAiAvailable
80+
}
81+
}
6582

6683
lifecycleScope.launch {
6784
val pirAvailable = isPirCategoryAvailable()
@@ -76,6 +93,11 @@ class SubscriptionFeedbackCategoryFragment : SubscriptionFeedbackFragment(R.layo
7693
return subscription.productId in listOf(MONTHLY_PLAN_US, YEARLY_PLAN_US)
7794
}
7895

96+
private suspend fun isDuckAiAvailable(): Boolean {
97+
val isDuckAiEnabled = subscriptionFeature.duckAiPlus().isEnabled()
98+
return isDuckAiEnabled && authRepository.getEntitlements().toProductList().any { it == Product.DuckAiPlus }
99+
}
100+
79101
interface Listener {
80102
fun onUserClickedCategory(category: SubscriptionFeedbackCategory)
81103
}

subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/feedback/SubscriptionFeedbackParams.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,14 @@ import com.duckduckgo.subscriptions.api.PrivacyProUnifiedFeedback.PrivacyProFeed
2222
import com.duckduckgo.subscriptions.api.PrivacyProUnifiedFeedback.PrivacyProFeedbackSource.UNKNOWN
2323
import com.duckduckgo.subscriptions.api.PrivacyProUnifiedFeedback.PrivacyProFeedbackSource.VPN_EXCLUDED_APPS
2424
import com.duckduckgo.subscriptions.api.PrivacyProUnifiedFeedback.PrivacyProFeedbackSource.VPN_MANAGEMENT
25+
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.DUCK_AI
2526
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.ITR
2627
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.PIR
2728
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.SUBS_AND_PAYMENTS
2829
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.VPN
30+
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackDuckAiSubCategory.ACCESS_SUBSCRIPTION_MODELS
31+
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackDuckAiSubCategory.LOGIN_THIRD_PARTY_BROWSER
32+
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackDuckAiSubCategory.OTHER
2933
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackItrSubCategory.ACCESS_CODE_ISSUE
3034
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackItrSubCategory.CANT_CONTACT_ADVISOR
3135
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackItrSubCategory.UNHELPFUL
@@ -54,6 +58,7 @@ enum class SubscriptionFeedbackCategory {
5458
VPN,
5559
PIR,
5660
ITR,
61+
DUCK_AI,
5762
}
5863

5964
interface SubscriptionFeedbackSubCategory
@@ -86,6 +91,12 @@ enum class SubscriptionFeedbackItrSubCategory : SubscriptionFeedbackSubCategory
8691
OTHER,
8792
}
8893

94+
enum class SubscriptionFeedbackDuckAiSubCategory : SubscriptionFeedbackSubCategory {
95+
ACCESS_SUBSCRIPTION_MODELS,
96+
LOGIN_THIRD_PARTY_BROWSER,
97+
OTHER,
98+
}
99+
89100
internal fun PrivacyProFeedbackSource.asParams(): String {
90101
return when (this) {
91102
DDG_SETTINGS -> "settings"
@@ -110,6 +121,7 @@ internal fun SubscriptionFeedbackCategory.asParams(): String {
110121
VPN -> "vpn"
111122
PIR -> "pir"
112123
ITR -> "itr"
124+
DUCK_AI -> "duckAi"
113125
}
114126
}
115127

@@ -119,6 +131,7 @@ internal fun SubscriptionFeedbackSubCategory.asParams(): String {
119131
is SubscriptionFeedbackSubsSubCategory -> this.asParams()
120132
is SubscriptionFeedbackPirSubCategory -> this.asParams()
121133
is SubscriptionFeedbackItrSubCategory -> this.asParams()
134+
is SubscriptionFeedbackDuckAiSubCategory -> this.asParams()
122135
else -> "unknown"
123136
}
124137
}
@@ -159,3 +172,11 @@ internal fun SubscriptionFeedbackItrSubCategory.asParams(): String {
159172
SubscriptionFeedbackItrSubCategory.OTHER -> "somethingElse"
160173
}
161174
}
175+
176+
internal fun SubscriptionFeedbackDuckAiSubCategory.asParams(): String {
177+
return when (this) {
178+
ACCESS_SUBSCRIPTION_MODELS -> "accessSubscriptionModels"
179+
LOGIN_THIRD_PARTY_BROWSER -> "loginThirdPartyBrowser"
180+
OTHER -> "somethingElse"
181+
}
182+
}

subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/feedback/SubscriptionFeedbackViewModel.kt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.duckduckgo.subscriptions.api.PrivacyProUnifiedFeedback.PrivacyProFeed
2727
import com.duckduckgo.subscriptions.api.PrivacyProUnifiedFeedback.PrivacyProFeedbackSource.VPN_EXCLUDED_APPS
2828
import com.duckduckgo.subscriptions.api.PrivacyProUnifiedFeedback.PrivacyProFeedbackSource.VPN_MANAGEMENT
2929
import com.duckduckgo.subscriptions.impl.R
30+
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.DUCK_AI
3031
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.ITR
3132
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.PIR
3233
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.SUBS_AND_PAYMENTS
@@ -103,11 +104,6 @@ class SubscriptionFeedbackViewModel @Inject constructor(
103104
REPORT_PROBLEM -> {
104105
val source = newMetadata.source
105106
when (source) {
106-
SUBSCRIPTION_SETTINGS -> {
107-
newMetadata = newMetadata.copy(category = SUBS_AND_PAYMENTS)
108-
FeedbackSubCategory(newMetadata.category!!.asTitle())
109-
}
110-
111107
VPN_MANAGEMENT, VPN_EXCLUDED_APPS -> {
112108
newMetadata = newMetadata.copy(category = VPN)
113109
FeedbackSubCategory(newMetadata.category!!.asTitle())
@@ -427,6 +423,7 @@ class SubscriptionFeedbackViewModel @Inject constructor(
427423
VPN -> R.string.feedbackCategoryVpn
428424
PIR -> R.string.feedbackCategoryPir
429425
ITR -> R.string.feedbackCategoryItr
426+
DUCK_AI -> R.string.feedbackCategoryDuckAi
430427
}
431428
}
432429

@@ -477,6 +474,14 @@ class SubscriptionFeedbackViewModel @Inject constructor(
477474
}
478475
}
479476

477+
is SubscriptionFeedbackDuckAiSubCategory -> {
478+
when (this) {
479+
SubscriptionFeedbackDuckAiSubCategory.ACCESS_SUBSCRIPTION_MODELS -> R.string.feedbackSubCategoryDuckAiSubscriberModels
480+
SubscriptionFeedbackDuckAiSubCategory.LOGIN_THIRD_PARTY_BROWSER -> R.string.feedbackSubCategoryDuckAiLoginThirdPartyBrowser
481+
SubscriptionFeedbackDuckAiSubCategory.OTHER -> R.string.feedbackSubCategoryDuckAiOther
482+
}
483+
}
484+
480485
else -> {
481486
-1
482487
}

subscriptions/subscriptions-impl/src/main/res/layout/content_feedback_category.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@
4141
android:layout_height="wrap_content"
4242
app:primaryText="@string/feedbackCategoryVpn" />
4343

44+
<com.duckduckgo.common.ui.view.listitem.OneLineListItem
45+
android:id="@+id/categoryDuckAi"
46+
android:layout_width="match_parent"
47+
android:layout_height="wrap_content"
48+
android:visibility="gone"
49+
app:primaryText="@string/feedbackCategoryDuckAi" />
50+
4451
<com.duckduckgo.common.ui.view.listitem.OneLineListItem
4552
android:id="@+id/categoryPir"
4653
android:layout_width="match_parent"

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,9 @@
1717
<resources>
1818
<string name="subscriptionSettingSubscribeWithDuckAiSubtitle">Includes our VPN, Duck.ai Plus, Personal Information Removal, and Identity Theft Restoration.</string>
1919
<string name="subscriptionSettingSubscribeWithDuckAiSubtitleRow">Includes our VPN, Duck.ai Plus and Identity Theft Restoration.</string>
20+
21+
<string name="feedbackCategoryDuckAi">Duck.ai</string>
22+
<string name="feedbackSubCategoryDuckAiSubscriberModels">Unable to access the subscriber-only Duck.ai models</string>
23+
<string name="feedbackSubCategoryDuckAiLoginThirdPartyBrowser">Can\'t access Duck.ai with my subscription in other browsers</string>
24+
<string name="feedbackSubCategoryDuckAiOther">Other Duck.ai feedback</string>
2025
</resources>

0 commit comments

Comments
 (0)