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 <algorithm> | 8 #include <algorithm> |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/android/jni_array.h" | 12 #include "base/android/jni_array.h" |
| 13 #include "base/android/jni_string.h" | 13 #include "base/android/jni_string.h" |
| 14 #include "base/command_line.h" | 14 #include "base/command_line.h" |
| 15 #include "base/format_macros.h" | 15 #include "base/format_macros.h" |
| 16 #include "base/strings/utf_string_conversions.h" | 16 #include "base/strings/utf_string_conversions.h" |
| 17 #include "base/time/time.h" | 17 #include "base/time/time.h" |
| 18 #include "chrome/browser/android/resource_mapper.h" | 18 #include "chrome/browser/android/resource_mapper.h" |
| 19 #include "chrome/browser/autofill/personal_data_manager_factory.h" | 19 #include "chrome/browser/autofill/personal_data_manager_factory.h" |
| 20 #include "chrome/browser/autofill/validation_rules_storage_factory.h" | |
| 20 #include "chrome/browser/browser_process.h" | 21 #include "chrome/browser/browser_process.h" |
| 21 #include "chrome/browser/profiles/profile.h" | 22 #include "chrome/browser/profiles/profile.h" |
| 22 #include "chrome/browser/profiles/profile_manager.h" | 23 #include "chrome/browser/profiles/profile_manager.h" |
| 23 #include "chrome/common/pref_names.h" | 24 #include "chrome/common/pref_names.h" |
| 24 #include "components/autofill/content/browser/content_autofill_driver.h" | 25 #include "components/autofill/content/browser/content_autofill_driver.h" |
| 25 #include "components/autofill/content/browser/content_autofill_driver_factory.h" | 26 #include "components/autofill/content/browser/content_autofill_driver_factory.h" |
| 26 #include "components/autofill/core/browser/address_i18n.h" | 27 #include "components/autofill/core/browser/address_i18n.h" |
| 27 #include "components/autofill/core/browser/autofill_country.h" | 28 #include "components/autofill/core/browser/autofill_country.h" |
| 28 #include "components/autofill/core/browser/autofill_data_util.h" | 29 #include "components/autofill/core/browser/autofill_data_util.h" |
| 29 #include "components/autofill/core/browser/autofill_type.h" | 30 #include "components/autofill/core/browser/autofill_type.h" |
| 30 #include "components/autofill/core/browser/country_names.h" | 31 #include "components/autofill/core/browser/country_names.h" |
| 31 #include "components/autofill/core/browser/field_types.h" | 32 #include "components/autofill/core/browser/field_types.h" |
| 32 #include "components/autofill/core/browser/payments/full_card_request.h" | 33 #include "components/autofill/core/browser/payments/full_card_request.h" |
| 33 #include "components/autofill/core/browser/personal_data_manager.h" | 34 #include "components/autofill/core/browser/personal_data_manager.h" |
| 34 #include "components/autofill/core/browser/validation.h" | 35 #include "components/autofill/core/browser/validation.h" |
| 35 #include "components/autofill/core/common/autofill_constants.h" | 36 #include "components/autofill/core/common/autofill_constants.h" |
| 36 #include "components/autofill/core/common/autofill_pref_names.h" | 37 #include "components/autofill/core/common/autofill_pref_names.h" |
| 37 #include "components/autofill/core/common/autofill_switches.h" | 38 #include "components/autofill/core/common/autofill_switches.h" |
| 38 #include "components/grit/components_scaled_resources.h" | 39 #include "components/grit/components_scaled_resources.h" |
| 39 #include "components/prefs/pref_service.h" | 40 #include "components/prefs/pref_service.h" |
| 40 #include "content/public/browser/web_contents.h" | 41 #include "content/public/browser/web_contents.h" |
| 41 #include "jni/PersonalDataManager_jni.h" | 42 #include "jni/PersonalDataManager_jni.h" |
| 42 #include "third_party/libaddressinput/chromium/chrome_metadata_source.h" | 43 #include "third_party/libaddressinput/chromium/chrome_metadata_source.h" |
| 43 #include "third_party/libaddressinput/chromium/chrome_storage_impl.h" | 44 #include "third_party/libaddressinput/chromium/chrome_storage_impl.h" |
| 44 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_da ta.h" | |
| 45 | 45 |
| 46 using base::android::ConvertJavaStringToUTF8; | 46 using base::android::ConvertJavaStringToUTF8; |
| 47 using base::android::ConvertUTF16ToJavaString; | 47 using base::android::ConvertUTF16ToJavaString; |
| 48 using base::android::ConvertUTF8ToJavaString; | 48 using base::android::ConvertUTF8ToJavaString; |
| 49 using base::android::JavaParamRef; | 49 using base::android::JavaParamRef; |
| 50 using base::android::ScopedJavaGlobalRef; | 50 using base::android::ScopedJavaGlobalRef; |
| 51 using base::android::ScopedJavaLocalRef; | 51 using base::android::ScopedJavaLocalRef; |
| 52 | 52 |
| 53 namespace autofill { | 53 namespace autofill { |
| 54 namespace { | 54 namespace { |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 265 Java_FullCardRequestDelegate_onFullCardError(env, jdelegate_); | 265 Java_FullCardRequestDelegate_onFullCardError(env, jdelegate_); |
| 266 delete this; | 266 delete this; |
| 267 } | 267 } |
| 268 | 268 |
| 269 std::unique_ptr<CreditCard> card_; | 269 std::unique_ptr<CreditCard> card_; |
| 270 ScopedJavaGlobalRef<jobject> jdelegate_; | 270 ScopedJavaGlobalRef<jobject> jdelegate_; |
| 271 | 271 |
| 272 DISALLOW_COPY_AND_ASSIGN(FullCardRequester); | 272 DISALLOW_COPY_AND_ASSIGN(FullCardRequester); |
| 273 }; | 273 }; |
| 274 | 274 |
| 275 class AddressNormalizationRequester | 275 class AndroidAddressNormalizationRequester |
|
please use gerrit instead
2017/02/14 21:31:08
nit: AddressNormalizerDelegate
sebsg
2017/02/15 16:18:30
Done.
| |
| 276 : public PersonalDataManagerAndroid::Delegate, | 276 : public ::payments::AddressNormalizationRequester, |
| 277 public base::SupportsWeakPtr<AddressNormalizationRequester> { | 277 public base::SupportsWeakPtr<AndroidAddressNormalizationRequester> { |
| 278 public: | 278 public: |
| 279 AddressNormalizationRequester( | 279 AndroidAddressNormalizationRequester( |
| 280 JNIEnv* env, | 280 JNIEnv* env, |
| 281 const base::android::JavaParamRef<jobject>& jdelegate, | 281 const base::android::JavaParamRef<jobject>& jdelegate) { |
| 282 const std::string& region_code, | |
| 283 const std::string& guid, | |
| 284 base::WeakPtr<PersonalDataManagerAndroid> personal_data_manager_android) { | |
| 285 jdelegate_.Reset(env, jdelegate); | 282 jdelegate_.Reset(env, jdelegate); |
| 286 region_code_ = region_code; | 283 } |
| 287 guid_ = guid; | 284 |
| 288 personal_data_manager_android_ = personal_data_manager_android; | 285 void OnAddressNormalized(AutofillProfile normalized_profile) override { |
|
please use gerrit instead
2017/02/14 21:31:08
const-ref for the normalized proifle.
sebsg
2017/02/15 16:18:30
Done.
| |
| 289 env_ = env; | 286 JNIEnv* env = base::android::AttachCurrentThread(); |
| 287 Java_NormalizedAddressRequestDelegate_onAddressNormalized( | |
| 288 env, jdelegate_, CreateJavaProfileFromNative(env, normalized_profile)); | |
| 289 delete this; | |
| 290 } | 290 } |
| 291 | 291 |
| 292 private: | 292 private: |
| 293 ~AddressNormalizationRequester() override {} | 293 virtual ~AndroidAddressNormalizationRequester() {} |
|
please use gerrit instead
2017/02/14 21:31:08
override instead of virtual
sebsg
2017/02/15 16:18:30
Done.
| |
| 294 | |
| 295 void OnRulesSuccessfullyLoaded() override { | |
| 296 if (personal_data_manager_android_) { | |
| 297 JNIEnv* env = base::android::AttachCurrentThread(); | |
| 298 Java_NormalizedAddressRequestDelegate_onAddressNormalized( | |
| 299 env, jdelegate_, personal_data_manager_android_->NormalizeAddress( | |
| 300 guid_, region_code_, env)); | |
| 301 } | |
| 302 } | |
| 303 | 294 |
| 304 ScopedJavaGlobalRef<jobject> jdelegate_; | 295 ScopedJavaGlobalRef<jobject> jdelegate_; |
| 305 std::string guid_; | |
| 306 std::string region_code_; | |
| 307 base::WeakPtr<PersonalDataManagerAndroid> personal_data_manager_android_; | |
| 308 JNIEnv* env_; | |
| 309 | 296 |
| 310 DISALLOW_COPY_AND_ASSIGN(AddressNormalizationRequester); | 297 DISALLOW_COPY_AND_ASSIGN(AndroidAddressNormalizationRequester); |
| 311 }; | 298 }; |
| 312 | 299 |
| 313 } // namespace | 300 } // namespace |
| 314 | 301 |
| 315 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, jobject obj) | 302 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, jobject obj) |
| 316 : weak_java_obj_(env, obj), | 303 : weak_java_obj_(env, obj), |
| 317 personal_data_manager_(PersonalDataManagerFactory::GetForProfile( | 304 personal_data_manager_(PersonalDataManagerFactory::GetForProfile( |
| 318 ProfileManager::GetActiveUserProfile())), | 305 ProfileManager::GetActiveUserProfile())), |
| 319 address_validator_( | 306 address_validator_helper_( |
| 320 std::unique_ptr<::i18n::addressinput::Source>( | 307 std::unique_ptr<::i18n::addressinput::Source>( |
| 321 new autofill::ChromeMetadataSource( | 308 new autofill::ChromeMetadataSource( |
| 322 I18N_ADDRESS_VALIDATION_DATA_URL, | 309 I18N_ADDRESS_VALIDATION_DATA_URL, |
| 323 personal_data_manager_->GetURLRequestContextGetter())), | 310 personal_data_manager_->GetURLRequestContextGetter())), |
| 324 ValidationRulesStorageFactory::CreateStorage(), | 311 ValidationRulesStorageFactory::CreateStorage()) { |
| 325 this) { | |
| 326 personal_data_manager_->AddObserver(this); | 312 personal_data_manager_->AddObserver(this); |
| 327 } | 313 } |
| 328 | 314 |
| 329 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { | 315 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { |
| 330 personal_data_manager_->RemoveObserver(this); | 316 personal_data_manager_->RemoveObserver(this); |
| 331 } | 317 } |
| 332 | 318 |
| 333 jboolean PersonalDataManagerAndroid::IsDataLoaded( | 319 jboolean PersonalDataManagerAndroid::IsDataLoaded( |
| 334 JNIEnv* env, | 320 JNIEnv* env, |
| 335 const base::android::JavaParamRef<jobject>& unused_obj) const { | 321 const base::android::JavaParamRef<jobject>& unused_obj) const { |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 700 jlong PersonalDataManagerAndroid::GetCurrentDateForTesting( | 686 jlong PersonalDataManagerAndroid::GetCurrentDateForTesting( |
| 701 JNIEnv* env, | 687 JNIEnv* env, |
| 702 const base::android::JavaParamRef<jobject>& unused_obj) { | 688 const base::android::JavaParamRef<jobject>& unused_obj) { |
| 703 return base::Time::Now().ToTimeT(); | 689 return base::Time::Now().ToTimeT(); |
| 704 } | 690 } |
| 705 | 691 |
| 706 void PersonalDataManagerAndroid::LoadRulesForRegion( | 692 void PersonalDataManagerAndroid::LoadRulesForRegion( |
| 707 JNIEnv* env, | 693 JNIEnv* env, |
| 708 const base::android::JavaParamRef<jobject>& unused_obj, | 694 const base::android::JavaParamRef<jobject>& unused_obj, |
| 709 const base::android::JavaParamRef<jstring>& jregion_code) { | 695 const base::android::JavaParamRef<jstring>& jregion_code) { |
| 710 address_validator_.LoadRules(ConvertJavaStringToUTF8(env, jregion_code)); | 696 address_validator_helper_.LoadRulesForRegion( |
| 697 ConvertJavaStringToUTF8(env, jregion_code)); | |
| 711 } | 698 } |
| 712 | 699 |
| 713 void PersonalDataManagerAndroid::OnAddressValidationRulesLoaded( | 700 void PersonalDataManagerAndroid::StartAddressNormalization( |
| 714 const std::string& region_code, | |
| 715 bool success) { | |
| 716 // Check if an address normalization is pending. | |
| 717 auto it = pending_normalization_.find(region_code); | |
| 718 if (it != pending_normalization_.end()) { | |
| 719 for (size_t i = 0; i < it->second.size(); ++i) | |
| 720 it->second[i]->OnRulesSuccessfullyLoaded(); | |
| 721 pending_normalization_.erase(it); | |
| 722 } | |
| 723 } | |
| 724 | |
| 725 jboolean PersonalDataManagerAndroid::StartAddressNormalization( | |
| 726 JNIEnv* env, | 701 JNIEnv* env, |
| 727 const JavaParamRef<jobject>& unused_obj, | 702 const JavaParamRef<jobject>& unused_obj, |
| 728 const JavaParamRef<jstring>& jguid, | 703 const JavaParamRef<jstring>& jguid, |
| 729 const JavaParamRef<jstring>& jregion_code, | 704 const JavaParamRef<jstring>& jregion_code, |
| 730 const JavaParamRef<jobject>& jdelegate) { | 705 const JavaParamRef<jobject>& jdelegate) { |
| 731 const std::string region_code = ConvertJavaStringToUTF8(env, jregion_code); | 706 const std::string region_code = ConvertJavaStringToUTF8(env, jregion_code); |
| 732 const std::string guid = ConvertJavaStringToUTF8(env, jguid); | 707 const std::string guid = ConvertJavaStringToUTF8(env, jguid); |
| 733 | 708 |
| 734 std::unique_ptr<Delegate> requester(new AddressNormalizationRequester( | 709 // Get the profile to normalize. |
| 735 env, jdelegate, region_code, guid, AsWeakPtr())); | |
| 736 | |
| 737 // Check if the rules are already loaded. | |
| 738 if (AreRulesLoadedForRegion(region_code)) { | |
| 739 requester->OnRulesSuccessfullyLoaded(); | |
| 740 return false; | |
| 741 } else { | |
| 742 // Setup the variables so the profile gets normalized when the rules have | |
| 743 // finished loading. | |
| 744 auto it = pending_normalization_.find(region_code); | |
| 745 if (it == pending_normalization_.end()) { | |
| 746 // If no entry exists yet, create the entry and assign it to |it|. | |
| 747 it = pending_normalization_ | |
| 748 .insert(std::make_pair(region_code, | |
| 749 std::vector<std::unique_ptr<Delegate>>())) | |
| 750 .first; | |
| 751 } | |
| 752 | |
| 753 it->second.push_back(std::move(requester)); | |
| 754 | |
| 755 return true; | |
| 756 } | |
| 757 } | |
| 758 | |
| 759 ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::NormalizeAddress( | |
| 760 const std::string& guid, | |
| 761 const std::string& region_code, | |
| 762 JNIEnv* env) { | |
| 763 AutofillProfile* profile = personal_data_manager_->GetProfileByGUID(guid); | 710 AutofillProfile* profile = personal_data_manager_->GetProfileByGUID(guid); |
| 764 | 711 |
| 765 if (!profile || !AreRulesLoadedForRegion(region_code)) | 712 // Self-deleting object. |
| 766 return nullptr; | 713 AndroidAddressNormalizationRequester* requester = |
| 714 new AndroidAddressNormalizationRequester(env, jdelegate); | |
| 767 | 715 |
| 768 // Create the AddressData from the profile. | 716 // Start the normalization. |
| 769 ::i18n::addressinput::AddressData address_data = | 717 address_validator_helper_.StartAddressNormalization(*profile, region_code, |
| 770 *i18n::CreateAddressDataFromAutofillProfile( | 718 requester); |
| 771 *profile, personal_data_manager_->app_locale()); | |
| 772 | |
| 773 // Normalize the address. | |
| 774 if (address_validator_.NormalizeAddress(&address_data)) { | |
| 775 profile->SetRawInfo(ADDRESS_HOME_STATE, | |
| 776 base::UTF8ToUTF16(address_data.administrative_area)); | |
| 777 profile->SetRawInfo(ADDRESS_HOME_CITY, | |
| 778 base::UTF8ToUTF16(address_data.locality)); | |
| 779 profile->SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, | |
| 780 base::UTF8ToUTF16(address_data.dependent_locality)); | |
| 781 } | |
| 782 | |
| 783 return CreateJavaProfileFromNative(env, *profile); | |
| 784 } | |
| 785 | |
| 786 void PersonalDataManagerAndroid::CancelPendingAddressNormalizations( | |
| 787 JNIEnv* env, | |
| 788 const base::android::JavaParamRef<jobject>& unused_obj) { | |
| 789 pending_normalization_.clear(); | |
| 790 } | 719 } |
| 791 | 720 |
| 792 jboolean PersonalDataManagerAndroid::HasProfiles( | 721 jboolean PersonalDataManagerAndroid::HasProfiles( |
| 793 JNIEnv* env, | 722 JNIEnv* env, |
| 794 const base::android::JavaParamRef<jobject>& unused_obj) { | 723 const base::android::JavaParamRef<jobject>& unused_obj) { |
| 795 return !personal_data_manager_->GetProfiles().empty(); | 724 return !personal_data_manager_->GetProfiles().empty(); |
| 796 } | 725 } |
| 797 | 726 |
| 798 jboolean PersonalDataManagerAndroid::HasCreditCards( | 727 jboolean PersonalDataManagerAndroid::HasCreditCards( |
| 799 JNIEnv* env, | 728 JNIEnv* env, |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 816 const std::vector<CreditCard*>& credit_cards) { | 745 const std::vector<CreditCard*>& credit_cards) { |
| 817 std::vector<base::string16> guids; | 746 std::vector<base::string16> guids; |
| 818 for (CreditCard* credit_card : credit_cards) | 747 for (CreditCard* credit_card : credit_cards) |
| 819 guids.push_back(base::UTF8ToUTF16(credit_card->guid())); | 748 guids.push_back(base::UTF8ToUTF16(credit_card->guid())); |
| 820 | 749 |
| 821 return base::android::ToJavaArrayOfStrings(env, guids); | 750 return base::android::ToJavaArrayOfStrings(env, guids); |
| 822 } | 751 } |
| 823 | 752 |
| 824 bool PersonalDataManagerAndroid::AreRulesLoadedForRegion( | 753 bool PersonalDataManagerAndroid::AreRulesLoadedForRegion( |
| 825 const std::string& region_code) { | 754 const std::string& region_code) { |
| 826 return address_validator_.AreRulesLoadedForRegion(region_code); | 755 return address_validator_helper_.AreRulesLoadedForRegion(region_code); |
| 827 } | 756 } |
| 828 | 757 |
| 829 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileLabels( | 758 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileLabels( |
| 830 JNIEnv* env, | 759 JNIEnv* env, |
| 831 bool address_only, | 760 bool address_only, |
| 832 bool include_name_in_label, | 761 bool include_name_in_label, |
| 833 bool include_organization_in_label, | 762 bool include_organization_in_label, |
| 834 bool include_country_in_label, | 763 bool include_country_in_label, |
| 835 std::vector<AutofillProfile*> profiles) { | 764 std::vector<AutofillProfile*> profiles) { |
| 836 std::unique_ptr<std::vector<ServerFieldType>> suggested_fields; | 765 std::unique_ptr<std::vector<ServerFieldType>> suggested_fields; |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 936 base::android::ConvertJavaStringToUTF16(env, jcountry_name))); | 865 base::android::ConvertJavaStringToUTF16(env, jcountry_name))); |
| 937 } | 866 } |
| 938 | 867 |
| 939 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 868 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
| 940 PersonalDataManagerAndroid* personal_data_manager_android = | 869 PersonalDataManagerAndroid* personal_data_manager_android = |
| 941 new PersonalDataManagerAndroid(env, obj); | 870 new PersonalDataManagerAndroid(env, obj); |
| 942 return reinterpret_cast<intptr_t>(personal_data_manager_android); | 871 return reinterpret_cast<intptr_t>(personal_data_manager_android); |
| 943 } | 872 } |
| 944 | 873 |
| 945 } // namespace autofill | 874 } // namespace autofill |
| OLD | NEW |