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

Side by Side Diff: chrome/browser/search_engines/template_url_service_android.cc

Issue 2367373003: [Android] Allow setting recently visited search engines as default search engine (Closed)
Patch Set: Reorganize template_url_serivce_android code. 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 class TemplateUrlTypeCompareFunctor {
36 public:
37 TemplateUrlTypeCompareFunctor(TemplateURLService* template_url_service,
38 TemplateURL* default_search_provider)
39 : template_url_service(template_url_service),
40 default_search_provider(default_search_provider) {}
41
42 ~TemplateUrlTypeCompareFunctor() {}
43
44 // Sorts TemplateURL list that prepopulated search engines come before
45 // custom search engines. For prepopulated search engines, sorts by
46 // |prepopulate_id| ascendingly. For custom search engines, sort so that
47 // default search engine shows first.
48 bool operator()(const TemplateURL* lhs, const TemplateURL* rhs) {
49 if (template_url_service->ShowInPrepopulatedList(lhs)) {
50 if (template_url_service->ShowInPrepopulatedList(rhs)) {
51 return lhs->prepopulate_id() < rhs->prepopulate_id();
52 } else {
53 return true;
54 }
Peter Kasting 2016/11/23 21:30:27 Nit: Shorter: return !template_url_service-
ltian 2016/11/29 02:44:02 Done.
55 } else if (lhs == default_search_provider &&
Peter Kasting 2016/11/23 21:30:27 Nit: Shorter: } return (lhs == default_se
ltian 2016/11/29 02:44:02 Done.
56 !template_url_service->ShowInPrepopulatedList(rhs)) {
57 return true;
58 } else {
59 return false;
60 }
61 }
62
63 private:
64 TemplateURLService* template_url_service;
65 TemplateURL* default_search_provider;
66 };
67
35 TemplateUrlServiceAndroid::TemplateUrlServiceAndroid(JNIEnv* env, 68 TemplateUrlServiceAndroid::TemplateUrlServiceAndroid(JNIEnv* env,
36 jobject obj) 69 jobject obj)
37 : weak_java_obj_(env, obj), 70 : weak_java_obj_(env, obj),
38 template_url_service_( 71 template_url_service_(
39 TemplateURLServiceFactory::GetForProfile(GetOriginalProfile())) { 72 TemplateURLServiceFactory::GetForProfile(GetOriginalProfile())) {
40 template_url_subscription_ = 73 template_url_subscription_ =
41 template_url_service_->RegisterOnLoadedCallback( 74 template_url_service_->RegisterOnLoadedCallback(
42 base::Bind(&TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded, 75 base::Bind(&TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded,
43 base::Unretained(this))); 76 base::Unretained(this)));
44 template_url_service_->AddObserver(this); 77 template_url_service_->AddObserver(this);
45 } 78 }
46 79
47 TemplateUrlServiceAndroid::~TemplateUrlServiceAndroid() { 80 TemplateUrlServiceAndroid::~TemplateUrlServiceAndroid() {
48 template_url_service_->RemoveObserver(this); 81 template_url_service_->RemoveObserver(this);
49 } 82 }
50 83
51 void TemplateUrlServiceAndroid::Load(JNIEnv* env, 84 void TemplateUrlServiceAndroid::Load(JNIEnv* env,
52 const JavaParamRef<jobject>& obj) { 85 const JavaParamRef<jobject>& obj) {
53 template_url_service_->Load(); 86 template_url_service_->Load();
54 } 87 }
55 88
56 void TemplateUrlServiceAndroid::SetUserSelectedDefaultSearchProvider( 89 void TemplateUrlServiceAndroid::SetUserSelectedDefaultSearchProvider(
57 JNIEnv* env, 90 JNIEnv* env,
58 const JavaParamRef<jobject>& obj, 91 const JavaParamRef<jobject>& obj,
59 jint selected_index) { 92 const JavaParamRef<jstring>& jkeyword) {
60 std::vector<TemplateURL*> template_urls = 93 base::string16 keyword(
61 template_url_service_->GetTemplateURLs(); 94 base::android::ConvertJavaStringToUTF16(env, jkeyword));
62 size_t selected_index_size_t = static_cast<size_t>(selected_index); 95 TemplateURL* template_url =
63 DCHECK_LT(selected_index_size_t, template_urls.size()) << 96 template_url_service_->GetTemplateURLForKeyword(keyword);
64 "Wrong index for search engine";
65
66 TemplateURL* template_url = template_urls[selected_index_size_t];
67 template_url_service_->SetUserSelectedDefaultSearchProvider(template_url); 97 template_url_service_->SetUserSelectedDefaultSearchProvider(template_url);
68 } 98 }
69 99
70 jint TemplateUrlServiceAndroid::GetDefaultSearchProvider( 100 jint TemplateUrlServiceAndroid::GetDefaultSearchProviderIndex(
71 JNIEnv* env, 101 JNIEnv* env,
72 const JavaParamRef<jobject>& obj) { 102 const base::android::JavaParamRef<jobject>& obj) const {
73 std::vector<TemplateURL*> template_urls = 103 return default_search_provider_index_;
74 template_url_service_->GetTemplateURLs();
75 TemplateURL* default_search_provider =
76 template_url_service_->GetDefaultSearchProvider();
77 for (size_t i = 0; i < template_urls.size(); ++i) {
78 if (default_search_provider == template_urls[i])
79 return i;
80 }
81 return -1;
82 } 104 }
83 105
84 jboolean TemplateUrlServiceAndroid::IsLoaded(JNIEnv* env, 106 jboolean TemplateUrlServiceAndroid::IsLoaded(JNIEnv* env,
85 const JavaParamRef<jobject>& obj) { 107 const JavaParamRef<jobject>& obj) {
108 if (template_url_service_->loaded() && template_urls_.size() == 0) {
109 LoadTemplateURLs();
Peter Kasting 2016/11/23 21:30:27 It seems like we shouldn't put this here. If the
ltian 2016/11/29 02:44:03 Done.
110 }
86 return template_url_service_->loaded(); 111 return template_url_service_->loaded();
87 } 112 }
88 113
89 jint TemplateUrlServiceAndroid::GetTemplateUrlCount( 114 jint TemplateUrlServiceAndroid::GetTemplateUrlCount(
90 JNIEnv* env, 115 JNIEnv* env,
91 const JavaParamRef<jobject>& obj) { 116 const JavaParamRef<jobject>& obj) const {
92 return template_url_service_->GetTemplateURLs().size(); 117 return template_urls_.size();
93 } 118 }
94 119
95 jboolean TemplateUrlServiceAndroid::IsSearchProviderManaged( 120 jboolean TemplateUrlServiceAndroid::IsSearchProviderManaged(
96 JNIEnv* env, 121 JNIEnv* env,
97 const JavaParamRef<jobject>& obj) { 122 const JavaParamRef<jobject>& obj) {
98 return template_url_service_->is_default_search_managed(); 123 return template_url_service_->is_default_search_managed();
99 } 124 }
100 125
101 jboolean TemplateUrlServiceAndroid::IsSearchByImageAvailable( 126 jboolean TemplateUrlServiceAndroid::IsSearchByImageAvailable(
102 JNIEnv* env, 127 JNIEnv* env,
(...skipping 12 matching lines...) Expand all
115 TemplateURL* default_search_provider = 140 TemplateURL* default_search_provider =
116 template_url_service_->GetDefaultSearchProvider(); 141 template_url_service_->GetDefaultSearchProvider();
117 return default_search_provider && 142 return default_search_provider &&
118 default_search_provider->url_ref().HasGoogleBaseURLs( 143 default_search_provider->url_ref().HasGoogleBaseURLs(
119 template_url_service_->search_terms_data()); 144 template_url_service_->search_terms_data());
120 } 145 }
121 146
122 base::android::ScopedJavaLocalRef<jobject> 147 base::android::ScopedJavaLocalRef<jobject>
123 TemplateUrlServiceAndroid::GetTemplateUrlAt(JNIEnv* env, 148 TemplateUrlServiceAndroid::GetTemplateUrlAt(JNIEnv* env,
124 const JavaParamRef<jobject>& obj, 149 const JavaParamRef<jobject>& obj,
125 jint index) { 150 jint index) const {
126 TemplateURL* template_url = template_url_service_->GetTemplateURLs()[index]; 151 TemplateURL* template_url = template_urls_[index];
152 if (!template_url)
Peter Kasting 2016/11/23 21:30:27 When can this be true? It seems like the list of
ltian 2016/11/29 02:44:03 Done.
153 return nullptr;
127 return Java_TemplateUrl_create( 154 return Java_TemplateUrl_create(
128 env, index, 155 env, index,
129 base::android::ConvertUTF16ToJavaString(env, template_url->short_name()), 156 base::android::ConvertUTF16ToJavaString(env, template_url->short_name()),
130 IsPrepopulatedTemplate(template_url) || 157 base::android::ConvertUTF8ToJavaString(env, template_url->url()),
131 template_url->created_by_policy()); 158 template_url_service_->ShowInPrepopulatedList(template_url),
132 } 159 base::android::ConvertUTF16ToJavaString(env, template_url->keyword()));
133
134 bool TemplateUrlServiceAndroid::IsPrepopulatedTemplate(TemplateURL* url) {
135 return url->prepopulate_id() > 0;
136 } 160 }
137 161
138 void TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded() { 162 void TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded() {
139 template_url_subscription_.reset(); 163 template_url_subscription_.reset();
140 JNIEnv* env = base::android::AttachCurrentThread(); 164 JNIEnv* env = base::android::AttachCurrentThread();
141 if (weak_java_obj_.get(env).is_null()) 165 if (weak_java_obj_.get(env).is_null())
142 return; 166 return;
167 LoadTemplateURLs();
143 168
144 Java_TemplateUrlService_templateUrlServiceLoaded(env, 169 Java_TemplateUrlService_templateUrlServiceLoaded(env,
145 weak_java_obj_.get(env)); 170 weak_java_obj_.get(env));
146 } 171 }
147 172
173 void TemplateUrlServiceAndroid::LoadTemplateURLs() {
174 default_search_provider_index_ = -1;
175 template_urls_.clear();
176
177 template_urls_ = template_url_service_->GetTemplateURLs();
178 TemplateURL* default_search_provider =
179 template_url_service_->GetDefaultSearchProvider();
180
181 std::sort(template_urls_.begin(), template_urls_.end(),
182 TemplateUrlTypeCompareFunctor(template_url_service_,
183 default_search_provider));
184
185 for (size_t i = 0; i < template_urls_.size(); ++i) {
186 if (default_search_provider == template_urls_[i]) {
187 default_search_provider_index_ = i;
188 }
189 }
Peter Kasting 2016/11/23 21:30:27 Nit: More efficient, and allows removing the init
ltian 2016/11/29 02:44:02 That is really a great way to do this. Thanks for
190 }
191
148 void TemplateUrlServiceAndroid::OnTemplateURLServiceChanged() { 192 void TemplateUrlServiceAndroid::OnTemplateURLServiceChanged() {
149 JNIEnv* env = base::android::AttachCurrentThread(); 193 JNIEnv* env = base::android::AttachCurrentThread();
150 if (weak_java_obj_.get(env).is_null()) 194 if (weak_java_obj_.get(env).is_null())
151 return; 195 return;
196 LoadTemplateURLs();
152 197
153 Java_TemplateUrlService_onTemplateURLServiceChanged(env, 198 Java_TemplateUrlService_onTemplateURLServiceChanged(env,
154 weak_java_obj_.get(env)); 199 weak_java_obj_.get(env));
155 } 200 }
156 201
157 base::android::ScopedJavaLocalRef<jstring> 202 base::android::ScopedJavaLocalRef<jstring>
158 TemplateUrlServiceAndroid::GetUrlForSearchQuery( 203 TemplateUrlServiceAndroid::GetUrlForSearchQuery(
159 JNIEnv* env, 204 JNIEnv* env,
160 const JavaParamRef<jobject>& obj, 205 const JavaParamRef<jobject>& obj,
161 const JavaParamRef<jstring>& jquery) { 206 const JavaParamRef<jstring>& jquery) {
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 url = gurl.spec(); 297 url = gurl.spec();
253 } 298 }
254 299
255 return base::android::ConvertUTF8ToJavaString(env, url); 300 return base::android::ConvertUTF8ToJavaString(env, url);
256 } 301 }
257 302
258 base::android::ScopedJavaLocalRef<jstring> 303 base::android::ScopedJavaLocalRef<jstring>
259 TemplateUrlServiceAndroid::GetSearchEngineUrlFromTemplateUrl( 304 TemplateUrlServiceAndroid::GetSearchEngineUrlFromTemplateUrl(
260 JNIEnv* env, 305 JNIEnv* env,
261 const JavaParamRef<jobject>& obj, 306 const JavaParamRef<jobject>& obj,
262 jint index) { 307 const JavaParamRef<jstring>& jkeyword) {
263 TemplateURL* template_url = template_url_service_->GetTemplateURLs()[index]; 308 base::string16 keyword =
309 base::android::ConvertJavaStringToUTF16(env, jkeyword);
310 TemplateURL* template_url =
311 template_url_service_->GetTemplateURLForKeyword(keyword);
264 std::string url(template_url->url_ref().ReplaceSearchTerms( 312 std::string url(template_url->url_ref().ReplaceSearchTerms(
265 TemplateURLRef::SearchTermsArgs(base::ASCIIToUTF16("query")), 313 TemplateURLRef::SearchTermsArgs(base::ASCIIToUTF16("query")),
266 template_url_service_->search_terms_data())); 314 template_url_service_->search_terms_data()));
267 return base::android::ConvertUTF8ToJavaString(env, url); 315 return base::android::ConvertUTF8ToJavaString(env, url);
268 } 316 }
269 317
270 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { 318 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) {
271 TemplateUrlServiceAndroid* template_url_service_android = 319 TemplateUrlServiceAndroid* template_url_service_android =
272 new TemplateUrlServiceAndroid(env, obj); 320 new TemplateUrlServiceAndroid(env, obj);
273 return reinterpret_cast<intptr_t>(template_url_service_android); 321 return reinterpret_cast<intptr_t>(template_url_service_android);
274 } 322 }
275 323
276 // static 324 // static
277 bool TemplateUrlServiceAndroid::Register(JNIEnv* env) { 325 bool TemplateUrlServiceAndroid::Register(JNIEnv* env) {
278 return RegisterNativesImpl(env); 326 return RegisterNativesImpl(env);
279 } 327 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698