Chromium Code Reviews| 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..d75c7a7b516e042f5d371f9996b73c99ecdc1809 100644 |
| --- a/chrome/browser/autofill/android/personal_data_manager_android.cc |
| +++ b/chrome/browser/autofill/android/personal_data_manager_android.cc |
| @@ -5,6 +5,7 @@ |
| #include "chrome/browser/autofill/android/personal_data_manager_android.h" |
| #include <stddef.h> |
| +#include <stdlib.h> |
| #include <algorithm> |
| #include <memory> |
| #include <utility> |
| @@ -18,6 +19,7 @@ |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/time/time.h" |
| #include "chrome/browser/android/resource_mapper.h" |
| +#include "chrome/browser/autofill/android/mock_address_validator.h" |
|
please use gerrit instead
2016/09/16 22:30:41
Yah, we can't include test code from production co
sebsg
2016/09/22 19:50:40
Done.
|
| #include "chrome/browser/autofill/personal_data_manager_factory.h" |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/profiles/profile.h" |
| @@ -25,6 +27,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 +43,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 +275,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 +612,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)); |
| +} |
| + |
| +jboolean PersonalDataManagerAndroid::AreRulesDoneLoadingForRegion( |
| + JNIEnv* env, |
| + const base::android::JavaParamRef<jobject>& unused_obj, |
| + const base::android::JavaParamRef<jstring>& jregion_code) { |
|
please use gerrit instead
2016/09/16 22:30:41
This code might go away after you make normalizati
sebsg
2016/09/22 19:50:40
Done.
|
| + std::map<std::string, bool>::iterator it = |
| + loaded_rules_.find(ConvertJavaStringToUTF8(env, jregion_code)); |
| + |
| + return it != loaded_rules_.end() ? true : false; |
| +} |
| + |
| +jboolean PersonalDataManagerAndroid::AreRulesSuccessfullyLoadedForRegion( |
| + JNIEnv* env, |
| + const base::android::JavaParamRef<jobject>& unused_obj, |
| + const base::android::JavaParamRef<jstring>& jregion_code) { |
| + std::map<std::string, bool>::iterator it = |
| + loaded_rules_.find(ConvertJavaStringToUTF8(env, jregion_code)); |
| + |
| + return it != loaded_rules_.end() ? it->second : false; |
| +} |
| + |
| +ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetNormalizedProfile( |
| + JNIEnv* env, |
| + const JavaParamRef<jobject>& unused_obj, |
| + const JavaParamRef<jstring>& jguid, |
| + const JavaParamRef<jstring>& jregion_code) { |
| + AutofillProfile* profile = personal_data_manager_->GetProfileByGUID( |
| + ConvertJavaStringToUTF8(env, jguid)); |
| + |
| + if (!profile) |
| + return ScopedJavaLocalRef<jobject>(); |
| + |
| + // Check if the rules are loaded every second for 5 seconds. |
| + for (int i = 0; i < 5; ++i) { |
|
please use gerrit instead
2016/09/16 22:30:42
/me closes his eyes.
I'm going to pretend I never
sebsg
2016/09/22 19:50:40
Done.
|
| + if (AreRulesDoneLoadingForRegion(env, unused_obj, jregion_code)) |
| + break; |
| + sleep(1); |
| + } |
| + |
| + if (!AreRulesDoneLoadingForRegion(env, unused_obj, jregion_code) || |
| + !AreRulesSuccessfullyLoadedForRegion(env, unused_obj, jregion_code)) |
| + return CreateJavaProfileFromNative(env, *profile); |
| + |
| + // Create the AddressData from the profile. |
| + ::i18n::addressinput::AddressData address_data = |
| + *i18n::CreateAddressDataFromAutofillProfile( |
| + *profile, personal_data_manager_->app_locale()); |
| + |
| + // Try to normalize the address. |
| + if (address_validator_->NormalizeAddress(&address_data)) { |
| + // Set the normalized state and city. |
|
please use gerrit instead
2016/09/16 22:30:41
Normalize the dependent locality as well, please.
sebsg
2016/09/22 19:50:40
Done.
|
| + profile->SetRawInfo(ADDRESS_HOME_STATE, |
| + base::UTF8ToUTF16(address_data.administrative_area)); |
| + profile->SetRawInfo(ADDRESS_HOME_CITY, |
| + base::UTF8ToUTF16(address_data.locality)); |
| + } |
| + |
| + return CreateJavaProfileFromNative(env, *profile); |
| +} |
| + |
| +void PersonalDataManagerAndroid::OnAddressValidationRulesLoaded( |
| + const std::string& region_code, |
| + bool success) { |
| + loaded_rules_[region_code] = success; |
| +} |
| + |
| +void PersonalDataManagerAndroid::SetMockAddressValidatorForTesting( |
| + JNIEnv* env, |
| + const base::android::JavaParamRef<jobject>& unused_obj, |
| + jboolean load_rules_response) { |
| + address_validator_.reset(new MockAddressValidator(this, load_rules_response)); |
| +} |
| + |
| ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileGUIDs( |
| JNIEnv* env, |
| const std::vector<AutofillProfile*>& profiles) { |