- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / android / java / src / org / chromium / chrome / browser / search_engines / TemplateUrlService.java
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.
4
5 package org.chromium.chrome.browser.search_engines;
6
7 import org.chromium.base.CalledByNative;
8 import org.chromium.base.ObserverList;
9 import org.chromium.base.ThreadUtils;
10
11 import java.util.ArrayList;
12 import java.util.List;
13
14 /**
15  * Android wrapper of the TemplateUrlService which provides access from the Java
16  * layer.
17  *
18  * Only usable from the UI thread as it's primary purpose is for supporting the Android
19  * preferences UI.
20  *
21  * See chrome/browser/search_engines/template_url_service.h for more details.
22  */
23 public class TemplateUrlService {
24
25     /**
26      * This listener will be notified when template url service is done loading.
27      */
28     public interface LoadListener {
29         public abstract void onTemplateUrlServiceLoaded();
30     }
31
32     public static class TemplateUrl {
33         private final int mIndex;
34         private final String mShortName;
35         private final String mKeyword;
36
37         @CalledByNative("TemplateUrl")
38         public static TemplateUrl create(int id, String shortName, String keyword) {
39             return new TemplateUrl(id, shortName, keyword);
40         }
41
42         public TemplateUrl(int index, String shortName, String keyword) {
43           mIndex = index;
44           mShortName = shortName;
45           mKeyword = keyword;
46         }
47
48         public int getIndex() {
49             return mIndex;
50         }
51
52         public String getShortName() {
53             return mShortName;
54         }
55
56         public String getKeyword() {
57             return mKeyword;
58         }
59     }
60
61     private static TemplateUrlService sService;
62
63     public static TemplateUrlService getInstance() {
64         ThreadUtils.assertOnUiThread();
65         if (sService == null) {
66             sService = new TemplateUrlService();
67         }
68         return sService;
69     }
70
71     private final int mNativeTemplateUrlServiceAndroid;
72     private final ObserverList<LoadListener> mLoadListeners = new ObserverList<LoadListener>();
73
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();
78     }
79
80     public boolean isLoaded() {
81         ThreadUtils.assertOnUiThread();
82         return nativeIsLoaded(mNativeTemplateUrlServiceAndroid);
83     }
84
85     public void load() {
86         ThreadUtils.assertOnUiThread();
87         nativeLoad(mNativeTemplateUrlServiceAndroid);
88     }
89
90     /**
91      * Get the collection of localized search engines.
92      */
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);
102             }
103         }
104         return templateUrls;
105     }
106
107     /**
108      * Called from native when template URL service is done loading.
109      */
110     @CalledByNative
111     private void templateUrlServiceLoaded() {
112         ThreadUtils.assertOnUiThread();
113         for (LoadListener listener : mLoadListeners) {
114             listener.onTemplateUrlServiceLoaded();
115         }
116     }
117
118     /**
119      * @return The default search engine index (e.g., 0, 1, 2,...).
120      */
121     public int getDefaultSearchEngineIndex() {
122         ThreadUtils.assertOnUiThread();
123         return nativeGetDefaultSearchProvider(mNativeTemplateUrlServiceAndroid);
124     }
125
126     /**
127      * @return {@link TemplateUrlService.TemplateUrl} for the default search engine.
128      */
129     public TemplateUrl getDefaultSearchEngineTemplateUrl() {
130         if (!isLoaded()) return null;
131
132         int defaultSearchEngineIndex = getDefaultSearchEngineIndex();
133         assert defaultSearchEngineIndex >= 0;
134
135         return nativeGetPrepopulatedTemplateUrlAt(
136                 mNativeTemplateUrlServiceAndroid, defaultSearchEngineIndex);
137     }
138
139     public void setSearchEngine(int selectedIndex) {
140         ThreadUtils.assertOnUiThread();
141         nativeSetDefaultSearchProvider(mNativeTemplateUrlServiceAndroid, selectedIndex);
142     }
143
144     public boolean isSearchProviderManaged() {
145         return nativeIsSearchProviderManaged(mNativeTemplateUrlServiceAndroid);
146     }
147
148     /**
149      * @return Whether or not the default search engine has search by image support.
150      */
151     public boolean isSearchByImageAvailable() {
152         ThreadUtils.assertOnUiThread();
153         return nativeIsSearchByImageAvailable(mNativeTemplateUrlServiceAndroid);
154     }
155
156     /**
157      * @return Whether the default configured search engine is for a Google property.
158      */
159     public boolean isDefaultSearchEngineGoogle() {
160         return nativeIsDefaultSearchEngineGoogle(mNativeTemplateUrlServiceAndroid);
161     }
162
163     /**
164      * Registers a listener for the callback that indicates that the
165      * TemplateURLService has loaded.
166      */
167     public void registerLoadListener(LoadListener listener) {
168         ThreadUtils.assertOnUiThread();
169         assert !mLoadListeners.hasObserver(listener);
170         mLoadListeners.addObserver(listener);
171     }
172
173     /**
174      * Unregisters a listener for the callback that indicates that the
175      * TemplateURLService has loaded.
176      */
177     public void unregisterLoadListener(LoadListener listener) {
178         ThreadUtils.assertOnUiThread();
179         assert (mLoadListeners.hasObserver(listener));
180         mLoadListeners.removeObserver(listener);
181     }
182
183     /**
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
187      *              represent.
188      * @return      A {@link String} that contains the url of the default search engine with
189      *              {@code query} inserted as the search parameter.
190      */
191     public String getUrlForSearchQuery(String query) {
192         return nativeGetUrlForSearchQuery(mNativeTemplateUrlServiceAndroid, query);
193     }
194
195     /**
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}.
202      */
203     public String replaceSearchTermsInUrl(String query, String url) {
204         return nativeReplaceSearchTermsInUrl(mNativeTemplateUrlServiceAndroid, query, url);
205     }
206
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,
214             int selectedIndex);
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,
220             String query);
221     private native String nativeReplaceSearchTermsInUrl(int nativeTemplateUrlServiceAndroid,
222             String query, String currentUrl);
223 }