Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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/autofill/android/personal_data_manager_android.h" | 5 #include "chrome/browser/autofill/android/personal_data_manager_android.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdlib.h> | |
| 8 #include <algorithm> | 9 #include <algorithm> |
| 9 #include <memory> | 10 #include <memory> |
| 10 #include <utility> | 11 #include <utility> |
| 11 | 12 |
| 12 #include "base/android/jni_array.h" | 13 #include "base/android/jni_array.h" |
| 13 #include "base/android/jni_string.h" | 14 #include "base/android/jni_string.h" |
| 14 #include "base/command_line.h" | 15 #include "base/command_line.h" |
| 15 #include "base/format_macros.h" | 16 #include "base/format_macros.h" |
| 16 #include "base/memory/weak_ptr.h" | 17 #include "base/memory/weak_ptr.h" |
| 17 #include "base/strings/stringprintf.h" | 18 #include "base/strings/stringprintf.h" |
| 18 #include "base/strings/utf_string_conversions.h" | 19 #include "base/strings/utf_string_conversions.h" |
| 19 #include "base/time/time.h" | 20 #include "base/time/time.h" |
| 20 #include "chrome/browser/android/resource_mapper.h" | 21 #include "chrome/browser/android/resource_mapper.h" |
| 22 #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.
| |
| 21 #include "chrome/browser/autofill/personal_data_manager_factory.h" | 23 #include "chrome/browser/autofill/personal_data_manager_factory.h" |
| 22 #include "chrome/browser/browser_process.h" | 24 #include "chrome/browser/browser_process.h" |
| 23 #include "chrome/browser/profiles/profile.h" | 25 #include "chrome/browser/profiles/profile.h" |
| 24 #include "chrome/browser/profiles/profile_manager.h" | 26 #include "chrome/browser/profiles/profile_manager.h" |
| 25 #include "chrome/common/pref_names.h" | 27 #include "chrome/common/pref_names.h" |
| 26 #include "components/autofill/content/browser/content_autofill_driver.h" | 28 #include "components/autofill/content/browser/content_autofill_driver.h" |
| 27 #include "components/autofill/content/browser/content_autofill_driver_factory.h" | 29 #include "components/autofill/content/browser/content_autofill_driver_factory.h" |
| 30 #include "components/autofill/core/browser/address_i18n.h" | |
| 28 #include "components/autofill/core/browser/autofill_country.h" | 31 #include "components/autofill/core/browser/autofill_country.h" |
| 29 #include "components/autofill/core/browser/autofill_data_util.h" | 32 #include "components/autofill/core/browser/autofill_data_util.h" |
| 30 #include "components/autofill/core/browser/autofill_type.h" | 33 #include "components/autofill/core/browser/autofill_type.h" |
| 31 #include "components/autofill/core/browser/country_names.h" | 34 #include "components/autofill/core/browser/country_names.h" |
| 32 #include "components/autofill/core/browser/field_types.h" | 35 #include "components/autofill/core/browser/field_types.h" |
| 33 #include "components/autofill/core/browser/payments/full_card_request.h" | 36 #include "components/autofill/core/browser/payments/full_card_request.h" |
| 34 #include "components/autofill/core/browser/personal_data_manager.h" | 37 #include "components/autofill/core/browser/personal_data_manager.h" |
| 35 #include "components/autofill/core/browser/validation.h" | 38 #include "components/autofill/core/browser/validation.h" |
| 36 #include "components/autofill/core/common/autofill_constants.h" | 39 #include "components/autofill/core/common/autofill_constants.h" |
| 37 #include "components/autofill/core/common/autofill_pref_names.h" | 40 #include "components/autofill/core/common/autofill_pref_names.h" |
| 38 #include "components/autofill/core/common/autofill_switches.h" | 41 #include "components/autofill/core/common/autofill_switches.h" |
| 39 #include "components/grit/components_scaled_resources.h" | 42 #include "components/grit/components_scaled_resources.h" |
| 40 #include "components/prefs/pref_service.h" | 43 #include "components/prefs/pref_service.h" |
| 41 #include "content/public/browser/web_contents.h" | 44 #include "content/public/browser/web_contents.h" |
| 42 #include "jni/PersonalDataManager_jni.h" | 45 #include "jni/PersonalDataManager_jni.h" |
| 46 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_da ta.h" | |
| 43 | 47 |
| 44 using base::android::ConvertJavaStringToUTF8; | 48 using base::android::ConvertJavaStringToUTF8; |
| 45 using base::android::ConvertUTF16ToJavaString; | 49 using base::android::ConvertUTF16ToJavaString; |
| 46 using base::android::ConvertUTF8ToJavaString; | 50 using base::android::ConvertUTF8ToJavaString; |
| 47 using base::android::JavaParamRef; | 51 using base::android::JavaParamRef; |
| 48 using base::android::ScopedJavaGlobalRef; | 52 using base::android::ScopedJavaGlobalRef; |
| 49 using base::android::ScopedJavaLocalRef; | 53 using base::android::ScopedJavaLocalRef; |
| 50 | 54 |
| 51 namespace autofill { | 55 namespace autofill { |
| 52 namespace { | 56 namespace { |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 264 }; | 268 }; |
| 265 | 269 |
| 266 } // namespace | 270 } // namespace |
| 267 | 271 |
| 268 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, | 272 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, |
| 269 jobject obj) | 273 jobject obj) |
| 270 : weak_java_obj_(env, obj), | 274 : weak_java_obj_(env, obj), |
| 271 personal_data_manager_(PersonalDataManagerFactory::GetForProfile( | 275 personal_data_manager_(PersonalDataManagerFactory::GetForProfile( |
| 272 ProfileManager::GetActiveUserProfile())) { | 276 ProfileManager::GetActiveUserProfile())) { |
| 273 personal_data_manager_->AddObserver(this); | 277 personal_data_manager_->AddObserver(this); |
| 278 | |
| 279 address_validator_.reset(new AddressValidator( | |
| 280 std::unique_ptr<::i18n::addressinput::Source>( | |
| 281 new autofill::ChromeMetadataSource( | |
| 282 I18N_ADDRESS_VALIDATION_DATA_URL, | |
| 283 personal_data_manager_->GetURLRequestContextGetter())), | |
| 284 ValidationRulesStorageFactory::CreateStorage(), this)); | |
| 274 } | 285 } |
| 275 | 286 |
| 276 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { | 287 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { |
| 277 personal_data_manager_->RemoveObserver(this); | 288 personal_data_manager_->RemoveObserver(this); |
| 278 } | 289 } |
| 279 | 290 |
| 280 jboolean PersonalDataManagerAndroid::IsDataLoaded( | 291 jboolean PersonalDataManagerAndroid::IsDataLoaded( |
| 281 JNIEnv* env, | 292 JNIEnv* env, |
| 282 const base::android::JavaParamRef<jobject>& unused_obj) const { | 293 const base::android::JavaParamRef<jobject>& unused_obj) const { |
| 283 return personal_data_manager_->IsDataLoaded(); | 294 return personal_data_manager_->IsDataLoaded(); |
| (...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 594 return card->use_date().ToTimeT(); | 605 return card->use_date().ToTimeT(); |
| 595 } | 606 } |
| 596 | 607 |
| 597 // TODO(crbug.com/629507): Use a mock clock for testing. | 608 // TODO(crbug.com/629507): Use a mock clock for testing. |
| 598 jlong PersonalDataManagerAndroid::GetCurrentDateForTesting( | 609 jlong PersonalDataManagerAndroid::GetCurrentDateForTesting( |
| 599 JNIEnv* env, | 610 JNIEnv* env, |
| 600 const base::android::JavaParamRef<jobject>& unused_obj) { | 611 const base::android::JavaParamRef<jobject>& unused_obj) { |
| 601 return base::Time::Now().ToTimeT(); | 612 return base::Time::Now().ToTimeT(); |
| 602 } | 613 } |
| 603 | 614 |
| 615 void PersonalDataManagerAndroid::LoadRulesForRegion( | |
| 616 JNIEnv* env, | |
| 617 const base::android::JavaParamRef<jobject>& unused_obj, | |
| 618 const base::android::JavaParamRef<jstring>& jregion_code) { | |
| 619 address_validator_->LoadRules(ConvertJavaStringToUTF8(env, jregion_code)); | |
| 620 } | |
| 621 | |
| 622 jboolean PersonalDataManagerAndroid::AreRulesDoneLoadingForRegion( | |
| 623 JNIEnv* env, | |
| 624 const base::android::JavaParamRef<jobject>& unused_obj, | |
| 625 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.
| |
| 626 std::map<std::string, bool>::iterator it = | |
| 627 loaded_rules_.find(ConvertJavaStringToUTF8(env, jregion_code)); | |
| 628 | |
| 629 return it != loaded_rules_.end() ? true : false; | |
| 630 } | |
| 631 | |
| 632 jboolean PersonalDataManagerAndroid::AreRulesSuccessfullyLoadedForRegion( | |
| 633 JNIEnv* env, | |
| 634 const base::android::JavaParamRef<jobject>& unused_obj, | |
| 635 const base::android::JavaParamRef<jstring>& jregion_code) { | |
| 636 std::map<std::string, bool>::iterator it = | |
| 637 loaded_rules_.find(ConvertJavaStringToUTF8(env, jregion_code)); | |
| 638 | |
| 639 return it != loaded_rules_.end() ? it->second : false; | |
| 640 } | |
| 641 | |
| 642 ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetNormalizedProfile( | |
| 643 JNIEnv* env, | |
| 644 const JavaParamRef<jobject>& unused_obj, | |
| 645 const JavaParamRef<jstring>& jguid, | |
| 646 const JavaParamRef<jstring>& jregion_code) { | |
| 647 AutofillProfile* profile = personal_data_manager_->GetProfileByGUID( | |
| 648 ConvertJavaStringToUTF8(env, jguid)); | |
| 649 | |
| 650 if (!profile) | |
| 651 return ScopedJavaLocalRef<jobject>(); | |
| 652 | |
| 653 // Check if the rules are loaded every second for 5 seconds. | |
| 654 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.
| |
| 655 if (AreRulesDoneLoadingForRegion(env, unused_obj, jregion_code)) | |
| 656 break; | |
| 657 sleep(1); | |
| 658 } | |
| 659 | |
| 660 if (!AreRulesDoneLoadingForRegion(env, unused_obj, jregion_code) || | |
| 661 !AreRulesSuccessfullyLoadedForRegion(env, unused_obj, jregion_code)) | |
| 662 return CreateJavaProfileFromNative(env, *profile); | |
| 663 | |
| 664 // Create the AddressData from the profile. | |
| 665 ::i18n::addressinput::AddressData address_data = | |
| 666 *i18n::CreateAddressDataFromAutofillProfile( | |
| 667 *profile, personal_data_manager_->app_locale()); | |
| 668 | |
| 669 // Try to normalize the address. | |
| 670 if (address_validator_->NormalizeAddress(&address_data)) { | |
| 671 // 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.
| |
| 672 profile->SetRawInfo(ADDRESS_HOME_STATE, | |
| 673 base::UTF8ToUTF16(address_data.administrative_area)); | |
| 674 profile->SetRawInfo(ADDRESS_HOME_CITY, | |
| 675 base::UTF8ToUTF16(address_data.locality)); | |
| 676 } | |
| 677 | |
| 678 return CreateJavaProfileFromNative(env, *profile); | |
| 679 } | |
| 680 | |
| 681 void PersonalDataManagerAndroid::OnAddressValidationRulesLoaded( | |
| 682 const std::string& region_code, | |
| 683 bool success) { | |
| 684 loaded_rules_[region_code] = success; | |
| 685 } | |
| 686 | |
| 687 void PersonalDataManagerAndroid::SetMockAddressValidatorForTesting( | |
| 688 JNIEnv* env, | |
| 689 const base::android::JavaParamRef<jobject>& unused_obj, | |
| 690 jboolean load_rules_response) { | |
| 691 address_validator_.reset(new MockAddressValidator(this, load_rules_response)); | |
| 692 } | |
| 693 | |
| 604 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileGUIDs( | 694 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileGUIDs( |
| 605 JNIEnv* env, | 695 JNIEnv* env, |
| 606 const std::vector<AutofillProfile*>& profiles) { | 696 const std::vector<AutofillProfile*>& profiles) { |
| 607 std::vector<base::string16> guids; | 697 std::vector<base::string16> guids; |
| 608 for (AutofillProfile* profile : profiles) | 698 for (AutofillProfile* profile : profiles) |
| 609 guids.push_back(base::UTF8ToUTF16(profile->guid())); | 699 guids.push_back(base::UTF8ToUTF16(profile->guid())); |
| 610 | 700 |
| 611 return base::android::ToJavaArrayOfStrings(env, guids); | 701 return base::android::ToJavaArrayOfStrings(env, guids); |
| 612 } | 702 } |
| 613 | 703 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 698 base::android::ConvertJavaStringToUTF16(env, jcountry_name))); | 788 base::android::ConvertJavaStringToUTF16(env, jcountry_name))); |
| 699 } | 789 } |
| 700 | 790 |
| 701 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 791 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
| 702 PersonalDataManagerAndroid* personal_data_manager_android = | 792 PersonalDataManagerAndroid* personal_data_manager_android = |
| 703 new PersonalDataManagerAndroid(env, obj); | 793 new PersonalDataManagerAndroid(env, obj); |
| 704 return reinterpret_cast<intptr_t>(personal_data_manager_android); | 794 return reinterpret_cast<intptr_t>(personal_data_manager_android); |
| 705 } | 795 } |
| 706 | 796 |
| 707 } // namespace autofill | 797 } // namespace autofill |
| OLD | NEW |