Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |