Skip to content

Commit 39eb56d

Browse files
authored
Save and Exit: Add FF and update links (#6852)
Task/Issue URL: https://app.asana.com/1/137249556945/project/1202552961248957/task/1211395150174608 ### Description This PR adds a FF and updates the private search and duck.ai settings links. ### Steps to test this PR QA-optional
1 parent 2a859bd commit 39eb56d

File tree

4 files changed

+259
-193
lines changed

4 files changed

+259
-193
lines changed

app/src/main/java/com/duckduckgo/app/privatesearch/PrivateSearchActivity.kt

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,27 +33,32 @@ import com.duckduckgo.common.ui.DuckDuckGoActivity
3333
import com.duckduckgo.common.ui.viewbinding.viewBinding
3434
import com.duckduckgo.di.scopes.ActivityScope
3535
import com.duckduckgo.navigation.api.GlobalActivityStarter
36+
import com.duckduckgo.settings.api.SettingsPageFeature
3637
import kotlinx.coroutines.flow.launchIn
3738
import kotlinx.coroutines.flow.onEach
3839
import javax.inject.Inject
3940

4041
@InjectWith(ActivityScope::class)
4142
@ContributeToActivityStarter(PrivateSearchScreenNoParams::class)
4243
class PrivateSearchActivity : DuckDuckGoActivity() {
43-
4444
@Inject
4545
lateinit var globalActivityStarter: GlobalActivityStarter
4646

47+
@Inject
48+
lateinit var settingsPageFeature: SettingsPageFeature
49+
4750
private val viewModel: PrivateSearchViewModel by bindViewModel()
4851
private val binding: ActivityPrivateSearchBinding by viewBinding()
4952

50-
private val autocompleteToggleListener = CompoundButton.OnCheckedChangeListener { _, isChecked ->
51-
viewModel.onAutocompleteSettingChanged(isChecked)
52-
}
53+
private val autocompleteToggleListener =
54+
CompoundButton.OnCheckedChangeListener { _, isChecked ->
55+
viewModel.onAutocompleteSettingChanged(isChecked)
56+
}
5357

54-
private val autocompleteRecentlyVisitedSitesToggleListener = CompoundButton.OnCheckedChangeListener { _, isChecked ->
55-
viewModel.onAutocompleteRecentlyVisitedSitesSettingChanged(isChecked)
56-
}
58+
private val autocompleteRecentlyVisitedSitesToggleListener =
59+
CompoundButton.OnCheckedChangeListener { _, isChecked ->
60+
viewModel.onAutocompleteRecentlyVisitedSitesSettingChanged(isChecked)
61+
}
5762

5863
override fun onCreate(savedInstanceState: Bundle?) {
5964
super.onCreate(savedInstanceState)
@@ -93,7 +98,8 @@ class PrivateSearchActivity : DuckDuckGoActivity() {
9398
}
9499
}.launchIn(lifecycleScope)
95100

96-
viewModel.commands()
101+
viewModel
102+
.commands()
97103
.flowWithLifecycle(lifecycle, Lifecycle.State.CREATED)
98104
.onEach { processCommand(it) }
99105
.launchIn(lifecycleScope)
@@ -106,16 +112,23 @@ class PrivateSearchActivity : DuckDuckGoActivity() {
106112
}
107113

108114
private fun launchCustomizeSearchWebPage() {
115+
val settingsUrl =
116+
if (settingsPageFeature.saveAndExitSerpSettings().isEnabled()) {
117+
DUCKDUCKGO_SETTINGS_WEB_LINK_WITH_RETURN_PARAM
118+
} else {
119+
DUCKDUCKGO_SETTINGS_WEB_LINK
120+
}
109121
globalActivityStarter.start(
110122
this,
111123
WebViewActivityWithParams(
112-
url = DUCKDUCKGO_SETTINGS_WEB_LINK,
124+
url = settingsUrl,
113125
getString(R.string.privateSearchMoreSearchSettingsTitle),
114126
),
115127
)
116128
}
117129

118130
companion object {
119131
private const val DUCKDUCKGO_SETTINGS_WEB_LINK = "https://duckduckgo.com/settings"
132+
private const val DUCKDUCKGO_SETTINGS_WEB_LINK_WITH_RETURN_PARAM = "https://duckduckgo.com/settings?return=privateSearch"
120133
}
121134
}

duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/ui/settings/DuckChatSettingsViewModel.kt

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.duckduckgo.duckchat.impl.pixel.DuckChatPixelName
2727
import com.duckduckgo.duckchat.impl.ui.settings.DuckChatSettingsViewModel.Command.OpenLink
2828
import com.duckduckgo.duckchat.impl.ui.settings.DuckChatSettingsViewModel.Command.OpenLinkInNewTab
2929
import com.duckduckgo.duckchat.impl.ui.settings.DuckChatSettingsViewModel.Command.OpenShortcutSettings
30+
import com.duckduckgo.settings.api.SettingsPageFeature
3031
import com.duckduckgo.subscriptions.api.SubscriptionRebrandingFeatureToggle
3132
import kotlinx.coroutines.channels.BufferOverflow.DROP_OLDEST
3233
import kotlinx.coroutines.channels.Channel
@@ -43,8 +44,8 @@ class DuckChatSettingsViewModel @Inject constructor(
4344
private val pixel: Pixel,
4445
private val rebrandingAiFeaturesEnabled: SubscriptionRebrandingFeatureToggle,
4546
private val inputScreenDiscoveryFunnel: InputScreenDiscoveryFunnel,
47+
private val settingsPageFeature: SettingsPageFeature,
4648
) : ViewModel() {
47-
4849
private val commandChannel = Channel<Command>(capacity = 1, onBufferOverflow = DROP_OLDEST)
4950
val commands = commandChannel.receiveAsFlow()
5051

@@ -56,23 +57,31 @@ class DuckChatSettingsViewModel @Inject constructor(
5657
val isRebrandingAiFeaturesEnabled: Boolean = false,
5758
)
5859

59-
val viewState = combine(
60-
duckChat.observeEnableDuckChatUserSetting(),
61-
duckChat.observeInputScreenUserSettingEnabled(),
62-
) { isDuckChatUserEnabled, isInputScreenEnabled ->
63-
ViewState(
64-
isDuckChatUserEnabled = isDuckChatUserEnabled,
65-
isInputScreenEnabled = isInputScreenEnabled,
66-
shouldShowShortcuts = isDuckChatUserEnabled,
67-
shouldShowInputScreenToggle = isDuckChatUserEnabled && duckChat.isInputScreenFeatureAvailable(),
68-
isRebrandingAiFeaturesEnabled = rebrandingAiFeaturesEnabled.isAIFeaturesRebrandingEnabled(),
69-
)
70-
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), ViewState())
60+
val viewState =
61+
combine(
62+
duckChat.observeEnableDuckChatUserSetting(),
63+
duckChat.observeInputScreenUserSettingEnabled(),
64+
) { isDuckChatUserEnabled, isInputScreenEnabled ->
65+
ViewState(
66+
isDuckChatUserEnabled = isDuckChatUserEnabled,
67+
isInputScreenEnabled = isInputScreenEnabled,
68+
shouldShowShortcuts = isDuckChatUserEnabled,
69+
shouldShowInputScreenToggle = isDuckChatUserEnabled && duckChat.isInputScreenFeatureAvailable(),
70+
isRebrandingAiFeaturesEnabled = rebrandingAiFeaturesEnabled.isAIFeaturesRebrandingEnabled(),
71+
)
72+
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), ViewState())
7173

