Skip to content

Commit f8bc564

Browse files
committed
Add duck.ai categories to feedback
1 parent 2c15ec1 commit f8bc564

File tree

7 files changed

+180
-20
lines changed

7 files changed

+180
-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: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,24 @@ import androidx.lifecycle.lifecycleScope
2323
import androidx.lifecycle.withStarted
2424
import com.duckduckgo.anvil.annotations.InjectWith
2525
import com.duckduckgo.common.ui.viewbinding.viewBinding
26+
import com.duckduckgo.common.utils.DispatcherProvider
2627
import com.duckduckgo.di.scopes.FragmentScope
28+
import com.duckduckgo.subscriptions.api.Product
29+
import com.duckduckgo.subscriptions.impl.PrivacyProFeature
2730
import com.duckduckgo.subscriptions.impl.R
2831
import com.duckduckgo.subscriptions.impl.SubscriptionsConstants.MONTHLY_PLAN_US
2932
import com.duckduckgo.subscriptions.impl.SubscriptionsConstants.YEARLY_PLAN_US
3033
import com.duckduckgo.subscriptions.impl.databinding.ContentFeedbackCategoryBinding
34+
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.DUCK_AI
3135
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.ITR
3236
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.PIR
3337
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.SUBS_AND_PAYMENTS
3438
import com.duckduckgo.subscriptions.impl.feedback.SubscriptionFeedbackCategory.VPN
3539
import com.duckduckgo.subscriptions.impl.repository.AuthRepository
40+
import com.duckduckgo.subscriptions.impl.repository.toProductList
3641
import javax.inject.Inject
3742
import kotlinx.coroutines.launch
43+
import kotlinx.coroutines.withContext
3844

3945
@InjectWith(FragmentScope::class)
4046
class SubscriptionFeedbackCategoryFragment : SubscriptionFeedbackFragment(R.layout.content_feedback_category) {
@@ -43,6 +49,12 @@ class SubscriptionFeedbackCategoryFragment : SubscriptionFeedbackFragment(R.layo
4349
@Inject
4450
lateinit var authRepository: AuthRepository
4551

52+
@Inject
53+
lateinit var subscriptionFeature: PrivacyProFeature
54+
55+
@Inject
56+
lateinit var dispatcherProvider: DispatcherProvider
57+
4658
override fun onViewCreated(
4759
view: View,
4860
savedInstanceState: Bundle?,
@@ -62,6 +74,16 @@ class SubscriptionFeedbackCategoryFragment : SubscriptionFeedbackFragment(R.layo
6274
binding.categoryPir.setOnClickListener {
6375
listener.onUserClickedCategory(PIR)
6476
}
77+
binding.categoryDuckAi.setOnClickListener {
78+
listener.onUserClickedCategory(DUCK_AI)
79+
}
80+
81+
lifecycleScope.launch {
82+
val duckAiAvailable = isDuckAiAvailable()
83+
withStarted {
84+
binding.categoryDuckAi.isVisible = duckAiAvailable
85+
}
86+
}
6587

6688
lifecycleScope.launch {
6789
val pirAvailable = isPirCategoryAvailable()
@@ -76,6 +98,11 @@ class SubscriptionFeedbackCategoryFragment : SubscriptionFeedbackFragment(R.layo
7698
return subscription.productId in listOf(MONTHLY_PLAN_US, YEARLY_PLAN_US)
7799
}
78100

101+
private suspend fun isDuckAiAvailable(): Boolean = withContext(dispatcherProvider.io()) {
102+
val isDuckAiEnabled = subscriptionFeature.duckAiPlus().isEnabled()
103+
isDuckAiEnabled && authRepository.getEntitlements().toProductList().any { it == Product.DuckAiPlus }
104+
}
105+
79106
interface Listener {
80107
fun onUserClickedCategory(category: SubscriptionFeedbackCategory)
81108
}

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)