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