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 #include "chrome/browser/search_engines/template_url_service_android.h"
      6 
      7 #include "base/android/jni_string.h"
      8 #include "base/format_macros.h"
      9 #include "base/strings/stringprintf.h"
     10 #include "base/strings/utf_string_conversions.h"
     11 #include "chrome/browser/browser_process.h"
     12 #include "chrome/browser/chrome_notification_types.h"
     13 #include "chrome/browser/profiles/profile_manager.h"
     14 #include "chrome/browser/search_engines/search_terms_data.h"
     15 #include "chrome/browser/search_engines/template_url.h"
     16 #include "chrome/browser/search_engines/template_url_prepopulate_data.h"
     17 #include "chrome/browser/search_engines/template_url_service.h"
     18 #include "chrome/browser/search_engines/template_url_service_factory.h"
     19 #include "content/public/browser/notification_source.h"
     20 #include "jni/TemplateUrlService_jni.h"
     21 
     22 using base::android::ConvertUTF16ToJavaString;
     23 
     24 namespace {
     25 
     26 Profile* GetOriginalProfile() {
     27   return g_browser_process->profile_manager()->GetDefaultProfile()->
     28       GetOriginalProfile();
     29 }
     30 
     31 }  // namespace
     32 
     33 TemplateUrlServiceAndroid::TemplateUrlServiceAndroid(JNIEnv* env,
     34                                                      jobject obj)
     35     : weak_java_obj_(env, obj),
     36       template_url_service_(
     37           TemplateURLServiceFactory::GetForProfile(GetOriginalProfile())) {
     38   registrar_.Add(this,
     39                  chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED,
     40                  content::Source<TemplateURLService>(template_url_service_));
     41 }
     42 
     43 TemplateUrlServiceAndroid::~TemplateUrlServiceAndroid() {
     44 }
     45 
     46 void TemplateUrlServiceAndroid::Observe(
     47     int type,
     48     const content::NotificationSource& source,
     49     const content::NotificationDetails& details) {
     50   DCHECK_EQ(chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED, type);
     51   JNIEnv* env = base::android::AttachCurrentThread();
     52   if (weak_java_obj_.get(env).is_null())
     53     return;
     54 
     55   Java_TemplateUrlService_templateUrlServiceLoaded(env,
     56       weak_java_obj_.get(env).obj());
     57 }
     58 
     59 void TemplateUrlServiceAndroid::Load(JNIEnv* env, jobject obj) {
     60   template_url_service_->Load();
     61 }
     62 
     63 void TemplateUrlServiceAndroid::SetDefaultSearchProvider(JNIEnv* env,
     64                                                          jobject obj,
     65                                                          jint selected_index) {
     66   std::vector<TemplateURL*> template_urls =
     67       template_url_service_->GetTemplateURLs();
     68   size_t selected_index_size_t = static_cast<size_t>(selected_index);
     69   DCHECK_LT(selected_index_size_t, template_urls.size()) <<
     70       "Wrong index for search engine";
     71 
     72   TemplateURL* template_url = template_urls[selected_index_size_t];
     73   DCHECK_GT(template_url->prepopulate_id(), 0) <<
     74       "Tried to select non-prepopulated search engine";
     75   template_url_service_->SetDefaultSearchProvider(template_url);
     76 }
     77 
     78 jint TemplateUrlServiceAndroid::GetDefaultSearchProvider(JNIEnv* env,
     79                                                          jobject obj) {
     80   std::vector<TemplateURL*> template_urls =
     81       template_url_service_->GetTemplateURLs();
     82   TemplateURL* default_search_provider =
     83       template_url_service_->GetDefaultSearchProvider();
     84   for (size_t i = 0; i < template_urls.size(); ++i) {
     85     if (default_search_provider == template_urls[i])
     86       return i;
     87   }
     88   return -1;
     89 }
     90 
     91 jboolean TemplateUrlServiceAndroid::IsLoaded(JNIEnv* env, jobject obj) {
     92   return template_url_service_->loaded();
     93 }
     94 
     95 jint TemplateUrlServiceAndroid::GetTemplateUrlCount(JNIEnv* env, jobject obj) {
     96   return template_url_service_->GetTemplateURLs().size();
     97 }
     98 
     99 jboolean TemplateUrlServiceAndroid::IsSearchProviderManaged(JNIEnv* env,
    100                                                             jobject obj) {
    101   return template_url_service_->is_default_search_managed();
    102 }
    103 
    104 jboolean TemplateUrlServiceAndroid::IsSearchByImageAvailable(JNIEnv* env,
    105                                                              jobject obj) {
    106   const TemplateURL* default_search_provider =
    107       template_url_service_->GetDefaultSearchProvider();
    108   return default_search_provider &&
    109       !default_search_provider->image_url().empty() &&
    110       default_search_provider->image_url_ref().IsValid();
    111 }
    112 
    113 jboolean TemplateUrlServiceAndroid::IsDefaultSearchEngineGoogle(JNIEnv* env,
    114                                                                 jobject obj) {
    115   TemplateURL* default_search_provider =
    116       template_url_service_->GetDefaultSearchProvider();
    117   return default_search_provider &&
    118       default_search_provider->url_ref().HasGoogleBaseURLs();
    119 }
    120 
    121 base::android::ScopedJavaLocalRef<jobject>
    122 TemplateUrlServiceAndroid::GetPrepopulatedTemplateUrlAt(JNIEnv* env,
    123                                                         jobject obj,
    124                                                         jint index) {
    125   TemplateURL* template_url = template_url_service_->GetTemplateURLs()[index];
    126   if (!IsPrepopulatedTemplate(template_url) &&
    127       !template_url->created_by_policy())
    128    return ScopedJavaLocalRef<jobject>();
    129 
    130   return Java_TemplateUrl_create(
    131       env,
    132       index,
    133       ConvertUTF16ToJavaString(env, template_url->short_name()).obj(),
    134       ConvertUTF16ToJavaString(env, template_url->keyword()).obj());
    135 }
    136 
    137 bool TemplateUrlServiceAndroid::IsPrepopulatedTemplate(TemplateURL* url) {
    138   return url->prepopulate_id() > 0;
    139 }
    140 
    141 static jint Init(JNIEnv* env, jobject obj) {
    142   TemplateUrlServiceAndroid* template_url_service_android =
    143       new TemplateUrlServiceAndroid(env, obj);
    144   return reinterpret_cast<jint>(template_url_service_android);
    145 }
    146 
    147 // static
    148 bool TemplateUrlServiceAndroid::Register(JNIEnv* env) {
    149   return RegisterNativesImpl(env);
    150 }
    151