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

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: Update based on Peter's comment. 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 14 matching lines...) Expand all
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
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
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
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
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 }
OLDNEW
« 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