1 // Copyright (c) 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();
32 public static class TemplateUrl {
33 private final int mIndex;
34 private final String mShortName;
35 private final String mKeyword;
37 @CalledByNative("TemplateUrl")
38 public static TemplateUrl create(int id, String shortName, String keyword) {
39 return new TemplateUrl(id, shortName, keyword);
42 public TemplateUrl(int index, String shortName, String keyword) {
44 mShortName = shortName;
48 public int getIndex() {
52 public String getShortName() {
56 public String getKeyword() {
61 private static TemplateUrlService sService;
63 public static TemplateUrlService getInstance() {
64 ThreadUtils.assertOnUiThread();
65 if (sService == null) {
66 sService = new TemplateUrlService();
71 private final int mNativeTemplateUrlServiceAndroid;
72 private final ObserverList<LoadListener> mLoadListeners = new ObserverList<LoadListener>();
74 private TemplateUrlService() {
75 // Note that this technically leaks the native object, however, TemlateUrlService
76 // is a singleton that lives forever and there's no clean shutdown of Chrome on Android
77 mNativeTemplateUrlServiceAndroid = nativeInit();
80 public boolean isLoaded() {
81 ThreadUtils.assertOnUiThread();
82 return nativeIsLoaded(mNativeTemplateUrlServiceAndroid);
86 ThreadUtils.assertOnUiThread();
87 nativeLoad(mNativeTemplateUrlServiceAndroid);
91 * Get the collection of localized search engines.
93 public List<TemplateUrl> getLocalizedSearchEngines() {
94 ThreadUtils.assertOnUiThread();
95 int templateUrlCount = nativeGetTemplateUrlCount(mNativeTemplateUrlServiceAndroid);
96 List<TemplateUrl> templateUrls = new ArrayList<TemplateUrl>(templateUrlCount);
97 for (int i = 0; i < templateUrlCount; i++) {
98 TemplateUrl templateUrl = nativeGetPrepopulatedTemplateUrlAt(
99 mNativeTemplateUrlServiceAndroid, i);
100 if (templateUrl != null) {
101 templateUrls.add(templateUrl);
108 * Called from native when template URL service is done loading.
111 private void templateUrlServiceLoaded() {
112 ThreadUtils.assertOnUiThread();
113 for (LoadListener listener : mLoadListeners) {
114 listener.onTemplateUrlServiceLoaded();
119 * @return The default search engine index (e.g., 0, 1, 2,...).
121 public int getDefaultSearchEngineIndex() {
122 ThreadUtils.assertOnUiThread();
123 return nativeGetDefaultSearchProvider(mNativeTemplateUrlServiceAndroid);
127 * @return {@link TemplateUrlService.TemplateUrl} for the default search engine.
129 public TemplateUrl getDefaultSearchEngineTemplateUrl() {
130 if (!isLoaded()) return null;
132 int defaultSearchEngineIndex = getDefaultSearchEngineIndex();
133 assert defaultSearchEngineIndex >= 0;
135 return nativeGetPrepopulatedTemplateUrlAt(
136 mNativeTemplateUrlServiceAndroid, defaultSearchEngineIndex);
139 public void setSearchEngine(int selectedIndex) {
140 ThreadUtils.assertOnUiThread();
141 nativeSetDefaultSearchProvider(mNativeTemplateUrlServiceAndroid, selectedIndex);
144 public boolean isSearchProviderManaged() {
145 return nativeIsSearchProviderManaged(mNativeTemplateUrlServiceAndroid);
149 * @return Whether or not the default search engine has search by image support.
151 public boolean isSearchByImageAvailable() {
152 ThreadUtils.assertOnUiThread();
153 return nativeIsSearchByImageAvailable(mNativeTemplateUrlServiceAndroid);
157 * @return Whether the default configured search engine is for a Google property.
159 public boolean isDefaultSearchEngineGoogle() {
160 return nativeIsDefaultSearchEngineGoogle(mNativeTemplateUrlServiceAndroid);
164 * Registers a listener for the callback that indicates that the
165 * TemplateURLService has loaded.
167 public void registerLoadListener(LoadListener listener) {
168 ThreadUtils.assertOnUiThread();
169 assert !mLoadListeners.hasObserver(listener);
170 mLoadListeners.addObserver(listener);
174 * Unregisters a listener for the callback that indicates that the
175 * TemplateURLService has loaded.
177 public void unregisterLoadListener(LoadListener listener) {
178 ThreadUtils.assertOnUiThread();
179 assert (mLoadListeners.hasObserver(listener));
180 mLoadListeners.removeObserver(listener);
184 * Finds the default search engine for the default provider and returns the url query
185 * {@link String} for {@code query}.
186 * @param query The {@link String} that represents the text query the search url should
188 * @return A {@link String} that contains the url of the default search engine with
189 * {@code query} inserted as the search parameter.
191 public String getUrlForSearchQuery(String query) {
192 return nativeGetUrlForSearchQuery(mNativeTemplateUrlServiceAndroid, query);
196 * Replaces the search terms from {@code query} in {@code url}.
197 * @param query The {@link String} that represents the text query that should replace the
198 * existing query in {@code url}.
199 * @param url The {@link String} that contains the search url with another search query that
200 * will be replaced with {@code query}.
201 * @return A new version of {@code url} with the search term replaced with {@code query}.
203 public String replaceSearchTermsInUrl(String query, String url) {
204 return nativeReplaceSearchTermsInUrl(mNativeTemplateUrlServiceAndroid, query, url);
207 private native int nativeInit();
208 private native void nativeLoad(int nativeTemplateUrlServiceAndroid);
209 private native boolean nativeIsLoaded(int nativeTemplateUrlServiceAndroid);
210 private native int nativeGetTemplateUrlCount(int nativeTemplateUrlServiceAndroid);
211 private native TemplateUrl nativeGetPrepopulatedTemplateUrlAt(
212 int nativeTemplateUrlServiceAndroid, int i);
213 private native void nativeSetDefaultSearchProvider(int nativeTemplateUrlServiceAndroid,
215 private native int nativeGetDefaultSearchProvider(int nativeTemplateUrlServiceAndroid);
216 private native boolean nativeIsSearchProviderManaged(int nativeTemplateUrlServiceAndroid);
217 private native boolean nativeIsSearchByImageAvailable(int nativeTemplateUrlServiceAndroid);
218 private native boolean nativeIsDefaultSearchEngineGoogle(int nativeTemplateUrlServiceAndroid);
219 private native String nativeGetUrlForSearchQuery(int nativeTemplateUrlServiceAndroid,
221 private native String nativeReplaceSearchTermsInUrl(int nativeTemplateUrlServiceAndroid,
222 String query, String currentUrl);