Skip to content

Commit d412f95

Browse files
committed
ammend PR comments
1 parent 9cc4104 commit d412f95

File tree

4 files changed

+37
-34
lines changed

4 files changed

+37
-34
lines changed

duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/subscription/DuckAiPlusSettingsViewModel.kt

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import androidx.lifecycle.LifecycleOwner
2222
import androidx.lifecycle.ViewModel
2323
import androidx.lifecycle.viewModelScope
2424
import com.duckduckgo.anvil.annotations.ContributesViewModel
25+
import com.duckduckgo.common.utils.DispatcherProvider
2526
import com.duckduckgo.di.scopes.ViewScope
2627
import com.duckduckgo.duckchat.impl.feature.DuckChatFeature
2728
import com.duckduckgo.duckchat.impl.subscription.DuckAiPlusSettingsViewModel.ViewState.SettingState
@@ -39,17 +40,16 @@ import kotlinx.coroutines.flow.asStateFlow
3940
import kotlinx.coroutines.flow.launchIn
4041
import kotlinx.coroutines.flow.map
4142
import kotlinx.coroutines.flow.onEach
42-
import kotlinx.coroutines.flow.onStart
4343
import kotlinx.coroutines.flow.receiveAsFlow
4444
import kotlinx.coroutines.flow.update
4545
import kotlinx.coroutines.launch
46-
import logcat.logcat
4746

