Chromium Code Reviews| Index: chrome/browser/search_engines/template_url_service_android.cc |
| diff --git a/chrome/browser/search_engines/template_url_service_android.cc b/chrome/browser/search_engines/template_url_service_android.cc |
| index 306cd44c2130303ba5a742eaabe1db46d58d08b0..5bb745e3e14c8e817b6e6dc017c80204511c44c4 100644 |
| --- a/chrome/browser/search_engines/template_url_service_android.cc |
| +++ b/chrome/browser/search_engines/template_url_service_android.cc |
| @@ -143,19 +143,42 @@ void TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded() { |
| void TemplateUrlServiceAndroid::LoadTemplateURLs() { |
| template_urls_ = template_url_service_->GetTemplateURLs(); |
| - TemplateURL* default_search_provider = |
| - template_url_service_->GetDefaultSearchProvider(); |
| - auto comp = [&](const TemplateURL* lhs, const TemplateURL* rhs) { |
| - bool rhs_prepopulated = |
| - template_url_service_->IsPrepopulatedOrCreatedByPolicy(rhs); |
| - if (template_url_service_->IsPrepopulatedOrCreatedByPolicy(lhs)) { |
| - return !rhs_prepopulated || |
| - (lhs->prepopulate_id() < rhs->prepopulate_id()); |
| - } |
| - return (lhs == default_search_provider && !rhs_prepopulated); |
| + // Move prepopulated and policy-created engines to the front of list, |
| + // and sort by prepopulated_id. |
| + TemplateURLService* template_url_service = template_url_service_; |
| + auto it = std::partition( |
| + template_urls_.begin(), template_urls_.end(), |
| + [template_url_service](const TemplateURL* t_url) { |
| + return template_url_service->IsPrepopulatedOrCreatedByPolicy(t_url); |
| + }); |
| + std::sort(template_urls_.begin(), it, |
| + [](const TemplateURL* lhs, const TemplateURL* rhs) { |
| + return lhs->prepopulate_id() < rhs->prepopulate_id(); |
| + }); |
| + |
| + // Place any user-selected default engine next. |
| + TemplateURL* dsp = template_url_service_->GetDefaultSearchProvider(); |
| + it = std::partition(it, template_urls_.end(), |
| + [dsp](const TemplateURL* t_url) { return t_url == dsp; }); |
| + |
| + // Sort the remaining engines to place the three most recently-visited first. |
| + constexpr size_t kMaxRecentUrls = 3; |
| + const size_t recent_url_num = template_urls_.end() - it; |
| + auto end = it + std::min(recent_url_num, kMaxRecentUrls); |
| + std::partial_sort(it, end, template_urls_.end(), |
| + [](const TemplateURL* lhs, const TemplateURL* rhs) { |
| + return lhs->last_visited() > rhs->last_visited(); |
| + }); |
| + |
| + // 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
|
| + // two days. |
| + constexpr base::TimeDelta kMaxVisitAge = base::TimeDelta::FromDays(2); |
| + const base::Time cutoff = base::Time::Now() - kMaxVisitAge; |
| + const auto too_old = [cutoff](const TemplateURL* t_url) { |
| + return t_url->last_visited() < cutoff; |
| }; |
| - std::sort(template_urls_.begin(), template_urls_.end(), comp); |
| + template_urls_.erase(std::find_if(it, end, too_old), template_urls_.end()); |
| } |
| void TemplateUrlServiceAndroid::OnTemplateURLServiceChanged() { |
| @@ -284,6 +307,45 @@ TemplateUrlServiceAndroid::GetSearchEngineUrlFromTemplateUrl( |
| return base::android::ConvertUTF8ToJavaString(env, url); |
| } |
| +base::android::ScopedJavaLocalRef<jstring> |
| +TemplateUrlServiceAndroid::AddSearchEngineForTesting( |
| + JNIEnv* env, |
| + const base::android::JavaParamRef<jobject>& obj, |
| + const base::android::JavaParamRef<jstring>& jkeyword, |
| + jint offset) { |
| + TemplateURLData data; |
| + base::string16 keyword = |
| + base::android::ConvertJavaStringToUTF16(env, jkeyword); |
| + data.SetShortName(keyword); |
| + data.SetKeyword(keyword); |
| + data.SetURL("http://testurl"); |
| + 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
|
| + data.safe_for_autoreplace = true; |
| + data.input_encodings.push_back("UTF-8"); |
| + data.prepopulate_id = 0; |
| + data.date_created = |
| + 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
|
| + data.last_modified = |
| + base::Time::Now() - base::TimeDelta::FromDays((int)offset); |
| + data.last_visited = |
| + base::Time::Now() - base::TimeDelta::FromDays((int)offset); |
| + TemplateURL* t_url = |
| + template_url_service_->Add(base::MakeUnique<TemplateURL>(data)); |
| + return base::android::ConvertUTF16ToJavaString(env, t_url->data().keyword()); |
| +} |
| + |
| +base::android::ScopedJavaLocalRef<jstring> |
| +TemplateUrlServiceAndroid::UpdateLastVisitedForTesting( |
| + JNIEnv* env, |
| + const base::android::JavaParamRef<jobject>& obj, |
| + const base::android::JavaParamRef<jstring>& jkeyword) { |
| + base::string16 keyword = |
| + base::android::ConvertJavaStringToUTF16(env, jkeyword); |
| + TemplateURL* t_url = template_url_service_->GetTemplateURLForKeyword(keyword); |
| + template_url_service_->UpdateTemplateURLVisitTime(t_url); |
| + return base::android::ConvertUTF16ToJavaString(env, t_url->data().keyword()); |
| +} |
| + |
| static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
| TemplateUrlServiceAndroid* template_url_service_android = |
| new TemplateUrlServiceAndroid(env, obj); |