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