1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 package org.chromium.chrome.browser.search_engines;
7 import org.chromium.base.CalledByNative;
8 import org.chromium.base.ObserverList;
9 import org.chromium.base.ThreadUtils;
11 import java.util.ArrayList;
12 import java.util.List;
15 * Android wrapper of the TemplateUrlService which provides access from the Java
18 * Only usable from the UI thread as it's primary purpose is for supporting the Android
21 * See chrome/browser/search_engines/template_url_service.h for more details.
23 public class TemplateUrlService {
26 * This listener will be notified when template url service is done loading.
28 public interface LoadListener {
29 public abstract void onTemplateUrlServiceLoaded();
33 * Represents search engine with its index.
35 public static class TemplateUrl {
36 private final int mIndex;
37 private final String mShortName;
38 private final String mKeyword;
40 @CalledByNative("TemplateUrl")
41 public static TemplateUrl create(int id, String shortName, String keyword) {
42 return new TemplateUrl(id, shortName, keyword);
45 public TemplateUrl(int index, String shortName, String keyword) {
47 mShortName = shortName;
51 public int getIndex() {
55 public String getShortName() {
59 public String getKeyword() {
64 private static TemplateUrlService sService;
66 public static TemplateUrlService getInstance() {
67 ThreadUtils.assertOnUiThread();
68 if (sService == null) {
69 sService = new TemplateUrlService();
74 private final long mNativeTemplateUrlServiceAndroid;
75 private final ObserverList<LoadListener> mLoadListeners = new ObserverList<LoadListener>();
77 private TemplateUrlService() {
78 // Note that this technically leaks the native object, however, TemlateUrlService
79 // is a singleton that lives forever and there's no clean shutdown of Chrome on Android
80 mNativeTemplateUrlServiceAndroid = nativeInit();
83 public boolean isLoaded() {
84 ThreadUtils.assertOnUiThread();
85 return nativeIsLoaded(mNativeTemplateUrlServiceAndroid);
89 ThreadUtils.assertOnUiThread();
90 nativeLoad(mNativeTemplateUrlServiceAndroid);
94 * Get the collection of localized search engines.
96 public List<TemplateUrl> getLocalizedSearchEngines() {
97 ThreadUtils.assertOnUiThread();
98 int templateUrlCount = nativeGetTemplateUrlCount(mNativeTemplateUrlServiceAndroid);
99 List<TemplateUrl> templateUrls = new ArrayList<TemplateUrl>(templateUrlCount);
100 for (int i = 0; i < templateUrlCount; i++) {
101 TemplateUrl templateUrl = nativeGetPrepopulatedTemplateUrlAt(
102 mNativeTemplateUrlServiceAndroid, i);
103 if (templateUrl != null) {
104 templateUrls.add(templateUrl);
111 * Called from native when template URL service is done loading.
114 private void templateUrlServiceLoaded() {
115 ThreadUtils.assertOnUiThread();
116 for (LoadListener listener : mLoadListeners) {
117 listener.onTemplateUrlServiceLoaded();
122 * @return The default search engine index (e.g., 0, 1, 2,...).
124 public int getDefaultSearchEngineIndex() {
125 ThreadUtils.assertOnUiThread();
126 return nativeGetDefaultSearchProvider(mNativeTemplateUrlServiceAndroid);
130 * @return {@link TemplateUrlService.TemplateUrl} for the default search engine.
132 public TemplateUrl getDefaultSearchEngineTemplateUrl() {
133 if (!isLoaded()) return null;
135 int defaultSearchEngineIndex = getDefaultSearchEngineIndex();
136 if (defaultSearchEngineIndex == -1) return null;
138 assert defaultSearchEngineIndex >= 0;
139 assert defaultSearchEngineIndex < nativeGetTemplateUrlCount(
140 mNativeTemplateUrlServiceAndroid);
142 return nativeGetPrepopulatedTemplateUrlAt(
143 mNativeTemplateUrlServiceAndroid, defaultSearchEngineIndex);
146 public void setSearchEngine(int selectedIndex) {
147 ThreadUtils.assertOnUiThread();
148 nativeSetUserSelectedDefaultSearchProvider(mNativeTemplateUrlServiceAndroid, selectedIndex);
151 public boolean isSearchProviderManaged() {
152 return nativeIsSearchProviderManaged(mNativeTemplateUrlServiceAndroid);
156 * @return Whether or not the default search engine has search by image support.
158 public boolean isSearchByImageAvailable() {
159 ThreadUtils.assertOnUiThread();
160 return nativeIsSearchByImageAvailable(mNativeTemplateUrlServiceAndroid);
164 * @return Whether the default configured search engine is for a Google property.
166 public boolean isDefaultSearchEngineGoogle() {
167 return nativeIsDefaultSearchEngineGoogle(mNativeTemplateUrlServiceAndroid);
171 * Registers a listener for the callback that indicates that the
172 * TemplateURLService has loaded.
174 public void registerLoadListener(LoadListener listener) {
175 ThreadUtils.assertOnUiThread();
176 boolean added = mLoadListeners.addObserver(listener);
181 * Unregisters a listener for the callback that indicates that the
182 * TemplateURLService has loaded.
184 public void unregisterLoadListener(LoadListener listener) {
185 ThreadUtils.assertOnUiThread();
186 boolean removed = mLoadListeners.removeObserver(listener);
191 * Finds the default search engine for the default provider and returns the url query
192 * {@link String} for {@code query}.
193 * @param query The {@link String} that represents the text query the search url should
195 * @return A {@link String} that contains the url of the default search engine with
196 * {@code query} inserted as the search parameter.
198 public String getUrlForSearchQuery(String query) {
199 return nativeGetUrlForSearchQuery(mNativeTemplateUrlServiceAndroid, query);
203 * Finds the default search engine for the default provider and returns the url query
204 * {@link String} for {@code query} with voice input source param set.
205 * @param query The {@link String} that represents the text query the search url should
207 * @return A {@link String} that contains the url of the default search engine with
208 * {@code query} inserted as the search parameter and voice input source param set.
210 public String getUrlForVoiceSearchQuery(String query) {
211 return nativeGetUrlForVoiceSearchQuery(mNativeTemplateUrlServiceAndroid, query);
215 * Replaces the search terms from {@code query} in {@code url}.
216 * @param query The {@link String} that represents the text query that should replace the
217 * existing query in {@code url}.
218 * @param url The {@link String} that contains the search url with another search query that
219 * will be replaced with {@code query}.
220 * @return A new version of {@code url} with the search term replaced with {@code query}.
222 public String replaceSearchTermsInUrl(String query, String url) {
223 return nativeReplaceSearchTermsInUrl(mNativeTemplateUrlServiceAndroid, query, url);
226 private native long nativeInit();
227 private native void nativeLoad(long nativeTemplateUrlServiceAndroid);
228 private native boolean nativeIsLoaded(long nativeTemplateUrlServiceAndroid);
229 private native int nativeGetTemplateUrlCount(long nativeTemplateUrlServiceAndroid);
230 private native TemplateUrl nativeGetPrepopulatedTemplateUrlAt(
231 long nativeTemplateUrlServiceAndroid, int i);
232 private native void nativeSetUserSelectedDefaultSearchProvider(
233 long nativeTemplateUrlServiceAndroid, int selectedIndex);
234 private native int nativeGetDefaultSearchProvider(long nativeTemplateUrlServiceAndroid);
235 private native boolean nativeIsSearchProviderManaged(long nativeTemplateUrlServiceAndroid);
236 private native boolean nativeIsSearchByImageAvailable(long nativeTemplateUrlServiceAndroid);
237 private native boolean nativeIsDefaultSearchEngineGoogle(long nativeTemplateUrlServiceAndroid);
238 private native String nativeGetUrlForSearchQuery(long nativeTemplateUrlServiceAndroid,
240 private native String nativeGetUrlForVoiceSearchQuery(long nativeTemplateUrlServiceAndroid,
242 private native String nativeReplaceSearchTermsInUrl(long nativeTemplateUrlServiceAndroid,
243 String query, String currentUrl);