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.
5 #include "chrome/browser/search_engines/template_url_service_android.h"
7 #include "base/android/jni_string.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/profiles/profile_manager.h"
13 #include "chrome/browser/search_engines/template_url_service_factory.h"
14 #include "components/google/core/browser/google_util.h"
15 #include "components/search_engines/template_url.h"
16 #include "components/search_engines/template_url_prepopulate_data.h"
17 #include "components/search_engines/template_url_service.h"
18 #include "components/search_engines/util.h"
19 #include "jni/TemplateUrlService_jni.h"
20 #include "net/base/url_util.h"
24 Profile
* GetOriginalProfile() {
25 return ProfileManager::GetActiveUserProfile()->GetOriginalProfile();
30 TemplateUrlServiceAndroid::TemplateUrlServiceAndroid(JNIEnv
* env
,
32 : weak_java_obj_(env
, obj
),
33 template_url_service_(
34 TemplateURLServiceFactory::GetForProfile(GetOriginalProfile())) {
35 template_url_subscription_
=
36 template_url_service_
->RegisterOnLoadedCallback(
37 base::Bind(&TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded
,
38 base::Unretained(this)));
39 template_url_service_
->AddObserver(this);
42 TemplateUrlServiceAndroid::~TemplateUrlServiceAndroid() {
43 template_url_service_
->RemoveObserver(this);
46 void TemplateUrlServiceAndroid::Load(JNIEnv
* env
, jobject obj
) {
47 template_url_service_
->Load();
50 void TemplateUrlServiceAndroid::SetUserSelectedDefaultSearchProvider(
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";
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_
->SetUserSelectedDefaultSearchProvider(template_url
);
66 jint
TemplateUrlServiceAndroid::GetDefaultSearchProvider(JNIEnv
* env
,
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
])
79 jboolean
TemplateUrlServiceAndroid::IsLoaded(JNIEnv
* env
, jobject obj
) {
80 return template_url_service_
->loaded();
83 jint
TemplateUrlServiceAndroid::GetTemplateUrlCount(JNIEnv
* env
, jobject obj
) {
84 return template_url_service_
->GetTemplateURLs().size();
87 jboolean
TemplateUrlServiceAndroid::IsSearchProviderManaged(JNIEnv
* env
,
89 return template_url_service_
->is_default_search_managed();
92 jboolean
TemplateUrlServiceAndroid::IsSearchByImageAvailable(JNIEnv
* env
,
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 template_url_service_
->search_terms_data());
102 jboolean
TemplateUrlServiceAndroid::IsDefaultSearchEngineGoogle(JNIEnv
* env
,
104 TemplateURL
* default_search_provider
=
105 template_url_service_
->GetDefaultSearchProvider();
106 return default_search_provider
&&
107 default_search_provider
->url_ref().HasGoogleBaseURLs(
108 template_url_service_
->search_terms_data());
111 base::android::ScopedJavaLocalRef
<jobject
>
112 TemplateUrlServiceAndroid::GetPrepopulatedTemplateUrlAt(JNIEnv
* env
,
115 TemplateURL
* template_url
= template_url_service_
->GetTemplateURLs()[index
];
116 if (!IsPrepopulatedTemplate(template_url
) &&
117 !template_url
->created_by_policy())
118 return ScopedJavaLocalRef
<jobject
>();
120 return Java_TemplateUrl_create(
123 base::android::ConvertUTF16ToJavaString(
124 env
, template_url
->short_name()).obj(),
125 base::android::ConvertUTF16ToJavaString(
126 env
, template_url
->keyword()).obj());
129 bool TemplateUrlServiceAndroid::IsPrepopulatedTemplate(TemplateURL
* url
) {
130 return url
->prepopulate_id() > 0;
133 void TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded() {
134 template_url_subscription_
.reset();
135 JNIEnv
* env
= base::android::AttachCurrentThread();
136 if (weak_java_obj_
.get(env
).is_null())
139 Java_TemplateUrlService_templateUrlServiceLoaded(
140 env
, weak_java_obj_
.get(env
).obj());
143 void TemplateUrlServiceAndroid::OnTemplateURLServiceChanged() {
144 JNIEnv
* env
= base::android::AttachCurrentThread();
145 if (weak_java_obj_
.get(env
).is_null())
148 Java_TemplateUrlService_onTemplateURLServiceChanged(
149 env
, weak_java_obj_
.get(env
).obj());
152 base::android::ScopedJavaLocalRef
<jstring
>
153 TemplateUrlServiceAndroid::GetUrlForSearchQuery(JNIEnv
* env
,
156 const TemplateURL
* default_provider
=
157 template_url_service_
->GetDefaultSearchProvider();
159 base::string16
query(base::android::ConvertJavaStringToUTF16(env
, jquery
));
162 if (default_provider
&&
163 default_provider
->url_ref().SupportsReplacement(
164 template_url_service_
->search_terms_data()) &&
166 url
= default_provider
->url_ref().ReplaceSearchTerms(
167 TemplateURLRef::SearchTermsArgs(query
),
168 template_url_service_
->search_terms_data());
171 return base::android::ConvertUTF8ToJavaString(env
, url
);
174 base::android::ScopedJavaLocalRef
<jstring
>
175 TemplateUrlServiceAndroid::GetUrlForVoiceSearchQuery(JNIEnv
* env
,
178 base::string16
query(base::android::ConvertJavaStringToUTF16(env
, jquery
));
181 if (!query
.empty()) {
182 GURL
gurl(GetDefaultSearchURLForSearchTerms(template_url_service_
, query
));
183 if (google_util::IsGoogleSearchUrl(gurl
))
184 gurl
= net::AppendQueryParameter(gurl
, "inm", "vs");
188 return base::android::ConvertUTF8ToJavaString(env
, url
);
191 base::android::ScopedJavaLocalRef
<jstring
>
192 TemplateUrlServiceAndroid::ReplaceSearchTermsInUrl(JNIEnv
* env
,
195 jstring jcurrent_url
) {
196 TemplateURL
* default_provider
=
197 template_url_service_
->GetDefaultSearchProvider();
199 base::string16
query(base::android::ConvertJavaStringToUTF16(env
, jquery
));
200 GURL
current_url(base::android::ConvertJavaStringToUTF16(env
, jcurrent_url
));
201 GURL
destination_url(current_url
);
202 if (default_provider
&& !query
.empty()) {
203 bool refined_query
= default_provider
->ReplaceSearchTermsInURL(
204 current_url
, TemplateURLRef::SearchTermsArgs(query
),
205 template_url_service_
->search_terms_data(), &destination_url
);
207 return base::android::ConvertUTF8ToJavaString(
208 env
, destination_url
.spec());
210 return base::android::ScopedJavaLocalRef
<jstring
>(env
, NULL
);
213 base::android::ScopedJavaLocalRef
<jstring
>
214 TemplateUrlServiceAndroid::GetUrlForContextualSearchQuery(
218 jstring jalternate_term
,
219 jboolean jshould_prefetch
) {
220 base::string16
query(base::android::ConvertJavaStringToUTF16(env
, jquery
));
223 if (!query
.empty()) {
224 GURL
gurl(GetDefaultSearchURLForSearchTerms(template_url_service_
, query
));
225 if (google_util::IsGoogleSearchUrl(gurl
)) {
226 gurl
= net::AppendQueryParameter(gurl
, "ctxs", "2");
227 if (jshould_prefetch
) {
228 // Indicate that the search page is being prefetched.
229 gurl
= net::AppendQueryParameter(gurl
, "pf", "c");
232 if (jalternate_term
) {
233 std::string
alternate_term(
234 base::android::ConvertJavaStringToUTF8(env
, jalternate_term
));
235 if (!alternate_term
.empty()) {
236 gurl
= net::AppendQueryParameter(
237 gurl
, "ctxsl_alternate_term", alternate_term
);
244 return base::android::ConvertUTF8ToJavaString(env
, url
);
247 static jlong
Init(JNIEnv
* env
, jobject obj
) {
248 TemplateUrlServiceAndroid
* template_url_service_android
=
249 new TemplateUrlServiceAndroid(env
, obj
);
250 return reinterpret_cast<intptr_t>(template_url_service_android
);
254 bool TemplateUrlServiceAndroid::Register(JNIEnv
* env
) {
255 return RegisterNativesImpl(env
);