OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/search_engines/template_url_service_android.h" | 5 #include "chrome/browser/search_engines/template_url_service_android.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include "base/android/jni_string.h" | 9 #include "base/android/jni_string.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 14 matching lines...) Expand all Loading... | |
25 using base::android::ScopedJavaLocalRef; | 25 using base::android::ScopedJavaLocalRef; |
26 | 26 |
27 namespace { | 27 namespace { |
28 | 28 |
29 Profile* GetOriginalProfile() { | 29 Profile* GetOriginalProfile() { |
30 return ProfileManager::GetActiveUserProfile()->GetOriginalProfile(); | 30 return ProfileManager::GetActiveUserProfile()->GetOriginalProfile(); |
31 } | 31 } |
32 | 32 |
33 } // namespace | 33 } // namespace |
34 | 34 |
35 TemplateUrlServiceAndroid::TemplateUrlServiceAndroid(JNIEnv* env, | 35 TemplateUrlServiceAndroid::TemplateUrlServiceAndroid(JNIEnv* env, jobject obj) |
36 jobject obj) | |
37 : weak_java_obj_(env, obj), | 36 : weak_java_obj_(env, obj), |
38 template_url_service_( | 37 template_url_service_( |
39 TemplateURLServiceFactory::GetForProfile(GetOriginalProfile())) { | 38 TemplateURLServiceFactory::GetForProfile(GetOriginalProfile())) { |
40 template_url_subscription_ = | 39 template_url_subscription_ = template_url_service_->RegisterOnLoadedCallback( |
41 template_url_service_->RegisterOnLoadedCallback( | 40 base::Bind(&TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded, |
42 base::Bind(&TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded, | 41 base::Unretained(this))); |
43 base::Unretained(this))); | |
44 template_url_service_->AddObserver(this); | 42 template_url_service_->AddObserver(this); |
45 if (template_url_service_->loaded() && template_urls_.empty()) | 43 if (template_url_service_->loaded() && template_urls_.empty()) |
46 LoadTemplateURLs(); | 44 LoadTemplateURLs(); |
47 } | 45 } |
48 | 46 |
49 TemplateUrlServiceAndroid::~TemplateUrlServiceAndroid() { | 47 TemplateUrlServiceAndroid::~TemplateUrlServiceAndroid() { |
50 template_url_service_->RemoveObserver(this); | 48 template_url_service_->RemoveObserver(this); |
51 } | 49 } |
52 | 50 |
53 void TemplateUrlServiceAndroid::Load(JNIEnv* env, | 51 void TemplateUrlServiceAndroid::Load(JNIEnv* env, |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
95 const JavaParamRef<jobject>& obj) { | 93 const JavaParamRef<jobject>& obj) { |
96 return template_url_service_->is_default_search_managed(); | 94 return template_url_service_->is_default_search_managed(); |
97 } | 95 } |
98 | 96 |
99 jboolean TemplateUrlServiceAndroid::IsSearchByImageAvailable( | 97 jboolean TemplateUrlServiceAndroid::IsSearchByImageAvailable( |
100 JNIEnv* env, | 98 JNIEnv* env, |
101 const JavaParamRef<jobject>& obj) { | 99 const JavaParamRef<jobject>& obj) { |
102 const TemplateURL* default_search_provider = | 100 const TemplateURL* default_search_provider = |
103 template_url_service_->GetDefaultSearchProvider(); | 101 template_url_service_->GetDefaultSearchProvider(); |
104 return default_search_provider && | 102 return default_search_provider && |
105 !default_search_provider->image_url().empty() && | 103 !default_search_provider->image_url().empty() && |
106 default_search_provider->image_url_ref().IsValid( | 104 default_search_provider->image_url_ref().IsValid( |
107 template_url_service_->search_terms_data()); | 105 template_url_service_->search_terms_data()); |
108 } | 106 } |
109 | 107 |
110 jboolean TemplateUrlServiceAndroid::IsDefaultSearchEngineGoogle( | 108 jboolean TemplateUrlServiceAndroid::IsDefaultSearchEngineGoogle( |
111 JNIEnv* env, | 109 JNIEnv* env, |
112 const JavaParamRef<jobject>& obj) { | 110 const JavaParamRef<jobject>& obj) { |
113 TemplateURL* default_search_provider = | 111 TemplateURL* default_search_provider = |
114 template_url_service_->GetDefaultSearchProvider(); | 112 template_url_service_->GetDefaultSearchProvider(); |
115 return default_search_provider && | 113 return default_search_provider && |
116 default_search_provider->url_ref().HasGoogleBaseURLs( | 114 default_search_provider->url_ref().HasGoogleBaseURLs( |
117 template_url_service_->search_terms_data()); | 115 template_url_service_->search_terms_data()); |
118 } | 116 } |
119 | 117 |
120 base::android::ScopedJavaLocalRef<jobject> | 118 base::android::ScopedJavaLocalRef<jobject> |
121 TemplateUrlServiceAndroid::GetTemplateUrlAt(JNIEnv* env, | 119 TemplateUrlServiceAndroid::GetTemplateUrlAt(JNIEnv* env, |
122 const JavaParamRef<jobject>& obj, | 120 const JavaParamRef<jobject>& obj, |
123 jint index) const { | 121 jint index) const { |
124 TemplateURL* template_url = template_urls_[index]; | 122 TemplateURL* template_url = template_urls_[index]; |
125 return Java_TemplateUrl_create( | 123 return Java_TemplateUrl_create( |
126 env, index, | 124 env, index, |
127 base::android::ConvertUTF16ToJavaString(env, template_url->short_name()), | 125 base::android::ConvertUTF16ToJavaString(env, template_url->short_name()), |
128 base::android::ConvertUTF8ToJavaString(env, template_url->url()), | 126 base::android::ConvertUTF8ToJavaString(env, template_url->url()), |
129 template_url_service_->IsPrepopulatedOrCreatedByPolicy(template_url), | 127 template_url_service_->IsPrepopulatedOrCreatedByPolicy(template_url), |
130 base::android::ConvertUTF16ToJavaString(env, template_url->keyword())); | 128 base::android::ConvertUTF16ToJavaString(env, template_url->keyword())); |
131 } | 129 } |
132 | 130 |
133 void TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded() { | 131 void TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded() { |
134 template_url_subscription_.reset(); | 132 template_url_subscription_.reset(); |
135 JNIEnv* env = base::android::AttachCurrentThread(); | 133 JNIEnv* env = base::android::AttachCurrentThread(); |
136 if (weak_java_obj_.get(env).is_null()) | 134 if (weak_java_obj_.get(env).is_null()) |
137 return; | 135 return; |
138 LoadTemplateURLs(); | 136 LoadTemplateURLs(); |
139 | 137 |
140 Java_TemplateUrlService_templateUrlServiceLoaded(env, | 138 Java_TemplateUrlService_templateUrlServiceLoaded(env, |
141 weak_java_obj_.get(env)); | 139 weak_java_obj_.get(env)); |
142 } | 140 } |
143 | 141 |
144 void TemplateUrlServiceAndroid::LoadTemplateURLs() { | 142 void TemplateUrlServiceAndroid::LoadTemplateURLs() { |
145 template_urls_ = template_url_service_->GetTemplateURLs(); | 143 template_urls_ = template_url_service_->GetTemplateURLs(); |
146 TemplateURL* default_search_provider = | |
147 template_url_service_->GetDefaultSearchProvider(); | |
148 | 144 |
149 auto comp = [&](const TemplateURL* lhs, const TemplateURL* rhs) { | 145 TemplateURLService* template_url_serivce = template_url_service_; |
Peter Kasting
2016/12/09 01:26:56
Nit: Spelling: serivce -> service
ltian
2016/12/15 19:02:35
Done.
| |
150 bool rhs_prepopulated = | 146 // Move prepopulated and policy-created engines to the front of list, |
151 template_url_service_->IsPrepopulatedOrCreatedByPolicy(rhs); | 147 // and sort by prepopulated_id. |
Peter Kasting
2016/12/09 01:26:56
Nit: I would place this comment above the declarat
ltian
2016/12/15 19:02:35
Done.
| |
152 if (template_url_service_->IsPrepopulatedOrCreatedByPolicy(lhs)) { | 148 auto it = std::partition( |
153 return !rhs_prepopulated || | 149 template_urls_.begin(), template_urls_.end(), |
154 (lhs->prepopulate_id() < rhs->prepopulate_id()); | 150 [template_url_serivce](const TemplateURL* t_url) { |
155 } | 151 return template_url_serivce->IsPrepopulatedOrCreatedByPolicy(t_url); |
156 return (lhs == default_search_provider && !rhs_prepopulated); | 152 }); |
153 std::sort(template_urls_.begin(), it, | |
154 [](const TemplateURL* lhs, const TemplateURL* rhs) { | |
155 return lhs->prepopulate_id() < rhs->prepopulate_id(); | |
156 }); | |
157 | |
158 // Place user-selected default engine next. | |
Peter Kasting
2016/12/09 01:26:56
Nit: I suggest saying "any" after "Place" since it
ltian
2016/12/15 19:02:35
Done.
| |
159 TemplateURL* dsp = template_url_service_->GetDefaultSearchProvider(); | |
160 it = std::partition(it, template_urls_.end(), | |
161 [dsp](const TemplateURL* t_url) { return t_url == dsp; }); | |
162 | |
163 // Sort the remaining engines with the three most recently-visited first. | |
Peter Kasting
2016/12/09 01:26:55
Nit: with -> to place
ltian
2016/12/15 19:02:35
Done.
| |
164 constexpr size_t kMaxRecentUrls = 3; | |
165 const size_t recentUrls = std::distance(it+1, template_urls_.end()); | |
Peter Kasting
2016/12/09 01:26:56
It's not safe to do +1 here, since |it| may alread
ltian
2016/12/15 19:02:35
Done.
| |
166 auto end = it + std::min(recentUrls, kMaxRecentUrls); | |
167 std::partial_sort(it, end, template_urls_.end(), | |
168 [](const TemplateURL* lhs, const TemplateURL* rhs) { | |
Peter Kasting
2016/12/09 01:26:55
Nit: This seems unlikely to be what git cl format
ltian
2016/12/15 19:02:35
Done.
| |
169 return lhs->last_visited() > rhs->last_visited(); | |
170 }); | |
171 | |
172 // Limit to those engines which must be visited in the last two days. | |
Peter Kasting
2016/12/09 01:26:56
Nit: Better (sorry, my original was bad): "Limit t
ltian
2016/12/15 19:02:35
Done.
| |
173 constexpr base::TimeDelta kMaxVisitAge = base::TimeDelta::FromDays(2); | |
174 const base::Time cutoff = base::Time::Now() - kMaxVisitAge; | |
175 const auto too_old = [cutoff](const TemplateURL* t_url) { | |
176 return t_url->last_visited() < cutoff; | |
157 }; | 177 }; |
158 std::sort(template_urls_.begin(), template_urls_.end(), comp); | 178 template_urls_.erase(std::find_if(it, end, too_old), template_urls_.end()); |
159 } | 179 } |
160 | 180 |
161 void TemplateUrlServiceAndroid::OnTemplateURLServiceChanged() { | 181 void TemplateUrlServiceAndroid::OnTemplateURLServiceChanged() { |
162 JNIEnv* env = base::android::AttachCurrentThread(); | 182 JNIEnv* env = base::android::AttachCurrentThread(); |
163 if (weak_java_obj_.get(env).is_null()) | 183 if (weak_java_obj_.get(env).is_null()) |
164 return; | 184 return; |
165 LoadTemplateURLs(); | 185 LoadTemplateURLs(); |
166 | 186 |
167 Java_TemplateUrlService_onTemplateURLServiceChanged(env, | 187 Java_TemplateUrlService_onTemplateURLServiceChanged(env, |
168 weak_java_obj_.get(env)); | 188 weak_java_obj_.get(env)); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
219 template_url_service_->GetDefaultSearchProvider(); | 239 template_url_service_->GetDefaultSearchProvider(); |
220 | 240 |
221 base::string16 query(base::android::ConvertJavaStringToUTF16(env, jquery)); | 241 base::string16 query(base::android::ConvertJavaStringToUTF16(env, jquery)); |
222 GURL current_url(base::android::ConvertJavaStringToUTF16(env, jcurrent_url)); | 242 GURL current_url(base::android::ConvertJavaStringToUTF16(env, jcurrent_url)); |
223 GURL destination_url(current_url); | 243 GURL destination_url(current_url); |
224 if (default_provider && !query.empty()) { | 244 if (default_provider && !query.empty()) { |
225 bool refined_query = default_provider->ReplaceSearchTermsInURL( | 245 bool refined_query = default_provider->ReplaceSearchTermsInURL( |
226 current_url, TemplateURLRef::SearchTermsArgs(query), | 246 current_url, TemplateURLRef::SearchTermsArgs(query), |
227 template_url_service_->search_terms_data(), &destination_url); | 247 template_url_service_->search_terms_data(), &destination_url); |
228 if (refined_query) | 248 if (refined_query) |
229 return base::android::ConvertUTF8ToJavaString( | 249 return base::android::ConvertUTF8ToJavaString(env, |
230 env, destination_url.spec()); | 250 destination_url.spec()); |
231 } | 251 } |
232 return base::android::ScopedJavaLocalRef<jstring>(env, NULL); | 252 return base::android::ScopedJavaLocalRef<jstring>(env, NULL); |
233 } | 253 } |
234 | 254 |
235 base::android::ScopedJavaLocalRef<jstring> | 255 base::android::ScopedJavaLocalRef<jstring> |
236 TemplateUrlServiceAndroid::GetUrlForContextualSearchQuery( | 256 TemplateUrlServiceAndroid::GetUrlForContextualSearchQuery( |
237 JNIEnv* env, | 257 JNIEnv* env, |
238 const JavaParamRef<jobject>& obj, | 258 const JavaParamRef<jobject>& obj, |
239 const JavaParamRef<jstring>& jquery, | 259 const JavaParamRef<jstring>& jquery, |
240 const JavaParamRef<jstring>& jalternate_term, | 260 const JavaParamRef<jstring>& jalternate_term, |
(...skipping 10 matching lines...) Expand all Loading... | |
251 gurl = net::AppendQueryParameter(gurl, "ctxs", protocol_version); | 271 gurl = net::AppendQueryParameter(gurl, "ctxs", protocol_version); |
252 if (jshould_prefetch) { | 272 if (jshould_prefetch) { |
253 // Indicate that the search page is being prefetched. | 273 // Indicate that the search page is being prefetched. |
254 gurl = net::AppendQueryParameter(gurl, "pf", "c"); | 274 gurl = net::AppendQueryParameter(gurl, "pf", "c"); |
255 } | 275 } |
256 | 276 |
257 if (jalternate_term) { | 277 if (jalternate_term) { |
258 std::string alternate_term( | 278 std::string alternate_term( |
259 base::android::ConvertJavaStringToUTF8(env, jalternate_term)); | 279 base::android::ConvertJavaStringToUTF8(env, jalternate_term)); |
260 if (!alternate_term.empty()) { | 280 if (!alternate_term.empty()) { |
261 gurl = net::AppendQueryParameter( | 281 gurl = net::AppendQueryParameter(gurl, "ctxsl_alternate_term", |
262 gurl, "ctxsl_alternate_term", alternate_term); | 282 alternate_term); |
263 } | 283 } |
264 } | 284 } |
265 } | 285 } |
266 url = gurl.spec(); | 286 url = gurl.spec(); |
267 } | 287 } |
268 | 288 |
269 return base::android::ConvertUTF8ToJavaString(env, url); | 289 return base::android::ConvertUTF8ToJavaString(env, url); |
270 } | 290 } |
271 | 291 |
272 base::android::ScopedJavaLocalRef<jstring> | 292 base::android::ScopedJavaLocalRef<jstring> |
(...skipping 14 matching lines...) Expand all Loading... | |
287 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 307 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
288 TemplateUrlServiceAndroid* template_url_service_android = | 308 TemplateUrlServiceAndroid* template_url_service_android = |
289 new TemplateUrlServiceAndroid(env, obj); | 309 new TemplateUrlServiceAndroid(env, obj); |
290 return reinterpret_cast<intptr_t>(template_url_service_android); | 310 return reinterpret_cast<intptr_t>(template_url_service_android); |
291 } | 311 } |
292 | 312 |
293 // static | 313 // static |
294 bool TemplateUrlServiceAndroid::Register(JNIEnv* env) { | 314 bool TemplateUrlServiceAndroid::Register(JNIEnv* env) { |
295 return RegisterNativesImpl(env); | 315 return RegisterNativesImpl(env); |
296 } | 316 } |
OLD | NEW |