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 | return nativeGetPrepopulatedTemplateUrlAt( |
131 | mNativeTemplateUrlServiceAndroid, getDefaultSearchEngineIndex()); |
132 | } |
133 | |
134 | public void setSearchEngine(int selectedIndex) { |
135 | ThreadUtils.assertOnUiThread(); |
136 | nativeSetDefaultSearchProvider(mNativeTemplateUrlServiceAndroid, selectedIndex); |
137 | } |
138 | |
139 | public boolean isSearchProviderManaged() { |
140 | return nativeIsSearchProviderManaged(mNativeTemplateUrlServiceAndroid); |
141 | } |
142 | |
143 | /** |
144 | * @return Whether or not the default search engine has search by image support. |
145 | */ |
146 | public boolean isSearchByImageAvailable() { |
147 | ThreadUtils.assertOnUiThread(); |
148 | return nativeIsSearchByImageAvailable(mNativeTemplateUrlServiceAndroid); |
149 | } |
150 | |
151 | /** |
152 | * @return Whether the default configured search engine is for a Google property. |
153 | */ |
154 | public boolean isDefaultSearchEngineGoogle() { |
155 | return nativeIsDefaultSearchEngineGoogle(mNativeTemplateUrlServiceAndroid); |
156 | } |
157 | |
158 | /** |
159 | * Registers a listener for the TEMPLATE_URL_SERVICE_LOADED notification. |
160 | */ |
161 | public void registerLoadListener(LoadListener listener) { |
162 | ThreadUtils.assertOnUiThread(); |
163 | assert !mLoadListeners.hasObserver(listener); |
164 | mLoadListeners.addObserver(listener); |
165 | } |
166 | |
167 | /** |
168 | * Unregisters a listener for the TEMPLATE_URL_SERVICE_LOADED notification. |
169 | */ |
170 | public void unregisterLoadListener(LoadListener listener) { |
171 | ThreadUtils.assertOnUiThread(); |
172 | assert (mLoadListeners.hasObserver(listener)); |
173 | mLoadListeners.removeObserver(listener); |
174 | } |
175 | |
176 | private native int nativeInit(); |
177 | private native void nativeLoad(int nativeTemplateUrlServiceAndroid); |
178 | private native boolean nativeIsLoaded(int nativeTemplateUrlServiceAndroid); |
179 | private native int nativeGetTemplateUrlCount(int nativeTemplateUrlServiceAndroid); |
180 | private native TemplateUrl nativeGetPrepopulatedTemplateUrlAt( |
181 | int nativeTemplateUrlServiceAndroid, int i); |
182 | private native void nativeSetDefaultSearchProvider(int nativeTemplateUrlServiceAndroid, |
183 | int selectedIndex); |
184 | private native int nativeGetDefaultSearchProvider(int nativeTemplateUrlServiceAndroid); |
185 | private native boolean nativeIsSearchProviderManaged(int nativeTemplateUrlServiceAndroid); |
186 | private native boolean nativeIsSearchByImageAvailable(int nativeTemplateUrlServiceAndroid); |
187 | private native boolean nativeIsDefaultSearchEngineGoogle(int nativeTemplateUrlServiceAndroid); |
188 | } |