Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Unified Diff: chrome/browser/search_engines/template_url_service_android.cc

Issue 2555513003: [Android] Sort custom search engines based on last visited time and display only top 3 most recentl… (Closed)
Patch Set: Fix the conflicts Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..c3c9add75cae816cd8e65c6cc23ea25e2f34268e 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
+ // 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 age_in_days) {
+ 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");
+ 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) age_in_days);
+ data.last_modified =
+ base::Time::Now() - base::TimeDelta::FromDays((int) age_in_days);
+ data.last_visited =
+ base::Time::Now() - base::TimeDelta::FromDays((int) age_in_days);
+ 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);
« no previous file with comments | « chrome/browser/search_engines/template_url_service_android.h ('k') | components/search_engines/template_url_service.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698