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

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: Update based on Peter and Dan's comments. 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 24 matching lines...) Expand all
35 TemplateUrlServiceAndroid::TemplateUrlServiceAndroid(JNIEnv* env, 35 TemplateUrlServiceAndroid::TemplateUrlServiceAndroid(JNIEnv* env,
36 jobject obj) 36 jobject obj)
37 : weak_java_obj_(env, obj), 37 : weak_java_obj_(env, obj),
38 template_url_service_( 38 template_url_service_(
39 TemplateURLServiceFactory::GetForProfile(GetOriginalProfile())) { 39 TemplateURLServiceFactory::GetForProfile(GetOriginalProfile())) {
40 template_url_subscription_ = 40 template_url_subscription_ =
41 template_url_service_->RegisterOnLoadedCallback( 41 template_url_service_->RegisterOnLoadedCallback(
42 base::Bind(&TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded, 42 base::Bind(&TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded,
43 base::Unretained(this))); 43 base::Unretained(this)));
44 template_url_service_->AddObserver(this); 44 template_url_service_->AddObserver(this);
45 if (template_url_service_->loaded() && template_urls_.empty())
46 LoadTemplateURLs();
45 } 47 }
46 48
47 TemplateUrlServiceAndroid::~TemplateUrlServiceAndroid() { 49 TemplateUrlServiceAndroid::~TemplateUrlServiceAndroid() {
48 template_url_service_->RemoveObserver(this); 50 template_url_service_->RemoveObserver(this);
49 } 51 }
50 52
51 void TemplateUrlServiceAndroid::Load(JNIEnv* env, 53 void TemplateUrlServiceAndroid::Load(JNIEnv* env,
52 const JavaParamRef<jobject>& obj) { 54 const JavaParamRef<jobject>& obj) {
53 template_url_service_->Load(); 55 template_url_service_->Load();
54 } 56 }
55 57
56 void TemplateUrlServiceAndroid::SetUserSelectedDefaultSearchProvider( 58 void TemplateUrlServiceAndroid::SetUserSelectedDefaultSearchProvider(
57 JNIEnv* env, 59 JNIEnv* env,
58 const JavaParamRef<jobject>& obj, 60 const JavaParamRef<jobject>& obj,
59 jint selected_index) { 61 const JavaParamRef<jstring>& jkeyword) {
60 std::vector<TemplateURL*> template_urls = 62 base::string16 keyword(
61 template_url_service_->GetTemplateURLs(); 63 base::android::ConvertJavaStringToUTF16(env, jkeyword));
62 size_t selected_index_size_t = static_cast<size_t>(selected_index); 64 TemplateURL* template_url =
63 DCHECK_LT(selected_index_size_t, template_urls.size()) << 65 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); 66 template_url_service_->SetUserSelectedDefaultSearchProvider(template_url);
68 } 67 }
69 68
70 jint TemplateUrlServiceAndroid::GetDefaultSearchProvider( 69 jint TemplateUrlServiceAndroid::GetDefaultSearchProviderIndex(
71 JNIEnv* env, 70 JNIEnv* env,
72 const JavaParamRef<jobject>& obj) { 71 const base::android::JavaParamRef<jobject>& obj) const {
73 std::vector<TemplateURL*> template_urls =
74 template_url_service_->GetTemplateURLs();
75 TemplateURL* default_search_provider = 72 TemplateURL* default_search_provider =
76 template_url_service_->GetDefaultSearchProvider(); 73 template_url_service_->GetDefaultSearchProvider();
77 for (size_t i = 0; i < template_urls.size(); ++i) { 74 auto it = std::find(template_urls_.begin(), template_urls_.end(),
78 if (default_search_provider == template_urls[i]) 75 default_search_provider);
79 return i; 76 size_t default_search_provider_index_ =
80 } 77 (it == template_urls_.end()) ? -1 : (it - template_urls_.begin());
81 return -1; 78 return default_search_provider_index_;
82 } 79 }
83 80
84 jboolean TemplateUrlServiceAndroid::IsLoaded(JNIEnv* env, 81 jboolean TemplateUrlServiceAndroid::IsLoaded(
85 const JavaParamRef<jobject>& obj) { 82 JNIEnv* env,
83 const JavaParamRef<jobject>& obj) const {
86 return template_url_service_->loaded(); 84 return template_url_service_->loaded();
87 } 85 }
88 86
89 jint TemplateUrlServiceAndroid::GetTemplateUrlCount( 87 jint TemplateUrlServiceAndroid::GetTemplateUrlCount(
90 JNIEnv* env, 88 JNIEnv* env,
91 const JavaParamRef<jobject>& obj) { 89 const JavaParamRef<jobject>& obj) const {
92 return template_url_service_->GetTemplateURLs().size(); 90 return template_urls_.size();
93 } 91 }
94 92
95 jboolean TemplateUrlServiceAndroid::IsSearchProviderManaged( 93 jboolean TemplateUrlServiceAndroid::IsSearchProviderManaged(
96 JNIEnv* env, 94 JNIEnv* env,
97 const JavaParamRef<jobject>& obj) { 95 const JavaParamRef<jobject>& obj) {
98 return template_url_service_->is_default_search_managed(); 96 return template_url_service_->is_default_search_managed();
99 } 97 }
100 98
101 jboolean TemplateUrlServiceAndroid::IsSearchByImageAvailable( 99 jboolean TemplateUrlServiceAndroid::IsSearchByImageAvailable(
102 JNIEnv* env, 100 JNIEnv* env,
(...skipping 12 matching lines...) Expand all
115 TemplateURL* default_search_provider = 113 TemplateURL* default_search_provider =
116 template_url_service_->GetDefaultSearchProvider(); 114 template_url_service_->GetDefaultSearchProvider();
117 return default_search_provider && 115 return default_search_provider &&
118 default_search_provider->url_ref().HasGoogleBaseURLs( 116 default_search_provider->url_ref().HasGoogleBaseURLs(
119 template_url_service_->search_terms_data()); 117 template_url_service_->search_terms_data());
120 } 118 }
121 119
122 base::android::ScopedJavaLocalRef<jobject> 120 base::android::ScopedJavaLocalRef<jobject>
123 TemplateUrlServiceAndroid::GetTemplateUrlAt(JNIEnv* env, 121 TemplateUrlServiceAndroid::GetTemplateUrlAt(JNIEnv* env,
124 const JavaParamRef<jobject>& obj, 122 const JavaParamRef<jobject>& obj,
125 jint index) { 123 jint index) const {
126 TemplateURL* template_url = template_url_service_->GetTemplateURLs()[index]; 124 TemplateURL* template_url = template_urls_[index];
127 return Java_TemplateUrl_create( 125 return Java_TemplateUrl_create(
128 env, index, 126 env, index,
129 base::android::ConvertUTF16ToJavaString(env, template_url->short_name()), 127 base::android::ConvertUTF16ToJavaString(env, template_url->short_name()),
130 IsPrepopulatedTemplate(template_url) || 128 base::android::ConvertUTF8ToJavaString(env, template_url->url()),
131 template_url->created_by_policy()); 129 template_url_service_->IsPrepopulatedOrCreatedByPolicy(template_url),
132 } 130 base::android::ConvertUTF16ToJavaString(env, template_url->keyword()));
133
134 bool TemplateUrlServiceAndroid::IsPrepopulatedTemplate(TemplateURL* url) {
135 return url->prepopulate_id() > 0;
136 } 131 }
137 132
138 void TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded() { 133 void TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded() {
139 template_url_subscription_.reset(); 134 template_url_subscription_.reset();
140 JNIEnv* env = base::android::AttachCurrentThread(); 135 JNIEnv* env = base::android::AttachCurrentThread();
141 if (weak_java_obj_.get(env).is_null()) 136 if (weak_java_obj_.get(env).is_null())
142 return; 137 return;
138 LoadTemplateURLs();
143 139
144 Java_TemplateUrlService_templateUrlServiceLoaded(env, 140 Java_TemplateUrlService_templateUrlServiceLoaded(env,
145 weak_java_obj_.get(env)); 141 weak_java_obj_.get(env));
146 } 142 }
147 143
144 void TemplateUrlServiceAndroid::LoadTemplateURLs() {
145 template_urls_ = template_url_service_->GetTemplateURLs();
146 TemplateURL* default_search_provider =
147 template_url_service_->GetDefaultSearchProvider();
148
149 auto comp = [&](const TemplateURL* lhs, const TemplateURL* rhs) {
150 bool rhs_prepopulated =
151 template_url_service_->IsPrepopulatedOrCreatedByPolicy(rhs);
152 if (template_url_service_->IsPrepopulatedOrCreatedByPolicy(lhs)) {
153 return !rhs_prepopulated ||
154 (lhs->prepopulate_id() < rhs->prepopulate_id());
155 }
156 return (lhs == default_search_provider && !rhs_prepopulated);
157 };
158 std::sort(template_urls_.begin(), template_urls_.end(), comp);
159 }
160
148 void TemplateUrlServiceAndroid::OnTemplateURLServiceChanged() { 161 void TemplateUrlServiceAndroid::OnTemplateURLServiceChanged() {
149 JNIEnv* env = base::android::AttachCurrentThread(); 162 JNIEnv* env = base::android::AttachCurrentThread();
150 if (weak_java_obj_.get(env).is_null()) 163 if (weak_java_obj_.get(env).is_null())
151 return; 164 return;
165 LoadTemplateURLs();
152 166
153 Java_TemplateUrlService_onTemplateURLServiceChanged(env, 167 Java_TemplateUrlService_onTemplateURLServiceChanged(env,
154 weak_java_obj_.get(env)); 168 weak_java_obj_.get(env));
155 } 169 }
156 170
157 base::android::ScopedJavaLocalRef<jstring> 171 base::android::ScopedJavaLocalRef<jstring>
158 TemplateUrlServiceAndroid::GetUrlForSearchQuery( 172 TemplateUrlServiceAndroid::GetUrlForSearchQuery(
159 JNIEnv* env, 173 JNIEnv* env,
160 const JavaParamRef<jobject>& obj, 174 const JavaParamRef<jobject>& obj,
161 const JavaParamRef<jstring>& jquery) { 175 const JavaParamRef<jstring>& jquery) {
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 url = gurl.spec(); 266 url = gurl.spec();
253 } 267 }
254 268
255 return base::android::ConvertUTF8ToJavaString(env, url); 269 return base::android::ConvertUTF8ToJavaString(env, url);
256 } 270 }
257 271
258 base::android::ScopedJavaLocalRef<jstring> 272 base::android::ScopedJavaLocalRef<jstring>
259 TemplateUrlServiceAndroid::GetSearchEngineUrlFromTemplateUrl( 273 TemplateUrlServiceAndroid::GetSearchEngineUrlFromTemplateUrl(
260 JNIEnv* env, 274 JNIEnv* env,
261 const JavaParamRef<jobject>& obj, 275 const JavaParamRef<jobject>& obj,
262 jint index) { 276 const JavaParamRef<jstring>& jkeyword) {
263 TemplateURL* template_url = template_url_service_->GetTemplateURLs()[index]; 277 base::string16 keyword =
278 base::android::ConvertJavaStringToUTF16(env, jkeyword);
279 TemplateURL* template_url =
280 template_url_service_->GetTemplateURLForKeyword(keyword);
264 std::string url(template_url->url_ref().ReplaceSearchTerms( 281 std::string url(template_url->url_ref().ReplaceSearchTerms(
265 TemplateURLRef::SearchTermsArgs(base::ASCIIToUTF16("query")), 282 TemplateURLRef::SearchTermsArgs(base::ASCIIToUTF16("query")),
266 template_url_service_->search_terms_data())); 283 template_url_service_->search_terms_data()));
267 return base::android::ConvertUTF8ToJavaString(env, url); 284 return base::android::ConvertUTF8ToJavaString(env, url);
268 } 285 }
269 286
270 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { 287 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) {
271 TemplateUrlServiceAndroid* template_url_service_android = 288 TemplateUrlServiceAndroid* template_url_service_android =
272 new TemplateUrlServiceAndroid(env, obj); 289 new TemplateUrlServiceAndroid(env, obj);
273 return reinterpret_cast<intptr_t>(template_url_service_android); 290 return reinterpret_cast<intptr_t>(template_url_service_android);
274 } 291 }
275 292
276 // static 293 // static
277 bool TemplateUrlServiceAndroid::Register(JNIEnv* env) { 294 bool TemplateUrlServiceAndroid::Register(JNIEnv* env) {
278 return RegisterNativesImpl(env); 295 return RegisterNativesImpl(env);
279 } 296 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698