12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_android.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/android/jni_string.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/format_macros.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h" 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/search_engines/search_terms_data.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search_engines/template_url.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search_engines/template_url_prepopulate_data.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search_engines/template_url_service.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_source.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "jni/TemplateUrlService_jni.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::android::ConvertUTF16ToJavaString; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Profile* GetOriginalProfile() { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return g_browser_process->profile_manager()->GetDefaultProfile()-> 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetOriginalProfile(); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TemplateUrlServiceAndroid::TemplateUrlServiceAndroid(JNIEnv* env, 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) jobject obj) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : weak_java_obj_(env, obj), 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) template_url_service_( 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURLServiceFactory::GetForProfile(GetOriginalProfile())) { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.Add(this, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED, 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Source<TemplateURLService>(template_url_service_)); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TemplateUrlServiceAndroid::~TemplateUrlServiceAndroid() { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TemplateUrlServiceAndroid::Observe( 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int type, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationSource& source, 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED, type); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (weak_java_obj_.get(env).is_null()) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Java_TemplateUrlService_templateUrlServiceLoaded(env, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) weak_java_obj_.get(env).obj()); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TemplateUrlServiceAndroid::Load(JNIEnv* env, jobject obj) { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) template_url_service_->Load(); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TemplateUrlServiceAndroid::SetDefaultSearchProvider(JNIEnv* env, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) jobject obj, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) jint selected_index) { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<TemplateURL*> template_urls = 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) template_url_service_->GetTemplateURLs(); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t selected_index_size_t = static_cast<size_t>(selected_index); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_LT(selected_index_size_t, template_urls.size()) << 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Wrong index for search engine"; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURL* template_url = template_urls[selected_index_size_t]; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_GT(template_url->prepopulate_id(), 0) << 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Tried to select non-prepopulated search engine"; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) template_url_service_->SetDefaultSearchProvider(template_url); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)jint TemplateUrlServiceAndroid::GetDefaultSearchProvider(JNIEnv* env, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) jobject obj) { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<TemplateURL*> template_urls = 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) template_url_service_->GetTemplateURLs(); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURL* default_search_provider = 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) template_url_service_->GetDefaultSearchProvider(); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < template_urls.size(); ++i) { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (default_search_provider == template_urls[i]) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return i; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)jboolean TemplateUrlServiceAndroid::IsLoaded(JNIEnv* env, jobject obj) { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return template_url_service_->loaded(); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)jint TemplateUrlServiceAndroid::GetTemplateUrlCount(JNIEnv* env, jobject obj) { 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return template_url_service_->GetTemplateURLs().size(); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochjboolean TemplateUrlServiceAndroid::IsSearchProviderManaged(JNIEnv* env, 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch jobject obj) { 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return template_url_service_->is_default_search_managed(); 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)jboolean TemplateUrlServiceAndroid::IsSearchByImageAvailable(JNIEnv* env, 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) jobject obj) { 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const TemplateURL* default_search_provider = 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) template_url_service_->GetDefaultSearchProvider(); 108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return default_search_provider && 109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) !default_search_provider->image_url().empty() && 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) default_search_provider->image_url_ref().IsValid(); 111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochjboolean TemplateUrlServiceAndroid::IsDefaultSearchEngineGoogle(JNIEnv* env, 114ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch jobject obj) { 115ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch TemplateURL* default_search_provider = 116ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch template_url_service_->GetDefaultSearchProvider(); 117ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return default_search_provider && 118ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch default_search_provider->url_ref().HasGoogleBaseURLs(); 119ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::android::ScopedJavaLocalRef<jobject> 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TemplateUrlServiceAndroid::GetPrepopulatedTemplateUrlAt(JNIEnv* env, 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) jobject obj, 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) jint index) { 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURL* template_url = template_url_service_->GetTemplateURLs()[index]; 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!IsPrepopulatedTemplate(template_url) && 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch !template_url->created_by_policy()) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ScopedJavaLocalRef<jobject>(); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Java_TemplateUrl_create( 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env, 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) index, 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ConvertUTF16ToJavaString(env, template_url->short_name()).obj(), 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ConvertUTF16ToJavaString(env, template_url->keyword()).obj()); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TemplateUrlServiceAndroid::IsPrepopulatedTemplate(TemplateURL* url) { 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return url->prepopulate_id() > 0; 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static jint Init(JNIEnv* env, jobject obj) { 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateUrlServiceAndroid* template_url_service_android = 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TemplateUrlServiceAndroid(env, obj); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return reinterpret_cast<jint>(template_url_service_android); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TemplateUrlServiceAndroid::Register(JNIEnv* env) { 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RegisterNativesImpl(env); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 151