Index: chrome/browser/search_engines/template_url_service_android.cc |
diff --git a/chrome/browser/search_engines/template_url_service_android.cc b/chrome/browser/search_engines/template_url_service_android.cc |
index 2694d44065ce7e070b5ba73ed2c84c0354f8eda7..306cd44c2130303ba5a742eaabe1db46d58d08b0 100644 |
--- a/chrome/browser/search_engines/template_url_service_android.cc |
+++ b/chrome/browser/search_engines/template_url_service_android.cc |
@@ -42,6 +42,8 @@ TemplateUrlServiceAndroid::TemplateUrlServiceAndroid(JNIEnv* env, |
base::Bind(&TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded, |
base::Unretained(this))); |
template_url_service_->AddObserver(this); |
+ if (template_url_service_->loaded() && template_urls_.empty()) |
+ LoadTemplateURLs(); |
} |
TemplateUrlServiceAndroid::~TemplateUrlServiceAndroid() { |
@@ -56,40 +58,36 @@ void TemplateUrlServiceAndroid::Load(JNIEnv* env, |
void TemplateUrlServiceAndroid::SetUserSelectedDefaultSearchProvider( |
JNIEnv* env, |
const JavaParamRef<jobject>& obj, |
- jint selected_index) { |
- std::vector<TemplateURL*> template_urls = |
- template_url_service_->GetTemplateURLs(); |
- size_t selected_index_size_t = static_cast<size_t>(selected_index); |
- DCHECK_LT(selected_index_size_t, template_urls.size()) << |
- "Wrong index for search engine"; |
- |
- TemplateURL* template_url = template_urls[selected_index_size_t]; |
+ const JavaParamRef<jstring>& jkeyword) { |
+ base::string16 keyword( |
+ base::android::ConvertJavaStringToUTF16(env, jkeyword)); |
+ TemplateURL* template_url = |
+ template_url_service_->GetTemplateURLForKeyword(keyword); |
template_url_service_->SetUserSelectedDefaultSearchProvider(template_url); |
} |
-jint TemplateUrlServiceAndroid::GetDefaultSearchProvider( |
+jint TemplateUrlServiceAndroid::GetDefaultSearchProviderIndex( |
JNIEnv* env, |
- const JavaParamRef<jobject>& obj) { |
- std::vector<TemplateURL*> template_urls = |
- template_url_service_->GetTemplateURLs(); |
+ const base::android::JavaParamRef<jobject>& obj) const { |
TemplateURL* default_search_provider = |
template_url_service_->GetDefaultSearchProvider(); |
- for (size_t i = 0; i < template_urls.size(); ++i) { |
- if (default_search_provider == template_urls[i]) |
- return i; |
- } |
- return -1; |
+ auto it = std::find(template_urls_.begin(), template_urls_.end(), |
+ default_search_provider); |
+ size_t default_search_provider_index_ = |
+ (it == template_urls_.end()) ? -1 : (it - template_urls_.begin()); |
+ return default_search_provider_index_; |
} |
-jboolean TemplateUrlServiceAndroid::IsLoaded(JNIEnv* env, |
- const JavaParamRef<jobject>& obj) { |
+jboolean TemplateUrlServiceAndroid::IsLoaded( |
+ JNIEnv* env, |
+ const JavaParamRef<jobject>& obj) const { |
return template_url_service_->loaded(); |
} |
jint TemplateUrlServiceAndroid::GetTemplateUrlCount( |
JNIEnv* env, |
- const JavaParamRef<jobject>& obj) { |
- return template_url_service_->GetTemplateURLs().size(); |
+ const JavaParamRef<jobject>& obj) const { |
+ return template_urls_.size(); |
} |
jboolean TemplateUrlServiceAndroid::IsSearchProviderManaged( |
@@ -122,17 +120,14 @@ jboolean TemplateUrlServiceAndroid::IsDefaultSearchEngineGoogle( |
base::android::ScopedJavaLocalRef<jobject> |
TemplateUrlServiceAndroid::GetTemplateUrlAt(JNIEnv* env, |
const JavaParamRef<jobject>& obj, |
- jint index) { |
- TemplateURL* template_url = template_url_service_->GetTemplateURLs()[index]; |
+ jint index) const { |
+ TemplateURL* template_url = template_urls_[index]; |
return Java_TemplateUrl_create( |
env, index, |
base::android::ConvertUTF16ToJavaString(env, template_url->short_name()), |
- IsPrepopulatedTemplate(template_url) || |
- template_url->created_by_policy()); |
-} |
- |
-bool TemplateUrlServiceAndroid::IsPrepopulatedTemplate(TemplateURL* url) { |
- return url->prepopulate_id() > 0; |
+ base::android::ConvertUTF8ToJavaString(env, template_url->url()), |
+ template_url_service_->IsPrepopulatedOrCreatedByPolicy(template_url), |
+ base::android::ConvertUTF16ToJavaString(env, template_url->keyword())); |
} |
void TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded() { |
@@ -140,15 +135,34 @@ void TemplateUrlServiceAndroid::OnTemplateURLServiceLoaded() { |
JNIEnv* env = base::android::AttachCurrentThread(); |
if (weak_java_obj_.get(env).is_null()) |
return; |
+ LoadTemplateURLs(); |
Java_TemplateUrlService_templateUrlServiceLoaded(env, |
weak_java_obj_.get(env)); |
} |
+void TemplateUrlServiceAndroid::LoadTemplateURLs() { |
+ template_urls_ = template_url_service_->GetTemplateURLs(); |
+ TemplateURL* default_search_provider = |
+ template_url_service_->GetDefaultSearchProvider(); |
+ |
+ auto comp = [&](const TemplateURL* lhs, const TemplateURL* rhs) { |
+ bool rhs_prepopulated = |
+ template_url_service_->IsPrepopulatedOrCreatedByPolicy(rhs); |
+ if (template_url_service_->IsPrepopulatedOrCreatedByPolicy(lhs)) { |
+ return !rhs_prepopulated || |
+ (lhs->prepopulate_id() < rhs->prepopulate_id()); |
+ } |
+ return (lhs == default_search_provider && !rhs_prepopulated); |
+ }; |
+ std::sort(template_urls_.begin(), template_urls_.end(), comp); |
+} |
+ |
void TemplateUrlServiceAndroid::OnTemplateURLServiceChanged() { |
JNIEnv* env = base::android::AttachCurrentThread(); |
if (weak_java_obj_.get(env).is_null()) |
return; |
+ LoadTemplateURLs(); |
Java_TemplateUrlService_onTemplateURLServiceChanged(env, |
weak_java_obj_.get(env)); |
@@ -259,8 +273,11 @@ base::android::ScopedJavaLocalRef<jstring> |
TemplateUrlServiceAndroid::GetSearchEngineUrlFromTemplateUrl( |
JNIEnv* env, |
const JavaParamRef<jobject>& obj, |
- jint index) { |
- TemplateURL* template_url = template_url_service_->GetTemplateURLs()[index]; |
+ const JavaParamRef<jstring>& jkeyword) { |
+ base::string16 keyword = |
+ base::android::ConvertJavaStringToUTF16(env, jkeyword); |
+ TemplateURL* template_url = |
+ template_url_service_->GetTemplateURLForKeyword(keyword); |
std::string url(template_url->url_ref().ReplaceSearchTerms( |
TemplateURLRef::SearchTermsArgs(base::ASCIIToUTF16("query")), |
template_url_service_->search_terms_data())); |