Skip to content

Commit ac377f5

Browse files
Add nav parameter to autocomplete (#1247)
1 parent 0249a74 commit ac377f5

File tree

10 files changed

+75
-22
lines changed

10 files changed

+75
-22
lines changed

app/src/androidTest/java/com/duckduckgo/app/autocomplete/api/AutoCompleteApiTest.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,10 @@ class AutoCompleteApiTest {
105105
whenever(mockAutoCompleteService.autoComplete("title")).thenReturn(
106106
Observable.just(
107107
listOf(
108-
AutoCompleteServiceRawResult("example.com"),
109-
AutoCompleteServiceRawResult("foo.com"),
110-
AutoCompleteServiceRawResult("bar.com"),
111-
AutoCompleteServiceRawResult("baz.com")
108+
AutoCompleteServiceRawResult("example.com", false),
109+
AutoCompleteServiceRawResult("foo.com", true),
110+
AutoCompleteServiceRawResult("bar.com", true),
111+
AutoCompleteServiceRawResult("baz.com", true)
112112
)
113113
)
114114
)
@@ -143,10 +143,10 @@ class AutoCompleteApiTest {
143143
whenever(mockAutoCompleteService.autoComplete("title")).thenReturn(
144144
Observable.just(
145145
listOf(
146-
AutoCompleteServiceRawResult("example.com"),
147-
AutoCompleteServiceRawResult("foo.com"),
148-
AutoCompleteServiceRawResult("bar.com"),
149-
AutoCompleteServiceRawResult("baz.com")
146+
AutoCompleteServiceRawResult("example.com", false),
147+
AutoCompleteServiceRawResult("foo.com", true),
148+
AutoCompleteServiceRawResult("bar.com", true),
149+
AutoCompleteServiceRawResult("baz.com", true)
150150
)
151151
)
152152
)
@@ -167,7 +167,7 @@ class AutoCompleteApiTest {
167167
listOf(
168168
AutoComplete.AutoCompleteSuggestion.AutoCompleteBookmarkSuggestion(phrase = "foo.com?key=value", "title foo", "https://foo.com?key=value"),
169169
AutoComplete.AutoCompleteSuggestion.AutoCompleteBookmarkSuggestion(phrase = "foo.com", "title foo", "https://foo.com"),
170-
AutoComplete.AutoCompleteSuggestion.AutoCompleteSearchSuggestion(phrase = "example.com", true),
170+
AutoComplete.AutoCompleteSuggestion.AutoCompleteSearchSuggestion(phrase = "example.com", false),
171171
AutoComplete.AutoCompleteSuggestion.AutoCompleteSearchSuggestion(phrase = "bar.com", true),
172172
AutoComplete.AutoCompleteSuggestion.AutoCompleteSearchSuggestion(phrase = "baz.com", true)
173173
),

app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ class BrowserTabViewModelTest {
329329

330330
val siteFactory = SiteFactory(mockPrivacyPractices, mockEntityLookup)
331331

332-
whenever(mockOmnibarConverter.convertQueryToUrl(any(), any())).thenReturn("duckduckgo.com")
332+
whenever(mockOmnibarConverter.convertQueryToUrl(any(), any(), any())).thenReturn("duckduckgo.com")
333333
whenever(mockVariantManager.getVariant()).thenReturn(DEFAULT_VARIANT)
334334
whenever(mockTabRepository.liveSelectedTab).thenReturn(selectedTabLiveData)
335335
whenever(mockNavigationAwareLoginDetector.loginEventLiveData).thenReturn(loginEventLiveData)

app/src/androidTest/java/com/duckduckgo/app/browser/BrowserViewModelTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ class BrowserViewModelTest {
110110

111111
runBlocking<Unit> {
112112
whenever(mockTabRepository.add()).thenReturn(TAB_ID)
113-
whenever(mockOmnibarEntryConverter.convertQueryToUrl(any(), any())).then { it.arguments.first() }
113+
whenever(mockOmnibarEntryConverter.convertQueryToUrl(any(), any(), any())).then { it.arguments.first() }
114114
}
115115
}
116116

app/src/androidTest/java/com/duckduckgo/app/browser/QueryUrlConverterTest.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.duckduckgo.app.browser
1818

1919
import android.net.Uri
20+
import com.duckduckgo.app.browser.omnibar.QueryOrigin
2021
import com.duckduckgo.app.browser.omnibar.QueryUrlConverter
2122
import com.duckduckgo.app.referral.AppReferrerDataStore
2223
import com.duckduckgo.app.statistics.VariantManager
@@ -80,6 +81,41 @@ class QueryUrlConverterTest {
8081
assertEquals(expected, result)
8182
}
8283

84+
@Test
85+
fun whenQueryOriginIsFromUserAndIsQueryThenSearchQueryBuilt() {
86+
val input = "foo"
87+
val result = testee.convertQueryToUrl(input, queryOrigin = QueryOrigin.FromUser)
88+
assertDuckDuckGoSearchQuery("foo", result)
89+
}
90+
91+
@Test
92+
fun whenQueryOriginIsFromUserAndIsUrlThenUrlReturned() {
93+
val input = "http://example.com"
94+
val result = testee.convertQueryToUrl(input, queryOrigin = QueryOrigin.FromUser)
95+
assertEquals(input, result)
96+
}
97+
98+
@Test
99+
fun whenQueryOriginIsFromAutocompleteAndIsNavIsFalseThenSearchQueryBuilt() {
100+
val input = "example.com"
101+
val result = testee.convertQueryToUrl(input, queryOrigin = QueryOrigin.FromAutocomplete(isNav = false))
102+
assertDuckDuckGoSearchQuery("example.com", result)
103+
}
104+
105+
@Test
106+
fun whenQueryOriginIsFromAutocompleteAndIsNavIsTrueThenUrlReturned() {
107+
val input = "http://example.com"
108+
val result = testee.convertQueryToUrl(input, queryOrigin = QueryOrigin.FromAutocomplete(isNav = true))
109+
assertEquals(input, result)
110+
}
111+
112+
@Test
113+
fun whenQueryOriginIsFromAutocompleteAndIsNavIsNullAndIsNotUrlThenSearchQueryBuilt() {
114+
val input = "foo"
115+
val result = testee.convertQueryToUrl(input, queryOrigin = QueryOrigin.FromAutocomplete(isNav = null))
116+
assertDuckDuckGoSearchQuery("foo", result)
117+
}
118+
83119
private fun assertDuckDuckGoSearchQuery(query: String, url: String) {
84120
val uri = Uri.parse(url)
85121
assertEquals("duckduckgo.com", uri.host)

app/src/main/java/com/duckduckgo/app/autocomplete/api/AutoComplete.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import com.duckduckgo.app.global.UriString
2626
import com.duckduckgo.app.global.baseHost
2727
import com.duckduckgo.app.global.toStringDropScheme
2828
import io.reactivex.Observable
29-
import io.reactivex.functions.BiFunction
3029
import javax.inject.Inject
3130

3231
interface AutoComplete {
@@ -59,7 +58,7 @@ class AutoCompleteApi @Inject constructor(
5958

6059
return getAutoCompleteBookmarkResults(query).zipWith(
6160
getAutoCompleteSearchResults(query),
62-
BiFunction { bookmarksResults, searchResults ->
61+
{ bookmarksResults, searchResults ->
6362
AutoCompleteResult(
6463
query = query,
6564
suggestions = (bookmarksResults + searchResults).distinctBy { it.phrase }
@@ -72,7 +71,7 @@ class AutoCompleteApi @Inject constructor(
7271
autoCompleteService.autoComplete(query)
7372
.flatMapIterable { it }
7473
.map {
75-
AutoCompleteSearchSuggestion(phrase = it.phrase, isUrl = UriString.isWebUrl(it.phrase))
74+
AutoCompleteSearchSuggestion(phrase = it.phrase, isUrl = (it.isNav ?: UriString.isWebUrl(it.phrase)))
7675
}
7776
.toList()
7877
.onErrorReturn { emptyList() }

app/src/main/java/com/duckduckgo/app/autocomplete/api/AutoCompleteService.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ interface AutoCompleteService {
2727
@GET("${AppUrl.Url.API}/ac/")
2828
fun autoComplete(
2929
@Query("q") query: String,
30-
@Query("kl") languageCode: String = Locale.getDefault().language
30+
@Query("kl") languageCode: String = Locale.getDefault().language,
31+
@Query("is_nav") nav: String = "1"
3132
): Observable<List<AutoCompleteServiceRawResult>>
3233
}
3334

34-
data class AutoCompleteServiceRawResult(val phrase: String)
35+
data class AutoCompleteServiceRawResult(val phrase: String, val isNav: Boolean?)

app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import androidx.fragment.app.transaction
5858
import androidx.lifecycle.*
5959
import androidx.recyclerview.widget.LinearLayoutManager
6060
import com.duckduckgo.app.autocomplete.api.AutoComplete.AutoCompleteSuggestion
61+
import com.duckduckgo.app.autocomplete.api.AutoComplete.AutoCompleteSuggestion.*
6162
import com.duckduckgo.app.bookmarks.ui.EditBookmarkDialogFragment
6263
import com.duckduckgo.app.brokensite.BrokenSiteActivity
6364
import com.duckduckgo.app.brokensite.BrokenSiteData
@@ -79,6 +80,7 @@ import com.duckduckgo.app.browser.model.BasicAuthenticationRequest
7980
import com.duckduckgo.app.browser.model.LongPressTarget
8081
import com.duckduckgo.app.browser.omnibar.KeyboardAwareEditText
8182
import com.duckduckgo.app.browser.omnibar.OmnibarScrolling
83+
import com.duckduckgo.app.browser.omnibar.QueryOrigin.*
8284
import com.duckduckgo.app.browser.session.WebViewSessionStorage
8385
import com.duckduckgo.app.browser.shortcut.ShortcutBuilder
8486
import com.duckduckgo.app.browser.tabpreview.WebViewPreviewGenerator
@@ -968,7 +970,11 @@ class BrowserTabFragment :
968970
GlobalScope.launch {
969971
viewModel.fireAutocompletePixel(suggestion)
970972
withContext(Dispatchers.Main) {
971-
viewModel.onUserSubmittedQuery(suggestion.phrase)
973+
val origin = when (suggestion) {
974+
is AutoCompleteBookmarkSuggestion -> FromAutocomplete(isNav = true)
975+
is AutoCompleteSearchSuggestion -> FromAutocomplete(isNav = suggestion.isUrl)
976+
}
977+
viewModel.onUserSubmittedQuery(suggestion.phrase, origin)
972978
}
973979
}
974980
}

app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import com.duckduckgo.app.browser.model.BasicAuthenticationCredentials
6262
import com.duckduckgo.app.browser.model.BasicAuthenticationRequest
6363
import com.duckduckgo.app.browser.model.LongPressTarget
6464
import com.duckduckgo.app.browser.omnibar.OmnibarEntryConverter
65+
import com.duckduckgo.app.browser.omnibar.QueryOrigin
6566
import com.duckduckgo.app.browser.omnibar.QueryUrlConverter
6667
import com.duckduckgo.app.browser.session.WebViewSessionStorage
6768
import com.duckduckgo.app.browser.ui.HttpAuthenticationDialogFragment.HttpAuthenticationListener
@@ -531,7 +532,7 @@ class BrowserTabViewModel(
531532
pixel.fire(pixelName, params)
532533
}
533534

534-
fun onUserSubmittedQuery(query: String) {
535+
fun onUserSubmittedQuery(query: String, queryOrigin: QueryOrigin = QueryOrigin.FromUser) {
535536
navigationAwareLoginDetector.onEvent(NavigationEvent.UserAction.NewQuerySubmitted)
536537

537538
if (query.isBlank()) {
@@ -551,7 +552,7 @@ class BrowserTabViewModel(
551552
}
552553

553554
val verticalParameter = extractVerticalParameter(url)
554-
val urlToNavigate = queryUrlConverter.convertQueryToUrl(trimmedInput, verticalParameter)
555+
val urlToNavigate = queryUrlConverter.convertQueryToUrl(trimmedInput, verticalParameter, queryOrigin)
555556

556557
val type = specialUrlDetector.determineType(trimmedInput)
557558
if (type is IntentType) {

app/src/main/java/com/duckduckgo/app/browser/omnibar/OmnibarEntryConverter.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,10 @@ package com.duckduckgo.app.browser.omnibar
1818

1919
interface OmnibarEntryConverter {
2020

21-
fun convertQueryToUrl(searchQuery: String, vertical: String? = null): String
21+
fun convertQueryToUrl(searchQuery: String, vertical: String? = null, queryOrigin: QueryOrigin = QueryOrigin.FromUser): String
22+
}
23+
24+
sealed class QueryOrigin {
25+
object FromUser : QueryOrigin()
26+
data class FromAutocomplete(val isNav: Boolean?) : QueryOrigin()
2227
}

app/src/main/java/com/duckduckgo/app/browser/omnibar/QueryUrlConverter.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,13 @@ import javax.inject.Inject
2828

2929
class QueryUrlConverter @Inject constructor(private val requestRewriter: RequestRewriter) : OmnibarEntryConverter {
3030

31-
override fun convertQueryToUrl(searchQuery: String, vertical: String?): String {
32-
if (UriString.isWebUrl(searchQuery)) {
31+
override fun convertQueryToUrl(searchQuery: String, vertical: String?, queryOrigin: QueryOrigin): String {
32+
val isUrl = when (queryOrigin) {
33+
is QueryOrigin.FromAutocomplete -> queryOrigin.isNav
34+
is QueryOrigin.FromUser -> UriString.isWebUrl(searchQuery)
35+
}
36+
37+
if (isUrl == true) {
3338
return convertUri(searchQuery)
3439
}
3540

0 commit comments

Comments
 (0)