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

Side by Side 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: Add unittests for changes. 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 unified diff | Download patch
OLDNEW
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698