Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(226)

Side by Side Diff: chrome/browser/autofill/android/personal_data_manager_android.cc

Issue 2338283003: [Payments] Normalize addresses before passing them to merchants. (Closed)
Patch Set: import order Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/autofill/android/personal_data_manager_android.h ('k') | components/autofill/core/browser/autofill_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698