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/memory/ptr_util.h" | |
17 #include "base/strings/utf_string_conversions.h" | 16 #include "base/strings/utf_string_conversions.h" |
18 #include "base/time/time.h" | 17 #include "base/time/time.h" |
19 #include "chrome/browser/android/resource_mapper.h" | 18 #include "chrome/browser/android/resource_mapper.h" |
20 #include "chrome/browser/autofill/personal_data_manager_factory.h" | 19 #include "chrome/browser/autofill/personal_data_manager_factory.h" |
21 #include "chrome/browser/autofill/validation_rules_storage_factory.h" | 20 #include "chrome/browser/autofill/validation_rules_storage_factory.h" |
22 #include "chrome/browser/browser_process.h" | 21 #include "chrome/browser/browser_process.h" |
23 #include "chrome/browser/profiles/profile.h" | 22 #include "chrome/browser/profiles/profile.h" |
24 #include "chrome/browser/profiles/profile_manager.h" | 23 #include "chrome/browser/profiles/profile_manager.h" |
25 #include "chrome/common/pref_names.h" | 24 #include "chrome/common/pref_names.h" |
26 #include "components/autofill/content/browser/content_autofill_driver.h" | 25 #include "components/autofill/content/browser/content_autofill_driver.h" |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 } | 298 } |
300 | 299 |
301 private: | 300 private: |
302 ~AndroidAddressNormalizerDelegate() override {} | 301 ~AndroidAddressNormalizerDelegate() override {} |
303 | 302 |
304 ScopedJavaGlobalRef<jobject> jdelegate_; | 303 ScopedJavaGlobalRef<jobject> jdelegate_; |
305 | 304 |
306 DISALLOW_COPY_AND_ASSIGN(AndroidAddressNormalizerDelegate); | 305 DISALLOW_COPY_AND_ASSIGN(AndroidAddressNormalizerDelegate); |
307 }; | 306 }; |
308 | 307 |
309 class AndroidSubKeyRequesterDelegate | |
310 : public PersonalDataManagerAndroid::SubKeyRequestDelegate, | |
311 public base::SupportsWeakPtr<AndroidSubKeyRequesterDelegate> { | |
312 public: | |
313 AndroidSubKeyRequesterDelegate( | |
314 JNIEnv* env, | |
315 const base::android::JavaParamRef<jobject>& jdelegate, | |
316 const std::string& region_code, | |
317 base::WeakPtr<PersonalDataManagerAndroid> personal_data_manager_android) { | |
318 jdelegate_.Reset(env, jdelegate); | |
319 region_code_ = region_code; | |
320 personal_data_manager_android_ = personal_data_manager_android; | |
321 } | |
322 | |
323 ~AndroidSubKeyRequesterDelegate() override {} | |
324 | |
325 private: | |
326 // PersonalDataManagerAndroid::SubKeyRequestDelegate: | |
327 void OnRulesSuccessfullyLoaded() override { | |
328 if (personal_data_manager_android_) { | |
329 JNIEnv* env = base::android::AttachCurrentThread(); | |
330 Java_GetSubKeysRequestDelegate_onSubKeysReceived( | |
331 env, jdelegate_, | |
332 personal_data_manager_android_->GetSubKeys(env, region_code_)); | |
333 } | |
334 } | |
335 | |
336 ScopedJavaGlobalRef<jobject> jdelegate_; | |
337 std::string region_code_; | |
338 base::WeakPtr<PersonalDataManagerAndroid> personal_data_manager_android_; | |
339 | |
340 DISALLOW_COPY_AND_ASSIGN(AndroidSubKeyRequesterDelegate); | |
341 }; | |
342 | |
343 } // namespace | 308 } // namespace |
344 | 309 |
345 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, jobject obj) | 310 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, jobject obj) |
346 : weak_java_obj_(env, obj), | 311 : weak_java_obj_(env, obj), |
347 personal_data_manager_(PersonalDataManagerFactory::GetForProfile( | 312 personal_data_manager_(PersonalDataManagerFactory::GetForProfile( |
348 ProfileManager::GetActiveUserProfile())), | 313 ProfileManager::GetActiveUserProfile())), |
349 address_normalizer_( | 314 address_normalizer_( |
350 std::unique_ptr<::i18n::addressinput::Source>( | 315 std::unique_ptr<::i18n::addressinput::Source>( |
351 new autofill::ChromeMetadataSource( | 316 new autofill::ChromeMetadataSource( |
352 I18N_ADDRESS_VALIDATION_DATA_URL, | 317 I18N_ADDRESS_VALIDATION_DATA_URL, |
353 personal_data_manager_->GetURLRequestContextGetter())), | 318 personal_data_manager_->GetURLRequestContextGetter())), |
354 ValidationRulesStorageFactory::CreateStorage()), | 319 ValidationRulesStorageFactory::CreateStorage()) { |
355 address_validator_( | |
356 base::MakeUnique<autofill::ChromeMetadataSource>( | |
357 I18N_ADDRESS_VALIDATION_DATA_URL, | |
358 personal_data_manager_->GetURLRequestContextGetter()), | |
359 ValidationRulesStorageFactory::CreateStorage(), | |
360 this) { | |
361 personal_data_manager_->AddObserver(this); | 320 personal_data_manager_->AddObserver(this); |
362 } | 321 } |
363 | 322 |
364 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { | 323 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { |
365 personal_data_manager_->RemoveObserver(this); | 324 personal_data_manager_->RemoveObserver(this); |
366 } | 325 } |
367 | 326 |
368 jboolean PersonalDataManagerAndroid::IsDataLoaded( | 327 jboolean PersonalDataManagerAndroid::IsDataLoaded( |
369 JNIEnv* env, | 328 JNIEnv* env, |
370 const base::android::JavaParamRef<jobject>& unused_obj) const { | 329 const base::android::JavaParamRef<jobject>& unused_obj) const { |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
731 return card->use_date().ToTimeT(); | 690 return card->use_date().ToTimeT(); |
732 } | 691 } |
733 | 692 |
734 // TODO(crbug.com/629507): Use a mock clock for testing. | 693 // TODO(crbug.com/629507): Use a mock clock for testing. |
735 jlong PersonalDataManagerAndroid::GetCurrentDateForTesting( | 694 jlong PersonalDataManagerAndroid::GetCurrentDateForTesting( |
736 JNIEnv* env, | 695 JNIEnv* env, |
737 const base::android::JavaParamRef<jobject>& unused_obj) { | 696 const base::android::JavaParamRef<jobject>& unused_obj) { |
738 return base::Time::Now().ToTimeT(); | 697 return base::Time::Now().ToTimeT(); |
739 } | 698 } |
740 | 699 |
741 void PersonalDataManagerAndroid::LoadRulesForAddressNormalization( | 700 void PersonalDataManagerAndroid::LoadRulesForRegion( |
742 JNIEnv* env, | 701 JNIEnv* env, |
743 const base::android::JavaParamRef<jobject>& unused_obj, | 702 const base::android::JavaParamRef<jobject>& unused_obj, |
744 const base::android::JavaParamRef<jstring>& jregion_code) { | 703 const base::android::JavaParamRef<jstring>& jregion_code) { |
745 address_normalizer_.LoadRulesForRegion( | 704 address_normalizer_.LoadRulesForRegion( |
746 ConvertJavaStringToUTF8(env, jregion_code)); | 705 ConvertJavaStringToUTF8(env, jregion_code)); |
747 } | 706 } |
748 | 707 |
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 | |
756 void PersonalDataManagerAndroid::StartAddressNormalization( | 708 void PersonalDataManagerAndroid::StartAddressNormalization( |
757 JNIEnv* env, | 709 JNIEnv* env, |
758 const JavaParamRef<jobject>& unused_obj, | 710 const JavaParamRef<jobject>& unused_obj, |
759 const JavaParamRef<jobject>& jprofile, | 711 const JavaParamRef<jobject>& jprofile, |
760 const JavaParamRef<jstring>& jregion_code, | 712 const JavaParamRef<jstring>& jregion_code, |
761 jint jtimeout_seconds, | 713 jint jtimeout_seconds, |
762 const JavaParamRef<jobject>& jdelegate) { | 714 const JavaParamRef<jobject>& jdelegate) { |
763 const std::string region_code = ConvertJavaStringToUTF8(env, jregion_code); | 715 const std::string region_code = ConvertJavaStringToUTF8(env, jregion_code); |
764 | 716 |
765 AutofillProfile profile; | 717 AutofillProfile profile; |
(...skipping 13 matching lines...) Expand all Loading... |
779 const base::android::JavaParamRef<jobject>& unused_obj) { | 731 const base::android::JavaParamRef<jobject>& unused_obj) { |
780 return !personal_data_manager_->GetProfiles().empty(); | 732 return !personal_data_manager_->GetProfiles().empty(); |
781 } | 733 } |
782 | 734 |
783 jboolean PersonalDataManagerAndroid::HasCreditCards( | 735 jboolean PersonalDataManagerAndroid::HasCreditCards( |
784 JNIEnv* env, | 736 JNIEnv* env, |
785 const base::android::JavaParamRef<jobject>& unused_obj) { | 737 const base::android::JavaParamRef<jobject>& unused_obj) { |
786 return !personal_data_manager_->GetCreditCards().empty(); | 738 return !personal_data_manager_->GetCreditCards().empty(); |
787 } | 739 } |
788 | 740 |
789 base::android::ScopedJavaLocalRef<jobjectArray> | |
790 PersonalDataManagerAndroid::GetSubKeys(JNIEnv* env, | |
791 const std::string& region_code) { | |
792 std::vector<std::string> sub_keys = | |
793 address_validator_.GetRegionSubKeys(region_code); | |
794 return base::android::ToJavaArrayOfStrings(env, sub_keys); | |
795 } | |
796 | |
797 void PersonalDataManagerAndroid::OnAddressRulesLoaded( | |
798 const std::string& region_code, | |
799 bool success) { | |
800 // if |success| == false, AddressValidator::GetRegionSubKeys will return an | |
801 // empty list of sub-keys. => No need to check for |success|. | |
802 // Check if there is any sub-key request for that region code. | |
803 if (!pending_subkey_region_code_.compare(region_code)) | |
804 pending_subkey_request_->OnRulesSuccessfullyLoaded(); | |
805 pending_subkey_region_code_.clear(); | |
806 pending_subkey_request_.reset(); | |
807 } | |
808 | |
809 void PersonalDataManagerAndroid::StartRegionSubKeysRequest( | |
810 JNIEnv* env, | |
811 const JavaParamRef<jobject>& unused_obj, | |
812 const JavaParamRef<jstring>& jregion_code, | |
813 const JavaParamRef<jobject>& jdelegate) { | |
814 const std::string region_code = ConvertJavaStringToUTF8(env, jregion_code); | |
815 std::unique_ptr<SubKeyRequestDelegate> requester = | |
816 base::MakeUnique<AndroidSubKeyRequesterDelegate>( | |
817 env, jdelegate, region_code, AsWeakPtr()); | |
818 | |
819 if (AreRulesLoadedForRegion(region_code)) { | |
820 requester->OnRulesSuccessfullyLoaded(); | |
821 } else { | |
822 // Setup the variables so that the sub-keys request is sent, when the rules | |
823 // are loaded. | |
824 pending_subkey_region_code_ = region_code; | |
825 pending_subkey_request_ = std::move(requester); | |
826 } | |
827 } | |
828 | |
829 void PersonalDataManagerAndroid::CancelPendingGetSubKeys( | |
830 JNIEnv* env, | |
831 const base::android::JavaParamRef<jobject>& unused_obj) { | |
832 pending_subkey_region_code_.clear(); | |
833 pending_subkey_request_.reset(); | |
834 } | |
835 | |
836 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileGUIDs( | 741 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileGUIDs( |
837 JNIEnv* env, | 742 JNIEnv* env, |
838 const std::vector<AutofillProfile*>& profiles) { | 743 const std::vector<AutofillProfile*>& profiles) { |
839 std::vector<base::string16> guids; | 744 std::vector<base::string16> guids; |
840 for (AutofillProfile* profile : profiles) | 745 for (AutofillProfile* profile : profiles) |
841 guids.push_back(base::UTF8ToUTF16(profile->guid())); | 746 guids.push_back(base::UTF8ToUTF16(profile->guid())); |
842 | 747 |
843 return base::android::ToJavaArrayOfStrings(env, guids); | 748 return base::android::ToJavaArrayOfStrings(env, guids); |
844 } | 749 } |
845 | 750 |
846 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetCreditCardGUIDs( | 751 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetCreditCardGUIDs( |
847 JNIEnv* env, | 752 JNIEnv* env, |
848 const std::vector<CreditCard*>& credit_cards) { | 753 const std::vector<CreditCard*>& credit_cards) { |
849 std::vector<base::string16> guids; | 754 std::vector<base::string16> guids; |
850 for (CreditCard* credit_card : credit_cards) | 755 for (CreditCard* credit_card : credit_cards) |
851 guids.push_back(base::UTF8ToUTF16(credit_card->guid())); | 756 guids.push_back(base::UTF8ToUTF16(credit_card->guid())); |
852 | 757 |
853 return base::android::ToJavaArrayOfStrings(env, guids); | 758 return base::android::ToJavaArrayOfStrings(env, guids); |
854 } | 759 } |
855 | 760 |
856 bool PersonalDataManagerAndroid::AreRulesLoadedForRegion( | 761 bool PersonalDataManagerAndroid::AreRulesLoadedForRegion( |
857 const std::string& region_code) { | 762 const std::string& region_code) { |
858 return address_validator_.AreRulesLoadedForRegion(region_code); | 763 return address_normalizer_.AreRulesLoadedForRegion(region_code); |
859 } | 764 } |
860 | 765 |
861 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileLabels( | 766 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileLabels( |
862 JNIEnv* env, | 767 JNIEnv* env, |
863 bool address_only, | 768 bool address_only, |
864 bool include_name_in_label, | 769 bool include_name_in_label, |
865 bool include_organization_in_label, | 770 bool include_organization_in_label, |
866 bool include_country_in_label, | 771 bool include_country_in_label, |
867 std::vector<AutofillProfile*> profiles) { | 772 std::vector<AutofillProfile*> profiles) { |
868 std::unique_ptr<std::vector<ServerFieldType>> suggested_fields; | 773 std::unique_ptr<std::vector<ServerFieldType>> suggested_fields; |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
968 base::android::ConvertJavaStringToUTF16(env, jcountry_name))); | 873 base::android::ConvertJavaStringToUTF16(env, jcountry_name))); |
969 } | 874 } |
970 | 875 |
971 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 876 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
972 PersonalDataManagerAndroid* personal_data_manager_android = | 877 PersonalDataManagerAndroid* personal_data_manager_android = |
973 new PersonalDataManagerAndroid(env, obj); | 878 new PersonalDataManagerAndroid(env, obj); |
974 return reinterpret_cast<intptr_t>(personal_data_manager_android); | 879 return reinterpret_cast<intptr_t>(personal_data_manager_android); |
975 } | 880 } |
976 | 881 |
977 } // namespace autofill | 882 } // namespace autofill |
OLD | NEW |