Chromium Code Reviews| 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 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 136 if (weak_java_obj_.get(env).is_null()) | 136 if (weak_java_obj_.get(env).is_null()) |
| 137 return; | 137 return; |
| 138 LoadTemplateURLs(); | 138 LoadTemplateURLs(); |
| 139 | 139 |
| 140 Java_TemplateUrlService_templateUrlServiceLoaded(env, | 140 Java_TemplateUrlService_templateUrlServiceLoaded(env, |
| 141 weak_java_obj_.get(env)); | 141 weak_java_obj_.get(env)); |
| 142 } | 142 } |
| 143 | 143 |
| 144 void TemplateUrlServiceAndroid::LoadTemplateURLs() { | 144 void TemplateUrlServiceAndroid::LoadTemplateURLs() { |
| 145 template_urls_ = template_url_service_->GetTemplateURLs(); | 145 template_urls_ = template_url_service_->GetTemplateURLs(); |
| 146 TemplateURL* default_search_provider = | |
| 147 template_url_service_->GetDefaultSearchProvider(); | |
| 148 | 146 |
| 149 auto comp = [&](const TemplateURL* lhs, const TemplateURL* rhs) { | 147 // Move prepopulated and policy-created engines to the front of list, |
| 150 bool rhs_prepopulated = | 148 // and sort by prepopulated_id. |
| 151 template_url_service_->IsPrepopulatedOrCreatedByPolicy(rhs); | 149 TemplateURLService* template_url_service = template_url_service_; |
| 152 if (template_url_service_->IsPrepopulatedOrCreatedByPolicy(lhs)) { | 150 auto it = std::partition( |
| 153 return !rhs_prepopulated || | 151 template_urls_.begin(), template_urls_.end(), |
| 154 (lhs->prepopulate_id() < rhs->prepopulate_id()); | 152 [template_url_service](const TemplateURL* t_url) { |
| 155 } | 153 return template_url_service->IsPrepopulatedOrCreatedByPolicy(t_url); |
| 156 return (lhs == default_search_provider && !rhs_prepopulated); | 154 }); |
| 155 std::sort(template_urls_.begin(), it, | |
| 156 [](const TemplateURL* lhs, const TemplateURL* rhs) { | |
| 157 return lhs->prepopulate_id() < rhs->prepopulate_id(); | |
| 158 }); | |
| 159 | |
| 160 // Place any user-selected default engine next. | |
| 161 TemplateURL* dsp = template_url_service_->GetDefaultSearchProvider(); | |
| 162 it = std::partition(it, template_urls_.end(), | |
| 163 [dsp](const TemplateURL* t_url) { return t_url == dsp; }); | |
| 164 | |
| 165 // Sort the remaining engines to place the three most recently-visited first. | |
| 166 constexpr size_t kMaxRecentUrls = 3; | |
| 167 const size_t recent_url_num = template_urls_.end() - it; | |
| 168 auto end = it + std::min(recent_url_num, kMaxRecentUrls); | |
| 169 std::partial_sort(it, end, template_urls_.end(), | |
| 170 [](const TemplateURL* lhs, const TemplateURL* rhs) { | |
| 171 return lhs->last_visited() > rhs->last_visited(); | |
| 172 }); | |
| 173 | |
| 174 // Limit to those three engines which must also have been visited in the last | |
|
Peter Kasting
2016/12/16 08:37:18
Nit: Comma after "engines", or the sentence implie
| |
| 175 // two days. | |
| 176 constexpr base::TimeDelta kMaxVisitAge = base::TimeDelta::FromDays(2); | |
| 177 const base::Time cutoff = base::Time::Now() - kMaxVisitAge; | |
| 178 const auto too_old = [cutoff](const TemplateURL* t_url) { | |
| 179 return t_url->last_visited() < cutoff; | |
| 157 }; | 180 }; |
| 158 std::sort(template_urls_.begin(), template_urls_.end(), comp); | 181 template_urls_.erase(std::find_if(it, end, too_old), template_urls_.end()); |
| 159 } | 182 } |
| 160 | 183 |
| 161 void TemplateUrlServiceAndroid::OnTemplateURLServiceChanged() { | 184 void TemplateUrlServiceAndroid::OnTemplateURLServiceChanged() { |
| 162 JNIEnv* env = base::android::AttachCurrentThread(); | 185 JNIEnv* env = base::android::AttachCurrentThread(); |
| 163 if (weak_java_obj_.get(env).is_null()) | 186 if (weak_java_obj_.get(env).is_null()) |
| 164 return; | 187 return; |
| 165 LoadTemplateURLs(); | 188 LoadTemplateURLs(); |
| 166 | 189 |
| 167 Java_TemplateUrlService_onTemplateURLServiceChanged(env, | 190 Java_TemplateUrlService_onTemplateURLServiceChanged(env, |
| 168 weak_java_obj_.get(env)); | 191 weak_java_obj_.get(env)); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 277 base::string16 keyword = | 300 base::string16 keyword = |
| 278 base::android::ConvertJavaStringToUTF16(env, jkeyword); | 301 base::android::ConvertJavaStringToUTF16(env, jkeyword); |
| 279 TemplateURL* template_url = | 302 TemplateURL* template_url = |
| 280 template_url_service_->GetTemplateURLForKeyword(keyword); | 303 template_url_service_->GetTemplateURLForKeyword(keyword); |
| 281 std::string url(template_url->url_ref().ReplaceSearchTerms( | 304 std::string url(template_url->url_ref().ReplaceSearchTerms( |
| 282 TemplateURLRef::SearchTermsArgs(base::ASCIIToUTF16("query")), | 305 TemplateURLRef::SearchTermsArgs(base::ASCIIToUTF16("query")), |
| 283 template_url_service_->search_terms_data())); | 306 template_url_service_->search_terms_data())); |
| 284 return base::android::ConvertUTF8ToJavaString(env, url); | 307 return base::android::ConvertUTF8ToJavaString(env, url); |
| 285 } | 308 } |
| 286 | 309 |
| 310 base::android::ScopedJavaLocalRef<jstring> | |
| 311 TemplateUrlServiceAndroid::AddSearchEngineForTesting( | |
| 312 JNIEnv* env, | |
| 313 const base::android::JavaParamRef<jobject>& obj, | |
| 314 const base::android::JavaParamRef<jstring>& jkeyword, | |
| 315 jint offset) { | |
| 316 TemplateURLData data; | |
| 317 base::string16 keyword = | |
| 318 base::android::ConvertJavaStringToUTF16(env, jkeyword); | |
| 319 data.SetShortName(keyword); | |
| 320 data.SetKeyword(keyword); | |
| 321 data.SetURL("http://testurl"); | |
| 322 data.favicon_url = GURL("http://favicon.url"); | |
|
Peter Kasting
2016/12/16 08:37:18
Nit: Why a dot here, but not in "testurl"? It mak
| |
| 323 data.safe_for_autoreplace = true; | |
| 324 data.input_encodings.push_back("UTF-8"); | |
| 325 data.prepopulate_id = 0; | |
| 326 data.date_created = | |
| 327 base::Time::Now() - base::TimeDelta::FromDays((int)offset); | |
|
Ted C
2016/12/15 21:38:06
space between (int) and offset (and below).
Also,
ltian
2016/12/15 22:56:54
Done.
Peter Kasting
2016/12/16 08:37:18
Don't compute Now() - TimeDelta three times. This
| |
| 328 data.last_modified = | |
| 329 base::Time::Now() - base::TimeDelta::FromDays((int)offset); | |
| 330 data.last_visited = | |
| 331 base::Time::Now() - base::TimeDelta::FromDays((int)offset); | |
| 332 TemplateURL* t_url = | |
| 333 template_url_service_->Add(base::MakeUnique<TemplateURL>(data)); | |
| 334 return base::android::ConvertUTF16ToJavaString(env, t_url->data().keyword()); | |
| 335 } | |
| 336 | |
| 337 base::android::ScopedJavaLocalRef<jstring> | |
| 338 TemplateUrlServiceAndroid::UpdateLastVisitedForTesting( | |
| 339 JNIEnv* env, | |
| 340 const base::android::JavaParamRef<jobject>& obj, | |
| 341 const base::android::JavaParamRef<jstring>& jkeyword) { | |
| 342 base::string16 keyword = | |
| 343 base::android::ConvertJavaStringToUTF16(env, jkeyword); | |
| 344 TemplateURL* t_url = template_url_service_->GetTemplateURLForKeyword(keyword); | |
| 345 template_url_service_->UpdateTemplateURLVisitTime(t_url); | |
| 346 return base::android::ConvertUTF16ToJavaString(env, t_url->data().keyword()); | |
| 347 } | |
| 348 | |
| 287 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 349 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
| 288 TemplateUrlServiceAndroid* template_url_service_android = | 350 TemplateUrlServiceAndroid* template_url_service_android = |
| 289 new TemplateUrlServiceAndroid(env, obj); | 351 new TemplateUrlServiceAndroid(env, obj); |
| 290 return reinterpret_cast<intptr_t>(template_url_service_android); | 352 return reinterpret_cast<intptr_t>(template_url_service_android); |
| 291 } | 353 } |
| 292 | 354 |
| 293 // static | 355 // static |
| 294 bool TemplateUrlServiceAndroid::Register(JNIEnv* env) { | 356 bool TemplateUrlServiceAndroid::Register(JNIEnv* env) { |
| 295 return RegisterNativesImpl(env); | 357 return RegisterNativesImpl(env); |
| 296 } | 358 } |
| OLD | NEW |