- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / search_engines / template_url_service_android.cc
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/bind.h"
9 #include "base/format_macros.h"
10 #include "base/strings/stringprintf.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "chrome/browser/browser_process.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_factory.h"
18 #include "jni/TemplateUrlService_jni.h"
19
20 using base::android::ConvertJavaStringToUTF16;
21 using base::android::ConvertUTF16ToJavaString;
22 using base::android::ConvertUTF8ToJavaString;
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   template_url_subscription_ =
39       template_url_service_->RegisterOnLoadedCallback(
40           base::Bind(&TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded,
41                      base::Unretained(this)));
42 }
43
44 TemplateUrlServiceAndroid::~TemplateUrlServiceAndroid() {
45 }
46
47 void TemplateUrlServiceAndroid::Load(JNIEnv* env, jobject obj) {
48   template_url_service_->Load();
49 }
50
51 void TemplateUrlServiceAndroid::SetDefaultSearchProvider(JNIEnv* env,
52                                                          jobject obj,
53                                                          jint selected_index) {
54   std::vector<TemplateURL*> template_urls =
55       template_url_service_->GetTemplateURLs();
56   size_t selected_index_size_t = static_cast<size_t>(selected_index);
57   DCHECK_LT(selected_index_size_t, template_urls.size()) <<
58       "Wrong index for search engine";
59
60   TemplateURL* template_url = template_urls[selected_index_size_t];
61   DCHECK_GT(template_url->prepopulate_id(), 0) <<
62       "Tried to select non-prepopulated search engine";
63   template_url_service_->SetDefaultSearchProvider(template_url);
64 }
65
66 jint TemplateUrlServiceAndroid::GetDefaultSearchProvider(JNIEnv* env,
67                                                          jobject obj) {
68   std::vector<TemplateURL*> template_urls =
69       template_url_service_->GetTemplateURLs();
70   TemplateURL* default_search_provider =
71       template_url_service_->GetDefaultSearchProvider();
72   for (size_t i = 0; i < template_urls.size(); ++i) {
73     if (default_search_provider == template_urls[i])
74       return i;
75   }
76   return -1;
77 }
78
79 jboolean TemplateUrlServiceAndroid::IsLoaded(JNIEnv* env, jobject obj) {
80   return template_url_service_->loaded();
81 }
82
83 jint TemplateUrlServiceAndroid::GetTemplateUrlCount(JNIEnv* env, jobject obj) {
84   return template_url_service_->GetTemplateURLs().size();
85 }
86
87 jboolean TemplateUrlServiceAndroid::IsSearchProviderManaged(JNIEnv* env,
88                                                             jobject obj) {
89   return template_url_service_->is_default_search_managed();
90 }
91
92 jboolean TemplateUrlServiceAndroid::IsSearchByImageAvailable(JNIEnv* env,
93                                                              jobject obj) {
94   const TemplateURL* default_search_provider =
95       template_url_service_->GetDefaultSearchProvider();
96   return default_search_provider &&
97       !default_search_provider->image_url().empty() &&
98       default_search_provider->image_url_ref().IsValid();
99 }
100
101 jboolean TemplateUrlServiceAndroid::IsDefaultSearchEngineGoogle(JNIEnv* env,
102                                                                 jobject obj) {
103   TemplateURL* default_search_provider =
104       template_url_service_->GetDefaultSearchProvider();
105   return default_search_provider &&
106       default_search_provider->url_ref().HasGoogleBaseURLs();
107 }
108
109 base::android::ScopedJavaLocalRef<jobject>
110 TemplateUrlServiceAndroid::GetPrepopulatedTemplateUrlAt(JNIEnv* env,
111                                                         jobject obj,
112                                                         jint index) {
113   TemplateURL* template_url = template_url_service_->GetTemplateURLs()[index];
114   if (!IsPrepopulatedTemplate(template_url) &&
115       !template_url->created_by_policy())
116    return ScopedJavaLocalRef<jobject>();
117
118   return Java_TemplateUrl_create(
119       env,
120       index,
121       ConvertUTF16ToJavaString(env, template_url->short_name()).obj(),
122       ConvertUTF16ToJavaString(env, template_url->keyword()).obj());
123 }
124
125 bool TemplateUrlServiceAndroid::IsPrepopulatedTemplate(TemplateURL* url) {
126   return url->prepopulate_id() > 0;
127 }
128
129 void TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded() {
130   template_url_subscription_.reset();
131   JNIEnv* env = base::android::AttachCurrentThread();
132   if (weak_java_obj_.get(env).is_null())
133     return;
134
135   Java_TemplateUrlService_templateUrlServiceLoaded(
136       env, weak_java_obj_.get(env).obj());
137 }
138
139 base::android::ScopedJavaLocalRef<jstring>
140 TemplateUrlServiceAndroid::GetUrlForSearchQuery(JNIEnv* env,
141                                                 jobject obj,
142                                                 jstring jquery) {
143   const TemplateURL* default_provider =
144       template_url_service_->GetDefaultSearchProvider();
145
146   string16 query(ConvertJavaStringToUTF16(env, jquery));
147
148   std::string url;
149   if (default_provider &&
150       default_provider->url_ref().SupportsReplacement() && !query.empty()) {
151     url = default_provider->url_ref().ReplaceSearchTerms(
152         TemplateURLRef::SearchTermsArgs(query));
153   }
154
155   return ConvertUTF8ToJavaString(env, url);
156 }
157
158 base::android::ScopedJavaLocalRef<jstring>
159 TemplateUrlServiceAndroid::ReplaceSearchTermsInUrl(JNIEnv* env,
160                                                    jobject obj,
161                                                    jstring jquery,
162                                                    jstring jcurrent_url) {
163   TemplateURL* default_provider =
164       template_url_service_->GetDefaultSearchProvider();
165
166   string16 query(ConvertJavaStringToUTF16(env, jquery));
167   GURL current_url(ConvertJavaStringToUTF16(env, jcurrent_url));
168   GURL destination_url(current_url);
169   if (default_provider && !query.empty()) {
170     bool refined_query = default_provider->ReplaceSearchTermsInURL(current_url,
171         TemplateURLRef::SearchTermsArgs(query), &destination_url);
172     if (refined_query)
173       return ConvertUTF8ToJavaString(env, destination_url.spec());
174   }
175   return base::android::ScopedJavaLocalRef<jstring>(env, NULL);
176 }
177
178 static jint Init(JNIEnv* env, jobject obj) {
179   TemplateUrlServiceAndroid* template_url_service_android =
180       new TemplateUrlServiceAndroid(env, obj);
181   return reinterpret_cast<jint>(template_url_service_android);
182 }
183
184 // static
185 bool TemplateUrlServiceAndroid::Register(JNIEnv* env) {
186   return RegisterNativesImpl(env);
187 }