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> |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 } | 298 } |
299 | 299 |
300 private: | 300 private: |
301 ~AndroidAddressNormalizerDelegate() override {} | 301 ~AndroidAddressNormalizerDelegate() override {} |
302 | 302 |
303 ScopedJavaGlobalRef<jobject> jdelegate_; | 303 ScopedJavaGlobalRef<jobject> jdelegate_; |
304 | 304 |
305 DISALLOW_COPY_AND_ASSIGN(AndroidAddressNormalizerDelegate); | 305 DISALLOW_COPY_AND_ASSIGN(AndroidAddressNormalizerDelegate); |
306 }; | 306 }; |
307 | 307 |
| 308 class GetSubKeysRequester : public PersonalDataManagerAndroid::Delegate, |
| 309 public base::SupportsWeakPtr<GetSubKeysRequester> { |
| 310 public: |
| 311 GetSubKeysRequester( |
| 312 JNIEnv* env, |
| 313 const base::android::JavaParamRef<jobject>& jdelegate, |
| 314 const std::string& region_code, |
| 315 base::WeakPtr<PersonalDataManagerAndroid> personal_data_manager_android) { |
| 316 jdelegate_.Reset(env, jdelegate); |
| 317 region_code_ = region_code; |
| 318 personal_data_manager_android_ = personal_data_manager_android; |
| 319 env_ = env; |
| 320 } |
| 321 |
| 322 private: |
| 323 ~GetSubKeysRequester() override {} |
| 324 |
| 325 void OnRulesSuccessfullyLoaded() override { |
| 326 if (personal_data_manager_android_) { |
| 327 JNIEnv* env = base::android::AttachCurrentThread(); |
| 328 Java_GetSubKeysRequestDelegate_onSubKeysReceived( |
| 329 env, jdelegate_, |
| 330 personal_data_manager_android_->GetSubKeys(env, region_code_)); |
| 331 } |
| 332 } |
| 333 |
| 334 ScopedJavaGlobalRef<jobject> jdelegate_; |
| 335 std::string region_code_; |
| 336 base::WeakPtr<PersonalDataManagerAndroid> personal_data_manager_android_; |
| 337 JNIEnv* env_; |
| 338 |
| 339 DISALLOW_COPY_AND_ASSIGN(GetSubKeysRequester); |
| 340 }; |
| 341 |
308 } // namespace | 342 } // namespace |
309 | 343 |
310 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, jobject obj) | 344 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, jobject obj) |
311 : weak_java_obj_(env, obj), | 345 : weak_java_obj_(env, obj), |
312 personal_data_manager_(PersonalDataManagerFactory::GetForProfile( | 346 personal_data_manager_(PersonalDataManagerFactory::GetForProfile( |
313 ProfileManager::GetActiveUserProfile())), | 347 ProfileManager::GetActiveUserProfile())), |
314 address_normalizer_( | 348 address_normalizer_( |
315 std::unique_ptr<::i18n::addressinput::Source>( | 349 std::unique_ptr<::i18n::addressinput::Source>( |
316 new autofill::ChromeMetadataSource( | 350 new autofill::ChromeMetadataSource( |
317 I18N_ADDRESS_VALIDATION_DATA_URL, | 351 I18N_ADDRESS_VALIDATION_DATA_URL, |
318 personal_data_manager_->GetURLRequestContextGetter())), | 352 personal_data_manager_->GetURLRequestContextGetter())), |
319 ValidationRulesStorageFactory::CreateStorage()) { | 353 ValidationRulesStorageFactory::CreateStorage()), |
| 354 address_validator_( |
| 355 std::unique_ptr<::i18n::addressinput::Source>( |
| 356 new autofill::ChromeMetadataSource( |
| 357 I18N_ADDRESS_VALIDATION_DATA_URL, |
| 358 personal_data_manager_->GetURLRequestContextGetter())), |
| 359 ValidationRulesStorageFactory::CreateStorage(), |
| 360 this) { |
320 personal_data_manager_->AddObserver(this); | 361 personal_data_manager_->AddObserver(this); |
321 } | 362 } |
322 | 363 |
323 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { | 364 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { |
324 personal_data_manager_->RemoveObserver(this); | 365 personal_data_manager_->RemoveObserver(this); |
325 } | 366 } |
326 | 367 |
327 jboolean PersonalDataManagerAndroid::IsDataLoaded( | 368 jboolean PersonalDataManagerAndroid::IsDataLoaded( |
328 JNIEnv* env, | 369 JNIEnv* env, |
329 const base::android::JavaParamRef<jobject>& unused_obj) const { | 370 const base::android::JavaParamRef<jobject>& unused_obj) const { |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
690 return card->use_date().ToTimeT(); | 731 return card->use_date().ToTimeT(); |
691 } | 732 } |
692 | 733 |
693 // TODO(crbug.com/629507): Use a mock clock for testing. | 734 // TODO(crbug.com/629507): Use a mock clock for testing. |
694 jlong PersonalDataManagerAndroid::GetCurrentDateForTesting( | 735 jlong PersonalDataManagerAndroid::GetCurrentDateForTesting( |
695 JNIEnv* env, | 736 JNIEnv* env, |
696 const base::android::JavaParamRef<jobject>& unused_obj) { | 737 const base::android::JavaParamRef<jobject>& unused_obj) { |
697 return base::Time::Now().ToTimeT(); | 738 return base::Time::Now().ToTimeT(); |
698 } | 739 } |
699 | 740 |
700 void PersonalDataManagerAndroid::LoadRulesForRegion( | 741 void PersonalDataManagerAndroid::LoadRulesForAddressNormalization( |
701 JNIEnv* env, | 742 JNIEnv* env, |
702 const base::android::JavaParamRef<jobject>& unused_obj, | 743 const base::android::JavaParamRef<jobject>& unused_obj, |
703 const base::android::JavaParamRef<jstring>& jregion_code) { | 744 const base::android::JavaParamRef<jstring>& jregion_code) { |
704 address_normalizer_.LoadRulesForRegion( | 745 address_normalizer_.LoadRulesForRegion( |
705 ConvertJavaStringToUTF8(env, jregion_code)); | 746 ConvertJavaStringToUTF8(env, jregion_code)); |
706 } | 747 } |
707 | 748 |
| 749 void PersonalDataManagerAndroid::LoadRulesForSubKeys( |
| 750 JNIEnv* env, |
| 751 const base::android::JavaParamRef<jobject>& unused_obj, |
| 752 const base::android::JavaParamRef<jstring>& jregion_code) { |
| 753 address_validator_.LoadRules(ConvertJavaStringToUTF8(env, jregion_code)); |
| 754 } |
| 755 |
708 void PersonalDataManagerAndroid::StartAddressNormalization( | 756 void PersonalDataManagerAndroid::StartAddressNormalization( |
709 JNIEnv* env, | 757 JNIEnv* env, |
710 const JavaParamRef<jobject>& unused_obj, | 758 const JavaParamRef<jobject>& unused_obj, |
711 const JavaParamRef<jstring>& jguid, | 759 const JavaParamRef<jstring>& jguid, |
712 const JavaParamRef<jstring>& jregion_code, | 760 const JavaParamRef<jstring>& jregion_code, |
713 jint jtimeout_seconds, | 761 jint jtimeout_seconds, |
714 const JavaParamRef<jobject>& jdelegate) { | 762 const JavaParamRef<jobject>& jdelegate) { |
715 const std::string region_code = ConvertJavaStringToUTF8(env, jregion_code); | 763 const std::string region_code = ConvertJavaStringToUTF8(env, jregion_code); |
716 const std::string guid = ConvertJavaStringToUTF8(env, jguid); | 764 const std::string guid = ConvertJavaStringToUTF8(env, jguid); |
717 | 765 |
(...skipping 14 matching lines...) Expand all Loading... |
732 const base::android::JavaParamRef<jobject>& unused_obj) { | 780 const base::android::JavaParamRef<jobject>& unused_obj) { |
733 return !personal_data_manager_->GetProfiles().empty(); | 781 return !personal_data_manager_->GetProfiles().empty(); |
734 } | 782 } |
735 | 783 |
736 jboolean PersonalDataManagerAndroid::HasCreditCards( | 784 jboolean PersonalDataManagerAndroid::HasCreditCards( |
737 JNIEnv* env, | 785 JNIEnv* env, |
738 const base::android::JavaParamRef<jobject>& unused_obj) { | 786 const base::android::JavaParamRef<jobject>& unused_obj) { |
739 return !personal_data_manager_->GetCreditCards().empty(); | 787 return !personal_data_manager_->GetCreditCards().empty(); |
740 } | 788 } |
741 | 789 |
| 790 base::android::ScopedJavaLocalRef<jobjectArray> |
| 791 PersonalDataManagerAndroid::GetSubKeys(JNIEnv* env, |
| 792 const std::string& region_code) { |
| 793 std::vector<std::string> sub_keys = |
| 794 address_validator_.GetRegionSubKeys(region_code); |
| 795 return base::android::ToJavaArrayOfStrings(env, sub_keys); |
| 796 } |
| 797 |
| 798 void PersonalDataManagerAndroid::OnAddressRulesLoaded( |
| 799 const std::string& region_code, |
| 800 bool success) { |
| 801 // Check if there is any sub-key request. |
| 802 auto it = pending_subkeys_request_.find(region_code); |
| 803 if (it != pending_subkeys_request_.end()) { |
| 804 for (size_t i = 0; i < it->second.size(); ++i) { |
| 805 it->second[i]->OnRulesSuccessfullyLoaded(); |
| 806 } |
| 807 pending_subkeys_request_.erase(it); |
| 808 } |
| 809 } |
| 810 |
| 811 void PersonalDataManagerAndroid::StartGettingRegionSubKeys( |
| 812 JNIEnv* env, |
| 813 const JavaParamRef<jobject>& unused_obj, |
| 814 const JavaParamRef<jstring>& jregion_code, |
| 815 const JavaParamRef<jobject>& jdelegate) { |
| 816 const std::string region_code = ConvertJavaStringToUTF8(env, jregion_code); |
| 817 std::unique_ptr<Delegate> requester( |
| 818 new GetSubKeysRequester(env, jdelegate, region_code, AsWeakPtr())); |
| 819 |
| 820 if (AreRulesLoadedForRegion(region_code)) { |
| 821 requester->OnRulesSuccessfullyLoaded(); |
| 822 } else { |
| 823 // Setup the variables so that the sub-keys request is sent, when the rules |
| 824 // are loaded. |
| 825 auto it = pending_subkeys_request_.find(region_code); |
| 826 if (it == pending_subkeys_request_.end()) { |
| 827 // If no entry exists, create the entry and assign it to |it|. |
| 828 it = pending_subkeys_request_ |
| 829 .insert(std::make_pair(region_code, |
| 830 std::vector<std::unique_ptr<Delegate>>())) |
| 831 .first; |
| 832 } |
| 833 it->second.push_back(std::move(requester)); |
| 834 } |
| 835 } |
| 836 |
| 837 void PersonalDataManagerAndroid::CancelPendingGetSubKeys( |
| 838 JNIEnv* env, |
| 839 const base::android::JavaParamRef<jobject>& unused_obj) { |
| 840 pending_subkeys_request_.clear(); |
| 841 } |
| 842 |
742 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileGUIDs( | 843 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileGUIDs( |
743 JNIEnv* env, | 844 JNIEnv* env, |
744 const std::vector<AutofillProfile*>& profiles) { | 845 const std::vector<AutofillProfile*>& profiles) { |
745 std::vector<base::string16> guids; | 846 std::vector<base::string16> guids; |
746 for (AutofillProfile* profile : profiles) | 847 for (AutofillProfile* profile : profiles) |
747 guids.push_back(base::UTF8ToUTF16(profile->guid())); | 848 guids.push_back(base::UTF8ToUTF16(profile->guid())); |
748 | 849 |
749 return base::android::ToJavaArrayOfStrings(env, guids); | 850 return base::android::ToJavaArrayOfStrings(env, guids); |
750 } | 851 } |
751 | 852 |
752 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetCreditCardGUIDs( | 853 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetCreditCardGUIDs( |
753 JNIEnv* env, | 854 JNIEnv* env, |
754 const std::vector<CreditCard*>& credit_cards) { | 855 const std::vector<CreditCard*>& credit_cards) { |
755 std::vector<base::string16> guids; | 856 std::vector<base::string16> guids; |
756 for (CreditCard* credit_card : credit_cards) | 857 for (CreditCard* credit_card : credit_cards) |
757 guids.push_back(base::UTF8ToUTF16(credit_card->guid())); | 858 guids.push_back(base::UTF8ToUTF16(credit_card->guid())); |
758 | 859 |
759 return base::android::ToJavaArrayOfStrings(env, guids); | 860 return base::android::ToJavaArrayOfStrings(env, guids); |
760 } | 861 } |
761 | 862 |
762 bool PersonalDataManagerAndroid::AreRulesLoadedForRegion( | 863 bool PersonalDataManagerAndroid::AreRulesLoadedForRegion( |
763 const std::string& region_code) { | 864 const std::string& region_code) { |
764 return address_normalizer_.AreRulesLoadedForRegion(region_code); | 865 return address_validator_.AreRulesLoadedForRegion(region_code); |
765 } | 866 } |
766 | 867 |
767 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileLabels( | 868 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileLabels( |
768 JNIEnv* env, | 869 JNIEnv* env, |
769 bool address_only, | 870 bool address_only, |
770 bool include_name_in_label, | 871 bool include_name_in_label, |
771 bool include_organization_in_label, | 872 bool include_organization_in_label, |
772 bool include_country_in_label, | 873 bool include_country_in_label, |
773 std::vector<AutofillProfile*> profiles) { | 874 std::vector<AutofillProfile*> profiles) { |
774 std::unique_ptr<std::vector<ServerFieldType>> suggested_fields; | 875 std::unique_ptr<std::vector<ServerFieldType>> suggested_fields; |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
874 base::android::ConvertJavaStringToUTF16(env, jcountry_name))); | 975 base::android::ConvertJavaStringToUTF16(env, jcountry_name))); |
875 } | 976 } |
876 | 977 |
877 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 978 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
878 PersonalDataManagerAndroid* personal_data_manager_android = | 979 PersonalDataManagerAndroid* personal_data_manager_android = |
879 new PersonalDataManagerAndroid(env, obj); | 980 new PersonalDataManagerAndroid(env, obj); |
880 return reinterpret_cast<intptr_t>(personal_data_manager_android); | 981 return reinterpret_cast<intptr_t>(personal_data_manager_android); |
881 } | 982 } |
882 | 983 |
883 } // namespace autofill | 984 } // namespace autofill |
OLD | NEW |