7274
sealed class Command {
73-
data class OpenLink(val link: String) : Command()
74-
data class OpenLinkInNewTab(val link: String) : Command()
75+
data class OpenLink(
76+
val link: String,
77+
) : Command()
78+
79+
data class OpenLinkInNewTab(
80+
val link: String,
81+
) : Command()
82+
7583
data object OpenShortcutSettings : Command()
84+
7685
data object LaunchFeedback : Command()
7786
}
7887

@@ -117,7 +126,13 @@ class DuckChatSettingsViewModel @Inject constructor(
117126

118127
fun duckChatSearchAISettingsClicked() {
119128
viewModelScope.launch {
120-
commandChannel.send(OpenLinkInNewTab(DUCK_CHAT_SEARCH_AI_SETTINGS_LINK))
129+
val settingsLink =
130+
if (settingsPageFeature.saveAndExitSerpSettings().isEnabled()) {
131+
DUCK_CHAT_SEARCH_AI_SETTINGS_LINK_WITH_RETURN_PARAM
132+
} else {
133+
DUCK_CHAT_SEARCH_AI_SETTINGS_LINK
134+
}
135+
commandChannel.send(OpenLinkInNewTab(settingsLink))
121136
pixel.fire(DuckChatPixelName.DUCK_CHAT_SEARCH_ASSIST_SETTINGS_BUTTON_CLICKED)
122137
}
123138
}
@@ -153,5 +168,6 @@ class DuckChatSettingsViewModel @Inject constructor(
153168
companion object {
154169
const val DUCK_CHAT_LEARN_MORE_LINK = "https://duckduckgo.com/duckduckgo-help-pages/aichat/"
155170
const val DUCK_CHAT_SEARCH_AI_SETTINGS_LINK = "https://duckduckgo.com/settings?ko=-1#aifeatures"
171+
const val DUCK_CHAT_SEARCH_AI_SETTINGS_LINK_WITH_RETURN_PARAM = "https://duckduckgo.com/settings?ko=-1&return=aiFeatures#aifeatures"
156172
}
157173
}

0 commit comments

Comments
 (0)