4847
@SuppressLint("NoLifecycleObserver") // we don't observe app lifecycle
4948
@ContributesViewModel(ViewScope::class)
5049
class DuckAiPlusSettingsViewModel @Inject constructor(
5150
private val subscriptions: Subscriptions,
5251
private val duckChatFeature: DuckChatFeature,
52+
private val dispatcherProvider: DispatcherProvider,
5353
) : ViewModel(), DefaultLifecycleObserver {
5454

5555
sealed class Command {
@@ -69,11 +69,7 @@ class DuckAiPlusSettingsViewModel @Inject constructor(
6969
}
7070

7171
private val _viewState = MutableStateFlow(ViewState())
72-
val viewState = _viewState.asStateFlow().onStart {
73-
if (duckChatFeature.duckAiPlus().isEnabled().not()) {
74-
_viewState.value = ViewState(settingState = Hidden)
75-
}
76-
}
72+
val viewState = _viewState.asStateFlow()
7773

7874
fun onDuckAiClicked() {
7975
sendCommand(Command.OpenDuckAiPlusSettings)
@@ -82,11 +78,13 @@ class DuckAiPlusSettingsViewModel @Inject constructor(
8278
override fun onCreate(owner: LifecycleOwner) {
8379
super.onCreate(owner)
8480

85-
viewModelScope.launch {
86-
if (duckChatFeature.duckAiPlus().isEnabled().not()) return@launch
81+
viewModelScope.launch(dispatcherProvider.io()) {
82+
if (duckChatFeature.duckAiPlus().isEnabled().not()) {
83+
_viewState.update { it.copy(settingState = Hidden) }
84+
return@launch
85+
}
8786

8887
subscriptions.getEntitlementStatus().map { entitlements ->
89-
logcat { "CRIS: getEntitlementStatus $entitlements" }
9088
entitlements.any { product ->
9189
product == DuckAiPlus
9290
}
@@ -129,11 +127,10 @@ class DuckAiPlusSettingsViewModel @Inject constructor(
129127
}
130128

131129
private suspend fun isDuckAiProAvailable(): Boolean {
132-
return subscriptions.getAvailableProducts().also {
133-
logcat { "CRIS: available products: $it" }
134-
}.any { availableProduct ->
135-
availableProduct == DuckAiPlus
136-
}
130+
return subscriptions.getAvailableProducts()
131+
.any { availableProduct ->
132+
availableProduct == DuckAiPlus
133+
}
137134
}
138135

139136
private fun sendCommand(newCommand: Command) {

duckchat/duckchat-impl/src/test/kotlin/com/duckduckgo/duckchat/impl/subscription/DuckAiPlusSettingsViewModelTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class DuckAiPlusSettingsViewModelTest {
3333
DuckAiPlusSettingsViewModel(
3434
subscriptions = subscriptions,
3535
duckChatFeature = duckChatFeature,
36+
dispatcherProvider = coroutineTestRule.testDispatcherProvider,
3637
)
3738
}
3839

subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/settings/views/ProSettingViewModel.kt

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import androidx.lifecycle.LifecycleOwner
2222
import androidx.lifecycle.ViewModel
2323
import androidx.lifecycle.viewModelScope
2424
import com.duckduckgo.anvil.annotations.ContributesViewModel
25+
import com.duckduckgo.common.utils.DispatcherProvider
2526
import com.duckduckgo.di.scopes.ViewScope
2627
import com.duckduckgo.subscriptions.api.Product.DuckAiPlus
2728
import com.duckduckgo.subscriptions.api.SubscriptionStatus
@@ -48,13 +49,15 @@ import kotlinx.coroutines.flow.launchIn
4849
import kotlinx.coroutines.flow.onEach
4950
import kotlinx.coroutines.flow.receiveAsFlow
5051
import kotlinx.coroutines.launch
52+
import kotlinx.coroutines.withContext
5153

5254
@SuppressLint("NoLifecycleObserver") // we don't observe app lifecycle
5355
@ContributesViewModel(ViewScope::class)
5456
class ProSettingViewModel @Inject constructor(
5557
private val subscriptionsManager: SubscriptionsManager,
5658
private val pixelSender: SubscriptionPixelSender,
5759
private val privacyProFeature: PrivacyProFeature,
60+
private val dispatcherProvider: DispatcherProvider,
5861
) : ViewModel(), DefaultLifecycleObserver {
5962

6063
sealed class Command {
@@ -96,26 +99,28 @@ class ProSettingViewModel @Inject constructor(
9699
subscriptionsManager.subscriptionStatus
97100
.distinctUntilChanged()
98101
.onEach { subscriptionStatus ->
99-
val offer = subscriptionsManager.getSubscriptionOffer().firstOrNull()
100-
val region = when (offer?.planId) {
101-
MONTHLY_PLAN_ROW, YEARLY_PLAN_ROW -> SubscriptionRegion.ROW
102-
MONTHLY_PLAN_US, YEARLY_PLAN_US -> SubscriptionRegion.US
103-
else -> null
104-
}
102+
withContext(dispatcherProvider.io()) {
103+
val offer = subscriptionsManager.getSubscriptionOffer().firstOrNull()
104+
val region = when (offer?.planId) {
105+
MONTHLY_PLAN_ROW, YEARLY_PLAN_ROW -> SubscriptionRegion.ROW
106+
MONTHLY_PLAN_US, YEARLY_PLAN_US -> SubscriptionRegion.US
107+
else -> null
108+
}
105109

106-
val duckAiEnabled = privacyProFeature.duckAiPlus().isEnabled()
107-
val duckAiAvailable = duckAiEnabled && offer?.features?.any { feature ->
108-
feature == DuckAiPlus.value
109-
} ?: false
110+
val duckAiEnabled = privacyProFeature.duckAiPlus().isEnabled()
111+
val duckAiAvailable = duckAiEnabled && offer?.features?.any { feature ->
112+
feature == DuckAiPlus.value
113+
} ?: false
110114

111-
_viewState.emit(
112-
viewState.value.copy(
113-
status = subscriptionStatus,
114-
region = region,
115-
duckAiPlusAvailable = duckAiAvailable,
116-
freeTrialEligible = subscriptionsManager.isFreeTrialEligible(),
117-
),
118-
)
115+
_viewState.emit(
116+
viewState.value.copy(
117+
status = subscriptionStatus,
118+
region = region,
119+
duckAiPlusAvailable = duckAiAvailable,
120+
freeTrialEligible = subscriptionsManager.isFreeTrialEligible(),
121+
),
122+
)
123+
}
119124
}.launchIn(viewModelScope)
120125
}
121126

subscriptions/subscriptions-impl/src/test/java/com/duckduckgo/subscriptions/impl/settings/views/ProSettingViewModelTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class ProSettingViewModelTest {
3737

3838
@Before
3939
fun before() {
40-
viewModel = ProSettingViewModel(subscriptionsManager, pixelSender, privacyProFeature)
40+
viewModel = ProSettingViewModel(subscriptionsManager, pixelSender, privacyProFeature, coroutineTestRule.testDispatcherProvider)
4141
}
4242

4343
@Test

0 commit comments

Comments
 (0)