diff --git a/app/src/common/shared/org/mozilla/vrbrowser/search/GeolocationLocalizationProvider.java b/app/src/common/shared/org/mozilla/vrbrowser/search/GeolocationLocalizationProvider.java index 2177dfe43..75d6cac1e 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/search/GeolocationLocalizationProvider.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/search/GeolocationLocalizationProvider.java @@ -23,12 +23,6 @@ public class GeolocationLocalizationProvider implements SearchLocalizationProvid mRegion = data.getCountryCode(); } - GeolocationLocalizationProvider(@NonNull String countryCode, @NonNull String region) { - mCountry = countryCode; - mLanguage = Locale.getDefault().getLanguage(); - mRegion = region; - } - @Nullable @Override public SearchLocalization determineRegion(@NonNull Continuation continuation) { diff --git a/app/src/common/shared/org/mozilla/vrbrowser/search/SearchEngineWrapper.java b/app/src/common/shared/org/mozilla/vrbrowser/search/SearchEngineWrapper.java index 45b14ddb4..7e54447a5 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/search/SearchEngineWrapper.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/search/SearchEngineWrapper.java @@ -12,21 +12,17 @@ import androidx.annotation.NonNull; import org.mozilla.vrbrowser.R; -import org.mozilla.vrbrowser.VRBrowserApplication; import org.mozilla.vrbrowser.browser.SettingsStore; -import org.mozilla.vrbrowser.browser.engine.EngineProvider; import org.mozilla.vrbrowser.geolocation.GeolocationData; -import org.mozilla.vrbrowser.search.suggestions.SuggestionsClient; +import org.mozilla.vrbrowser.search.suggestions.SearchSuggestionsCLientKt; import org.mozilla.vrbrowser.utils.SystemUtils; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Executor; import kotlinx.coroutines.Dispatchers; import mozilla.components.browser.search.SearchEngine; @@ -64,22 +60,14 @@ SearchEngineWrapper get(final @NonNull Context aContext) { return mSearchEngineWrapperInstance; } - public interface SuggestionsDelegate { - void OnSuggestions(List aSuggestionsList); - } - private Context mContext; private SearchEngine mSearchEngine; - private SearchLocalizationProvider mLocalizationProvider; - private SearchEngineManager mSearchEngineManager; private SearchSuggestionClient mSuggestionsClient; private SharedPreferences mPrefs; - private Executor mUIThreadExecutor; private SearchEngineWrapper(@NonNull Context aContext) { mContext = aContext; mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext); - mUIThreadExecutor = ((VRBrowserApplication)aContext.getApplicationContext()).getExecutors().mainThread(); setupSearchEngine(aContext, EMPTY); } @@ -111,21 +99,9 @@ public String getSearchURL(String aQuery) { return mSearchEngine.buildSearchUrl(aQuery); } - private String getSuggestionURL(String aQuery) { - return mSearchEngine.buildSuggestionsURL(aQuery); - } - public CompletableFuture> getSuggestions(String aQuery) { - CompletableFuture> future = new CompletableFuture<>(); - // TODO: Use mSuggestionsClient.getSuggestions when fixed in browser-search. - String query = getSuggestionURL(aQuery); - mUIThreadExecutor.execute(() -> - SuggestionsClient.getSuggestions( - EngineProvider.INSTANCE.getDefaultGeckoWebExecutor(mContext), - mSearchEngine, - query).thenAcceptAsync(future::complete)); - - return future; + String query = mSearchEngine.buildSuggestionsURL(aQuery); + return SearchSuggestionsCLientKt.getSuggestionsAsync(mSuggestionsClient, query != null ? query : ""); } public String getResourceURL() { @@ -157,6 +133,7 @@ private void setupSearchEngine(@NonNull Context aContext, String userPref) { List engineFilterList = new ArrayList<>(); GeolocationData data = GeolocationData.parse(SettingsStore.getInstance(aContext).getGeolocationData()); + SearchLocalizationProvider mLocalizationProvider; if (data == null) { Log.d(LOGTAG, "Using Locale based search localization provider"); // If we don't have geolocation data we default to the Locale search localization provider @@ -181,7 +158,7 @@ private void setupSearchEngine(@NonNull Context aContext, String userPref) { engineFilterList, Collections.emptyList()); - mSearchEngineManager = new SearchEngineManager(Arrays.asList(engineProvider), Dispatchers.getDefault()); + SearchEngineManager mSearchEngineManager = new SearchEngineManager(Collections.singletonList(engineProvider), Dispatchers.getDefault()); // If we don't get any result we use the default configuration. if (mSearchEngineManager.getSearchEngines(aContext).size() == 0) { diff --git a/app/src/common/shared/org/mozilla/vrbrowser/search/suggestions/SearchSuggestionsCLient.kt b/app/src/common/shared/org/mozilla/vrbrowser/search/suggestions/SearchSuggestionsCLient.kt new file mode 100644 index 000000000..aba557de6 --- /dev/null +++ b/app/src/common/shared/org/mozilla/vrbrowser/search/suggestions/SearchSuggestionsCLient.kt @@ -0,0 +1,11 @@ +package org.mozilla.vrbrowser.search.suggestions + +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.future.future +import mozilla.components.browser.search.suggestions.SearchSuggestionClient +import java.util.concurrent.CompletableFuture + +fun getSuggestionsAsync(client: SearchSuggestionClient, query: String): CompletableFuture?> = + GlobalScope.future { + client.getSuggestions(query) + } \ No newline at end of file diff --git a/app/src/common/shared/org/mozilla/vrbrowser/search/suggestions/SuggestionParser.java b/app/src/common/shared/org/mozilla/vrbrowser/search/suggestions/SuggestionParser.java deleted file mode 100644 index 031bc371a..000000000 --- a/app/src/common/shared/org/mozilla/vrbrowser/search/suggestions/SuggestionParser.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.mozilla.vrbrowser.search.suggestions; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Function; - -import mozilla.components.browser.search.SearchEngine; - -public class SuggestionParser { - - private static final String AZERDICT = "Azerdict"; - private static final String DAUM = "다음지도"; - private static final String QWANT = "Qwant"; - - public static Function> selectResponseParser(SearchEngine mEngine) { - if (mEngine.getName().equals(AZERDICT)) { - return azerdictResponseParser; - - } else if (mEngine.getName().equals(DAUM)) { - return daumResponseParser; - - } else if (mEngine.getName().equals(QWANT)) { - return qwantResponseParser; - } - - return defaultResponseParser; - } - - private static Function> defaultResponseParser = buildJSONArrayParser(1); - private static Function> azerdictResponseParser = buildJSONObjectParser("suggestions"); - private static Function> daumResponseParser = buildJSONObjectParser("items"); - private static Function> qwantResponseParser = buildQwantParser(); - - private static Function> buildJSONArrayParser(int ressultsIndex) { - return input -> { - List list = new ArrayList<>(); - try { - JSONArray root = new JSONArray(input); - JSONArray array = root.getJSONArray(ressultsIndex); - if (array != null) { - int len = array.length(); - for (int i=0; i> buildJSONObjectParser(String resultsKey) { - return input -> { - List list = new ArrayList<>(); - try { - JSONObject root = new JSONObject(input); - JSONArray array = root.getJSONArray(resultsKey); - if (array != null) { - int len = array.length(); - for (int i=0; i> buildQwantParser() { - return input -> { - List list = new ArrayList<>(); - try { - JSONObject root = new JSONObject(input); - JSONObject data = root.getJSONObject("data"); - JSONArray items = data.getJSONArray("items"); - if (items != null) { - int len = items.length(); - for (int i=0; i> getSuggestions(@NonNull GeckoWebExecutor executor, SearchEngine mEngine, String aQuery) { - final CompletableFuture> future = new CompletableFuture<>(); - - new Handler(Looper.getMainLooper()).post(() -> { - WebRequest request = new WebRequest.Builder(aQuery) - .method("GET") - .build(); - - executor.fetch(request).then(webResponse -> { - String body; - if (webResponse != null) { - if (webResponse.body != null) { - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - int nRead; - byte[] data = new byte[1024]; - while ((nRead = webResponse.body.read(data, 0, data.length)) != -1) { - buffer.write(data, 0, nRead); - } - body = new String(buffer.toByteArray(), StandardCharsets.UTF_8); - - if (webResponse.statusCode == 200) { - future.complete(SuggestionParser.selectResponseParser(mEngine).apply(body)); - - } else { - // called when response HTTP status is not "200" - future.completeExceptionally(new Throwable(String.format("Network Error: %s", webResponse.statusCode))); - } - - } else { - // WebResponse body is null - future.completeExceptionally(new Throwable("Response body is null")); - } - - } else { - // WebResponse is null - future.completeExceptionally(new Throwable("Response is null")); - } - return null; - - }).exceptionally(throwable -> { - // Exception happened - future.completeExceptionally(new Throwable(String.format("Unknown network Error: %s", String.format("An exception happened during the request: %s", throwable.getMessage())))); - return null; - }); - }); - - return future; - } -} diff --git a/app/src/common/shared/org/mozilla/vrbrowser/search/suggestions/SuggestionsProvider.java b/app/src/common/shared/org/mozilla/vrbrowser/search/suggestions/SuggestionsProvider.java index 7adf9ea58..ed938d0b2 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/search/suggestions/SuggestionsProvider.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/search/suggestions/SuggestionsProvider.java @@ -17,30 +17,29 @@ import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; +import java.util.function.Supplier; public class SuggestionsProvider { private static final String LOGTAG = SuggestionsProvider.class.getSimpleName(); - public class DefaultSuggestionsComparator implements Comparator { + public static class DefaultSuggestionsComparator implements Comparator { - public int compare(Object obj1, Object obj2) { - SuggestionItem suggestion1 = (SuggestionItem)obj1; - SuggestionItem suggestion2 = (SuggestionItem)obj2; - if (suggestion1.type == Type.SUGGESTION && suggestion2.type == Type.SUGGESTION) { + public int compare(SuggestionItem obj1, SuggestionItem obj2) { + if (obj1.type == Type.SUGGESTION && obj2.type == Type.SUGGESTION) { return 0; - } else if (suggestion1.type == suggestion2.type) { - if (suggestion1.type == Type.HISTORY) { - if (suggestion1.score != suggestion2.score) { - return suggestion1.score - suggestion2.score; + } else if (obj1.type == obj2.type) { + if (obj1.type == Type.HISTORY) { + if (obj1.score != obj2.score) { + return obj1.score - obj2.score; } } - return suggestion1.url.compareTo(suggestion2.url); + return obj1.url.compareTo(obj2.url); } else { - return suggestion1.type.ordinal() - suggestion2.type.ordinal(); + return obj1.type.ordinal() - obj2.type.ordinal(); } } } @@ -48,7 +47,7 @@ public int compare(Object obj1, Object obj2) { private SearchEngineWrapper mSearchEngineWrapper; private String mText; private String mFilterText; - private Comparator mComparator; + private Comparator mComparator; private Executor mUIThreadExecutor; public SuggestionsProvider(Context context) { @@ -74,15 +73,15 @@ public void setFilterText(String text) { public void setText(String text) { mText = text; } - public void setComparator(Comparator comparator) { + public void setComparator(Comparator comparator) { mComparator = comparator; } private CompletableFuture> getBookmarkSuggestions(@NonNull List items) { - CompletableFuture future = new CompletableFuture(); + CompletableFuture> future = new CompletableFuture<>(); SessionStore.get().getBookmarkStore().searchBookmarks(mFilterText, 100).thenAcceptAsync((bookmarks) -> { bookmarks.stream() - .filter((b) -> !b.getUrl().startsWith("place:") && + .filter((b) -> b.getUrl() != null && !b.getUrl().startsWith("place:") && !b.getUrl().startsWith("about:reader")) .forEach(b -> items.add(SuggestionItem.create( b.getTitle(), @@ -107,7 +106,7 @@ private CompletableFuture> getBookmarkSuggestions(@NonNull } private CompletableFuture> getHistorySuggestions(@NonNull final List items) { - CompletableFuture future = new CompletableFuture(); + CompletableFuture> future = new CompletableFuture<>(); SessionStore.get().getHistoryStore().getSuggestions(mFilterText, 100).thenAcceptAsync((history) -> { history.forEach(h -> items.add(SuggestionItem.create( h.getTitle(), @@ -132,7 +131,7 @@ private CompletableFuture> getHistorySuggestions(@NonNull f } private CompletableFuture> getSearchEngineSuggestions(@NonNull final List items) { - CompletableFuture future = new CompletableFuture(); + CompletableFuture> future = new CompletableFuture<>(); // Completion from browser-domains if (!mText.equals(mFilterText)) { @@ -182,7 +181,7 @@ private CompletableFuture> getSearchEngineSuggestions(@NonN } public CompletableFuture> getSuggestions() { - return CompletableFuture.supplyAsync(() -> new ArrayList()) + return CompletableFuture.supplyAsync((Supplier>) ArrayList::new) .thenComposeAsync(this::getSearchEngineSuggestions) .thenComposeAsync(this::getBookmarkSuggestions) .thenComposeAsync(this::getHistorySuggestions); diff --git a/app/src/main/assets/searchplugins/google-b-1-m.xml b/app/src/main/assets/searchplugins/google-b-1-m.xml new file mode 100644 index 000000000..741475e05 --- /dev/null +++ b/app/src/main/assets/searchplugins/google-b-1-m.xml @@ -0,0 +1,17 @@ + + + +Google +UTF-8 +data:image/png;base64,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 + + + + + + + +https://www.google.com + diff --git a/app/src/main/assets/searchplugins/google-b-m.xml b/app/src/main/assets/searchplugins/google-b-m.xml new file mode 100644 index 000000000..a8fb41d7d --- /dev/null +++ b/app/src/main/assets/searchplugins/google-b-m.xml @@ -0,0 +1,17 @@ + + + +Google +UTF-8 +data:image/png;base64,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 + + + + + + + +https://www.google.com + diff --git a/app/src/main/res/values/non_L10n.xml b/app/src/main/res/values/non_L10n.xml index dbde13cbe..909f5b459 100644 --- a/app/src/main/res/values/non_L10n.xml +++ b/app/src/main/res/values/non_L10n.xml @@ -189,22 +189,6 @@ uúüûùūůų ìíiïîįī - - - q=%1$s&client=firefox-b-o - q=%1$s&client=firefox-b-1-o - https://www.google.com/search - https://www.google.com/search - - wd=%1$s&tn=monline_dg&ie=utf-8 - https://www.baidu.com/baidu - - searchbar=2186618&keyword=2186621&contextmenu=2186623&homepage=2186617&newtab=2186620&text=%1$s - https://yandex.ru/search - https://yandex.by/search - https://yandex.com.tr/search - https://yandex.kz/search - https://qsurvey.mozilla.com/s3/FxR