package fr.neamar.kiss.dataprovider; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.webkit.URLUtil; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; import fr.neamar.kiss.loader.LoadSearchPojos; import fr.neamar.kiss.pojo.Pojo; import fr.neamar.kiss.pojo.SearchPojo; public class SearchProvider extends Provider<SearchPojo> { private SharedPreferences prefs; public static final String URL_REGEX = "^(?:[a-z]+://)?(?:[a-z0-9-]|[^\\x00-\\x7F])+(?:[.](?:[a-z0-9-]|[^\\x00-\\x7F])+)+.*$"; private static final Map<String, String> searchProviderUrls = new LinkedHashMap<>(); private static final Pattern p = Pattern.compile(URL_REGEX); static { searchProviderUrls.put("Bing", "https://www.bing.com/search?q="); searchProviderUrls.put("DuckDuckGo", "https://duckduckgo.com/?q="); searchProviderUrls.put("Google", "https://encrypted.google.com/search?q="); searchProviderUrls.put("Qwant", "https://www.qwant.com/?q="); searchProviderUrls.put("StartPage", "https://startpage.com/do/search?language=cat=web&query="); searchProviderUrls.put("Wikipedia", "https://en.wikipedia.org/wiki/"); searchProviderUrls.put("Yahoo", "https://search.yahoo.com/search?p="); } @Override public void reload() { this.initialize(new LoadSearchPojos(this)); } public ArrayList<Pojo> getResults(String query) { ArrayList<Pojo> pojos = new ArrayList<>(); Set<String> selectedProviders = new TreeSet<>(); selectedProviders.addAll(PreferenceManager.getDefaultSharedPreferences(this).getStringSet("search-providers", new HashSet<>(Arrays.asList("Google")))); for (String searchProvider : selectedProviders) { SearchPojo pojo = new SearchPojo(); pojo.query = query; pojo.relevance = 10; pojo.url = searchProviderUrls.get(searchProvider); pojo.name = searchProvider; pojos.add(pojo); } Matcher m = p.matcher(query); if (m.find()) { String guessedUrl = URLUtil.guessUrl(query); if (URLUtil.isValidUrl(guessedUrl)) { SearchPojo pojo = new SearchPojo(); pojo.query = ""; pojo.relevance = 50; pojo.name = guessedUrl; pojo.url = guessedUrl; pojo.direct = true; pojos.add(pojo); } } return pojos; } public static String[] getSearchProviders() { return searchProviderUrls.keySet().toArray(new String[searchProviderUrls.size()]); } }