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 TEMPLATE_URL_SERVICE_LOADED notification. 165 */ 166 public void registerLoadListener(LoadListener listener) { 167 ThreadUtils.assertOnUiThread(); 168 assert !mLoadListeners.hasObserver(listener); 169 mLoadListeners.addObserver(listener); 170 } 171 172 /** 173 * Unregisters a listener for the TEMPLATE_URL_SERVICE_LOADED notification. 174 */ 175 public void unregisterLoadListener(LoadListener listener) { 176 ThreadUtils.assertOnUiThread(); 177 assert (mLoadListeners.hasObserver(listener)); 178 mLoadListeners.removeObserver(listener); 179 } 180 181 private native int nativeInit(); 182 private native void nativeLoad(int nativeTemplateUrlServiceAndroid); 183 private native boolean nativeIsLoaded(int nativeTemplateUrlServiceAndroid); 184 private native int nativeGetTemplateUrlCount(int nativeTemplateUrlServiceAndroid); 185 private native TemplateUrl nativeGetPrepopulatedTemplateUrlAt( 186 int nativeTemplateUrlServiceAndroid, int i); 187 private native void nativeSetDefaultSearchProvider(int nativeTemplateUrlServiceAndroid, 188 int selectedIndex); 189 private native int nativeGetDefaultSearchProvider(int nativeTemplateUrlServiceAndroid); 190 private native boolean nativeIsSearchProviderManaged(int nativeTemplateUrlServiceAndroid); 191 private native boolean nativeIsSearchByImageAvailable(int nativeTemplateUrlServiceAndroid); 192 private native boolean nativeIsDefaultSearchEngineGoogle(int nativeTemplateUrlServiceAndroid); 193 } 194