Home | History | Annotate | Download | only in search_engines
      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