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/weak_ptr.h" | |
17 #include "base/strings/stringprintf.h" | 16 #include "base/strings/stringprintf.h" |
18 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
19 #include "base/time/time.h" | 18 #include "base/time/time.h" |
20 #include "chrome/browser/android/resource_mapper.h" | 19 #include "chrome/browser/android/resource_mapper.h" |
21 #include "chrome/browser/autofill/personal_data_manager_factory.h" | 20 #include "chrome/browser/autofill/personal_data_manager_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" |
27 #include "components/autofill/content/browser/content_autofill_driver_factory.h" | 26 #include "components/autofill/content/browser/content_autofill_driver_factory.h" |
| 27 #include "components/autofill/core/browser/address_i18n.h" |
28 #include "components/autofill/core/browser/autofill_country.h" | 28 #include "components/autofill/core/browser/autofill_country.h" |
29 #include "components/autofill/core/browser/autofill_data_util.h" | 29 #include "components/autofill/core/browser/autofill_data_util.h" |
30 #include "components/autofill/core/browser/autofill_type.h" | 30 #include "components/autofill/core/browser/autofill_type.h" |
31 #include "components/autofill/core/browser/country_names.h" | 31 #include "components/autofill/core/browser/country_names.h" |
32 #include "components/autofill/core/browser/field_types.h" | 32 #include "components/autofill/core/browser/field_types.h" |
33 #include "components/autofill/core/browser/payments/full_card_request.h" | 33 #include "components/autofill/core/browser/payments/full_card_request.h" |
34 #include "components/autofill/core/browser/personal_data_manager.h" | 34 #include "components/autofill/core/browser/personal_data_manager.h" |
35 #include "components/autofill/core/browser/validation.h" | 35 #include "components/autofill/core/browser/validation.h" |
36 #include "components/autofill/core/common/autofill_constants.h" | 36 #include "components/autofill/core/common/autofill_constants.h" |
37 #include "components/autofill/core/common/autofill_pref_names.h" | 37 #include "components/autofill/core/common/autofill_pref_names.h" |
38 #include "components/autofill/core/common/autofill_switches.h" | 38 #include "components/autofill/core/common/autofill_switches.h" |
39 #include "components/grit/components_scaled_resources.h" | 39 #include "components/grit/components_scaled_resources.h" |
40 #include "components/prefs/pref_service.h" | 40 #include "components/prefs/pref_service.h" |
41 #include "content/public/browser/web_contents.h" | 41 #include "content/public/browser/web_contents.h" |
42 #include "jni/PersonalDataManager_jni.h" | 42 #include "jni/PersonalDataManager_jni.h" |
| 43 #include "third_party/libaddressinput/chromium/chrome_metadata_source.h" |
| 44 #include "third_party/libaddressinput/chromium/chrome_storage_impl.h" |
| 45 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_da
ta.h" |
43 | 46 |
44 using base::android::ConvertJavaStringToUTF8; | 47 using base::android::ConvertJavaStringToUTF8; |
45 using base::android::ConvertUTF16ToJavaString; | 48 using base::android::ConvertUTF16ToJavaString; |
46 using base::android::ConvertUTF8ToJavaString; | 49 using base::android::ConvertUTF8ToJavaString; |
47 using base::android::JavaParamRef; | 50 using base::android::JavaParamRef; |
48 using base::android::ScopedJavaGlobalRef; | 51 using base::android::ScopedJavaGlobalRef; |
49 using base::android::ScopedJavaLocalRef; | 52 using base::android::ScopedJavaLocalRef; |
50 | 53 |
51 namespace autofill { | 54 namespace autofill { |
52 namespace { | 55 namespace { |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 Java_FullCardRequestDelegate_onFullCardError(env, jdelegate_); | 259 Java_FullCardRequestDelegate_onFullCardError(env, jdelegate_); |
257 delete this; | 260 delete this; |
258 } | 261 } |
259 | 262 |
260 std::unique_ptr<CreditCard> card_; | 263 std::unique_ptr<CreditCard> card_; |
261 ScopedJavaGlobalRef<jobject> jdelegate_; | 264 ScopedJavaGlobalRef<jobject> jdelegate_; |
262 | 265 |
263 DISALLOW_COPY_AND_ASSIGN(FullCardRequester); | 266 DISALLOW_COPY_AND_ASSIGN(FullCardRequester); |
264 }; | 267 }; |
265 | 268 |
| 269 // Self-deleting requester of address normalization. |
| 270 class AddressNormalizationRequester |
| 271 : public PersonalDataManagerAndroid::Delegate, |
| 272 public base::SupportsWeakPtr<AddressNormalizationRequester> { |
| 273 public: |
| 274 AddressNormalizationRequester( |
| 275 JNIEnv* env, |
| 276 const base::android::JavaParamRef<jobject>& jdelegate, |
| 277 const std::string& region_code, |
| 278 const std::string& guid, |
| 279 base::WeakPtr<PersonalDataManagerAndroid> personal_data_manager_android) { |
| 280 jdelegate_.Reset(env, jdelegate); |
| 281 region_code_ = region_code; |
| 282 guid_ = guid; |
| 283 personal_data_manager_android_ = personal_data_manager_android; |
| 284 env_ = env; |
| 285 } |
| 286 |
| 287 private: |
| 288 virtual ~AddressNormalizationRequester() {} |
| 289 |
| 290 void OnRulesSuccessfullyLoaded() override { |
| 291 if (personal_data_manager_android_) { |
| 292 JNIEnv* env = base::android::AttachCurrentThread(); |
| 293 Java_NormalizedAddressRequestDelegate_onAddressNormalized( |
| 294 env, jdelegate_, personal_data_manager_android_->NormalizeAddress( |
| 295 guid_, region_code_, env)); |
| 296 } |
| 297 |
| 298 delete this; |
| 299 } |
| 300 |
| 301 ScopedJavaGlobalRef<jobject> jdelegate_; |
| 302 std::string guid_; |
| 303 std::string region_code_; |
| 304 base::WeakPtr<PersonalDataManagerAndroid> personal_data_manager_android_; |
| 305 JNIEnv* env_; |
| 306 |
| 307 DISALLOW_COPY_AND_ASSIGN(AddressNormalizationRequester); |
| 308 }; |
| 309 |
266 } // namespace | 310 } // namespace |
267 | 311 |
268 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, | 312 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, jobject obj) |
269 jobject obj) | |
270 : weak_java_obj_(env, obj), | 313 : weak_java_obj_(env, obj), |
271 personal_data_manager_(PersonalDataManagerFactory::GetForProfile( | 314 personal_data_manager_(PersonalDataManagerFactory::GetForProfile( |
272 ProfileManager::GetActiveUserProfile())) { | 315 ProfileManager::GetActiveUserProfile())), |
| 316 address_validator_( |
| 317 std::unique_ptr<::i18n::addressinput::Source>( |
| 318 new autofill::ChromeMetadataSource( |
| 319 I18N_ADDRESS_VALIDATION_DATA_URL, |
| 320 personal_data_manager_->GetURLRequestContextGetter())), |
| 321 ValidationRulesStorageFactory::CreateStorage(), |
| 322 this) { |
273 personal_data_manager_->AddObserver(this); | 323 personal_data_manager_->AddObserver(this); |
274 } | 324 } |
275 | 325 |
276 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { | 326 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { |
277 personal_data_manager_->RemoveObserver(this); | 327 personal_data_manager_->RemoveObserver(this); |
278 } | 328 } |
279 | 329 |
280 jboolean PersonalDataManagerAndroid::IsDataLoaded( | 330 jboolean PersonalDataManagerAndroid::IsDataLoaded( |
281 JNIEnv* env, | 331 JNIEnv* env, |
282 const base::android::JavaParamRef<jobject>& unused_obj) const { | 332 const base::android::JavaParamRef<jobject>& unused_obj) const { |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
594 return card->use_date().ToTimeT(); | 644 return card->use_date().ToTimeT(); |
595 } | 645 } |
596 | 646 |
597 // TODO(crbug.com/629507): Use a mock clock for testing. | 647 // TODO(crbug.com/629507): Use a mock clock for testing. |
598 jlong PersonalDataManagerAndroid::GetCurrentDateForTesting( | 648 jlong PersonalDataManagerAndroid::GetCurrentDateForTesting( |
599 JNIEnv* env, | 649 JNIEnv* env, |
600 const base::android::JavaParamRef<jobject>& unused_obj) { | 650 const base::android::JavaParamRef<jobject>& unused_obj) { |
601 return base::Time::Now().ToTimeT(); | 651 return base::Time::Now().ToTimeT(); |
602 } | 652 } |
603 | 653 |
| 654 void PersonalDataManagerAndroid::LoadRulesForRegion( |
| 655 JNIEnv* env, |
| 656 const base::android::JavaParamRef<jobject>& unused_obj, |
| 657 const base::android::JavaParamRef<jstring>& jregion_code) { |
| 658 address_validator_.LoadRules(ConvertJavaStringToUTF8(env, jregion_code)); |
| 659 } |
| 660 |
| 661 void PersonalDataManagerAndroid::OnAddressValidationRulesLoaded( |
| 662 const std::string& region_code, |
| 663 bool success) { |
| 664 // Check if an address normalization is pending. |
| 665 std::map<std::string, Delegate*>::iterator it = |
| 666 pending_normalization_.find(region_code); |
| 667 if (it != pending_normalization_.end()) { |
| 668 // The Delegate will self delete after normalizing. |
| 669 it->second->OnRulesSuccessfullyLoaded(); |
| 670 pending_normalization_.erase(it); |
| 671 } |
| 672 } |
| 673 |
| 674 jboolean PersonalDataManagerAndroid::StartAddressNormalization( |
| 675 JNIEnv* env, |
| 676 const JavaParamRef<jobject>& unused_obj, |
| 677 const JavaParamRef<jstring>& jguid, |
| 678 const JavaParamRef<jstring>& jregion_code, |
| 679 const JavaParamRef<jobject>& jdelegate) { |
| 680 const std::string region_code = ConvertJavaStringToUTF8(env, jregion_code); |
| 681 const std::string guid = ConvertJavaStringToUTF8(env, jguid); |
| 682 |
| 683 Delegate* requester = new AddressNormalizationRequester( |
| 684 env, jdelegate, region_code, guid, AsWeakPtr()); |
| 685 |
| 686 // Check if the rules are already loaded. |
| 687 if (AreRulesLoadedForRegion(region_code)) { |
| 688 requester->OnRulesSuccessfullyLoaded(); |
| 689 return false; |
| 690 } else { |
| 691 // Setup the variables so the profile gets normalized when the rules have |
| 692 // finished loading. |
| 693 pending_normalization_.insert( |
| 694 std::pair<std::string, Delegate*>(region_code, requester)); |
| 695 return true; |
| 696 } |
| 697 } |
| 698 |
| 699 ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::NormalizeAddress( |
| 700 const std::string& guid, |
| 701 const std::string& region_code, |
| 702 JNIEnv* env) { |
| 703 AutofillProfile* profile = personal_data_manager_->GetProfileByGUID(guid); |
| 704 |
| 705 if (!profile || !AreRulesLoadedForRegion(region_code)) |
| 706 return nullptr; |
| 707 |
| 708 // Create the AddressData from the profile. |
| 709 ::i18n::addressinput::AddressData address_data = |
| 710 *i18n::CreateAddressDataFromAutofillProfile( |
| 711 *profile, personal_data_manager_->app_locale()); |
| 712 |
| 713 // Normalize the address. |
| 714 if (address_validator_.NormalizeAddress(&address_data)) { |
| 715 profile->SetRawInfo(ADDRESS_HOME_STATE, |
| 716 base::UTF8ToUTF16(address_data.administrative_area)); |
| 717 profile->SetRawInfo(ADDRESS_HOME_CITY, |
| 718 base::UTF8ToUTF16(address_data.locality)); |
| 719 profile->SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, |
| 720 base::UTF8ToUTF16(address_data.dependent_locality)); |
| 721 } |
| 722 |
| 723 return CreateJavaProfileFromNative(env, *profile); |
| 724 } |
| 725 |
| 726 void PersonalDataManagerAndroid::CancelPendingAddressNormalization( |
| 727 JNIEnv* env, |
| 728 const base::android::JavaParamRef<jobject>& unused_obj) { |
| 729 pending_normalization_.clear(); |
| 730 } |
| 731 |
604 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileGUIDs( | 732 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileGUIDs( |
605 JNIEnv* env, | 733 JNIEnv* env, |
606 const std::vector<AutofillProfile*>& profiles) { | 734 const std::vector<AutofillProfile*>& profiles) { |
607 std::vector<base::string16> guids; | 735 std::vector<base::string16> guids; |
608 for (AutofillProfile* profile : profiles) | 736 for (AutofillProfile* profile : profiles) |
609 guids.push_back(base::UTF8ToUTF16(profile->guid())); | 737 guids.push_back(base::UTF8ToUTF16(profile->guid())); |
610 | 738 |
611 return base::android::ToJavaArrayOfStrings(env, guids); | 739 return base::android::ToJavaArrayOfStrings(env, guids); |
612 } | 740 } |
613 | 741 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 ServerFieldType excluded_field = include_name ? UNKNOWN_TYPE : NAME_FULL; | 775 ServerFieldType excluded_field = include_name ? UNKNOWN_TYPE : NAME_FULL; |
648 | 776 |
649 std::vector<base::string16> labels; | 777 std::vector<base::string16> labels; |
650 AutofillProfile::CreateInferredLabels( | 778 AutofillProfile::CreateInferredLabels( |
651 profiles, suggested_fields.get(), excluded_field, minimal_fields_shown, | 779 profiles, suggested_fields.get(), excluded_field, minimal_fields_shown, |
652 g_browser_process->GetApplicationLocale(), &labels); | 780 g_browser_process->GetApplicationLocale(), &labels); |
653 | 781 |
654 return base::android::ToJavaArrayOfStrings(env, labels); | 782 return base::android::ToJavaArrayOfStrings(env, labels); |
655 } | 783 } |
656 | 784 |
| 785 bool PersonalDataManagerAndroid::AreRulesLoadedForRegion( |
| 786 const std::string& region_code) { |
| 787 return address_validator_.AreRulesLoadedForRegion(region_code); |
| 788 } |
| 789 |
657 // Returns whether the Autofill feature is enabled. | 790 // Returns whether the Autofill feature is enabled. |
658 static jboolean IsAutofillEnabled(JNIEnv* env, | 791 static jboolean IsAutofillEnabled(JNIEnv* env, |
659 const JavaParamRef<jclass>& clazz) { | 792 const JavaParamRef<jclass>& clazz) { |
660 return GetPrefs()->GetBoolean(autofill::prefs::kAutofillEnabled); | 793 return GetPrefs()->GetBoolean(autofill::prefs::kAutofillEnabled); |
661 } | 794 } |
662 | 795 |
663 // Enables or disables the Autofill feature. | 796 // Enables or disables the Autofill feature. |
664 static void SetAutofillEnabled(JNIEnv* env, | 797 static void SetAutofillEnabled(JNIEnv* env, |
665 const JavaParamRef<jclass>& clazz, | 798 const JavaParamRef<jclass>& clazz, |
666 jboolean enable) { | 799 jboolean enable) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
698 base::android::ConvertJavaStringToUTF16(env, jcountry_name))); | 831 base::android::ConvertJavaStringToUTF16(env, jcountry_name))); |
699 } | 832 } |
700 | 833 |
701 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 834 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
702 PersonalDataManagerAndroid* personal_data_manager_android = | 835 PersonalDataManagerAndroid* personal_data_manager_android = |
703 new PersonalDataManagerAndroid(env, obj); | 836 new PersonalDataManagerAndroid(env, obj); |
704 return reinterpret_cast<intptr_t>(personal_data_manager_android); | 837 return reinterpret_cast<intptr_t>(personal_data_manager_android); |
705 } | 838 } |
706 | 839 |
707 } // namespace autofill | 840 } // namespace autofill |
OLD | NEW |