Index: chrome/browser/autofill/android/personal_data_manager_android.cc |
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.cc b/chrome/browser/autofill/android/personal_data_manager_android.cc |
index 519f4e138d54fa6e037e865aa50bdf36971f7cc2..9f6dc9bdc856a7b7a44d25e0e1d6b5e33497b3c9 100644 |
--- a/chrome/browser/autofill/android/personal_data_manager_android.cc |
+++ b/chrome/browser/autofill/android/personal_data_manager_android.cc |
@@ -25,6 +25,7 @@ |
#include "chrome/common/pref_names.h" |
#include "components/autofill/content/browser/content_autofill_driver.h" |
#include "components/autofill/content/browser/content_autofill_driver_factory.h" |
+#include "components/autofill/core/browser/address_i18n.h" |
#include "components/autofill/core/browser/autofill_country.h" |
#include "components/autofill/core/browser/autofill_data_util.h" |
#include "components/autofill/core/browser/autofill_type.h" |
@@ -40,6 +41,7 @@ |
#include "components/prefs/pref_service.h" |
#include "content/public/browser/web_contents.h" |
#include "jni/PersonalDataManager_jni.h" |
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h" |
using base::android::ConvertJavaStringToUTF8; |
using base::android::ConvertUTF16ToJavaString; |
@@ -271,6 +273,13 @@ PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, |
personal_data_manager_(PersonalDataManagerFactory::GetForProfile( |
ProfileManager::GetActiveUserProfile())) { |
personal_data_manager_->AddObserver(this); |
+ |
+ address_validator_.reset(new AddressValidator( |
+ std::unique_ptr<::i18n::addressinput::Source>( |
+ new autofill::ChromeMetadataSource( |
+ I18N_ADDRESS_VALIDATION_DATA_URL, |
+ personal_data_manager_->GetURLRequestContextGetter())), |
+ ValidationRulesStorageFactory::CreateStorage(), this)); |
} |
PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { |
@@ -601,6 +610,85 @@ jlong PersonalDataManagerAndroid::GetCurrentDateForTesting( |
return base::Time::Now().ToTimeT(); |
} |
+void PersonalDataManagerAndroid::LoadRulesForRegion( |
+ JNIEnv* env, |
+ const base::android::JavaParamRef<jobject>& unused_obj, |
+ const base::android::JavaParamRef<jstring>& jregion_code) { |
+ address_validator_->LoadRules(ConvertJavaStringToUTF8(env, jregion_code)); |
+} |
+ |
+void PersonalDataManagerAndroid::StartAddressNormalizationTask( |
+ JNIEnv* env, |
+ const JavaParamRef<jobject>& unused_obj, |
+ const JavaParamRef<jstring>& jguid, |
+ const JavaParamRef<jstring>& jregion_code) { |
+ std::string region_code = ConvertJavaStringToUTF8(env, jregion_code); |
+ |
+ // Check if the rules are already done loading. |
+ if (AreRulesDoneLoadingForRegion(region_code)) { |
+ NormalizeAddress(ConvertJavaStringToUTF8(env, jguid), region_code); |
+ } else { |
+ // Setup the variables so the profile gets normalized when the rules have |
+ // finished loading. |
+ pending_normalization_profile_guid_ = ConvertJavaStringToUTF8(env, jguid); |
+ pending_normalization_region_code_ = region_code; |
+ } |
+} |
+ |
+void PersonalDataManagerAndroid::CancelAddressNormalizationTask( |
+ JNIEnv* env, |
+ const base::android::JavaParamRef<jobject>& unused_obj) { |
+ pending_normalization_profile_guid_ = ""; |
please use gerrit instead
2016/09/23 09:04:40
pending_normalization_profile_guid_.clear();
sebsg
2016/09/27 18:48:38
Done.
|
+ pending_normalization_region_code_ = ""; |
please use gerrit instead
2016/09/23 09:04:40
pending_normalization_region_code_.clear();
sebsg
2016/09/27 18:48:38
Done.
|
+} |
+ |
+void PersonalDataManagerAndroid::NormalizeAddress(std::string guid, |
+ std::string region_code) { |
+ AutofillProfile* profile = personal_data_manager_->GetProfileByGUID(guid); |
+ |
+ if (!profile || !AreRulesDoneLoadingForRegion(region_code) || |
+ !AreRulesSuccessfullyLoadedForRegion(region_code)) |
+ return; |
+ |
+ // Create the AddressData from the profile. |
+ ::i18n::addressinput::AddressData address_data = |
+ *i18n::CreateAddressDataFromAutofillProfile( |
+ *profile, personal_data_manager_->app_locale()); |
+ |
+ // Normalize the address. |
+ if (address_validator_->NormalizeAddress(&address_data)) { |
+ // Set the normalized state, city and dependent locality. |
+ profile->SetRawInfo(ADDRESS_HOME_STATE, |
+ base::UTF8ToUTF16(address_data.administrative_area)); |
+ profile->SetRawInfo(ADDRESS_HOME_CITY, |
+ base::UTF8ToUTF16(address_data.locality)); |
+ profile->SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, |
+ base::UTF8ToUTF16(address_data.dependent_locality)); |
+ } |
+ |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ if (weak_java_obj_.get(env).is_null()) |
+ return; |
+ |
+ Java_PersonalDataManager_onAddressNormalized( |
+ env, weak_java_obj_.get(env), CreateJavaProfileFromNative(env, *profile)); |
+} |
+ |
+void PersonalDataManagerAndroid::OnAddressValidationRulesLoaded( |
+ const std::string& region_code, |
+ bool success) { |
+ loaded_rules_[region_code] = success; |
+ |
+ // Check if an address normalization is pending. |
+ if (pending_normalization_profile_guid_ != "" && |
please use gerrit instead
2016/09/23 09:04:40
!pending_normalization_profile_guid_.empty()
sebsg
2016/09/27 18:48:38
Done.
|
+ pending_normalization_region_code_ != "") { |
please use gerrit instead
2016/09/23 09:04:40
!pending_normalization_region_code_.empty()
sebsg
2016/09/27 18:48:38
Done.
|
+ NormalizeAddress(pending_normalization_profile_guid_, |
+ pending_normalization_region_code_); |
+ pending_normalization_profile_guid_ = ""; |
please use gerrit instead
2016/09/23 09:04:40
.clear()
sebsg
2016/09/27 18:48:38
Done.
|
+ pending_normalization_region_code_ = ""; |
please use gerrit instead
2016/09/23 09:04:40
.clear()
sebsg
2016/09/27 18:48:38
Done.
|
+ } |
+} |
+ |
ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileGUIDs( |
JNIEnv* env, |
const std::vector<AutofillProfile*>& profiles) { |
@@ -654,6 +742,17 @@ ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileLabels( |
return base::android::ToJavaArrayOfStrings(env, labels); |
} |
+bool PersonalDataManagerAndroid::AreRulesDoneLoadingForRegion( |
+ std::string region_code) { |
+ return loaded_rules_.find(region_code) != loaded_rules_.end(); |
+} |
+ |
+bool PersonalDataManagerAndroid::AreRulesSuccessfullyLoadedForRegion( |
+ std::string region_code) { |
+ std::map<std::string, bool>::iterator it = loaded_rules_.find(region_code); |
+ return it != loaded_rules_.end() ? it->second : false; |
+} |
+ |
// Returns whether the Autofill feature is enabled. |
static jboolean IsAutofillEnabled(JNIEnv* env, |
const JavaParamRef<jclass>& clazz) { |