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

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: Created 4 years, 3 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 <stdlib.h>
8 #include <algorithm> 9 #include <algorithm>
9 #include <memory> 10 #include <memory>
10 #include <utility> 11 #include <utility>
11 12
12 #include "base/android/jni_array.h" 13 #include "base/android/jni_array.h"
13 #include "base/android/jni_string.h" 14 #include "base/android/jni_string.h"
14 #include "base/command_line.h" 15 #include "base/command_line.h"
15 #include "base/format_macros.h" 16 #include "base/format_macros.h"
16 #include "base/memory/weak_ptr.h" 17 #include "base/memory/weak_ptr.h"
17 #include "base/strings/stringprintf.h" 18 #include "base/strings/stringprintf.h"
18 #include "base/strings/utf_string_conversions.h" 19 #include "base/strings/utf_string_conversions.h"
19 #include "base/time/time.h" 20 #include "base/time/time.h"
20 #include "chrome/browser/android/resource_mapper.h" 21 #include "chrome/browser/android/resource_mapper.h"
22 #include "chrome/browser/autofill/android/mock_address_validator.h"
please use gerrit instead 2016/09/16 22:30:41 Yah, we can't include test code from production co
sebsg 2016/09/22 19:50:40 Done.
21 #include "chrome/browser/autofill/personal_data_manager_factory.h" 23 #include "chrome/browser/autofill/personal_data_manager_factory.h"
22 #include "chrome/browser/browser_process.h" 24 #include "chrome/browser/browser_process.h"
23 #include "chrome/browser/profiles/profile.h" 25 #include "chrome/browser/profiles/profile.h"
24 #include "chrome/browser/profiles/profile_manager.h" 26 #include "chrome/browser/profiles/profile_manager.h"
25 #include "chrome/common/pref_names.h" 27 #include "chrome/common/pref_names.h"
26 #include "components/autofill/content/browser/content_autofill_driver.h" 28 #include "components/autofill/content/browser/content_autofill_driver.h"
27 #include "components/autofill/content/browser/content_autofill_driver_factory.h" 29 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
30 #include "components/autofill/core/browser/address_i18n.h"
28 #include "components/autofill/core/browser/autofill_country.h" 31 #include "components/autofill/core/browser/autofill_country.h"
29 #include "components/autofill/core/browser/autofill_data_util.h" 32 #include "components/autofill/core/browser/autofill_data_util.h"
30 #include "components/autofill/core/browser/autofill_type.h" 33 #include "components/autofill/core/browser/autofill_type.h"
31 #include "components/autofill/core/browser/country_names.h" 34 #include "components/autofill/core/browser/country_names.h"
32 #include "components/autofill/core/browser/field_types.h" 35 #include "components/autofill/core/browser/field_types.h"
33 #include "components/autofill/core/browser/payments/full_card_request.h" 36 #include "components/autofill/core/browser/payments/full_card_request.h"
34 #include "components/autofill/core/browser/personal_data_manager.h" 37 #include "components/autofill/core/browser/personal_data_manager.h"
35 #include "components/autofill/core/browser/validation.h" 38 #include "components/autofill/core/browser/validation.h"
36 #include "components/autofill/core/common/autofill_constants.h" 39 #include "components/autofill/core/common/autofill_constants.h"
37 #include "components/autofill/core/common/autofill_pref_names.h" 40 #include "components/autofill/core/common/autofill_pref_names.h"
38 #include "components/autofill/core/common/autofill_switches.h" 41 #include "components/autofill/core/common/autofill_switches.h"
39 #include "components/grit/components_scaled_resources.h" 42 #include "components/grit/components_scaled_resources.h"
40 #include "components/prefs/pref_service.h" 43 #include "components/prefs/pref_service.h"
41 #include "content/public/browser/web_contents.h" 44 #include "content/public/browser/web_contents.h"
42 #include "jni/PersonalDataManager_jni.h" 45 #include "jni/PersonalDataManager_jni.h"
46 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_da ta.h"
43 47
44 using base::android::ConvertJavaStringToUTF8; 48 using base::android::ConvertJavaStringToUTF8;
45 using base::android::ConvertUTF16ToJavaString; 49 using base::android::ConvertUTF16ToJavaString;
46 using base::android::ConvertUTF8ToJavaString; 50 using base::android::ConvertUTF8ToJavaString;
47 using base::android::JavaParamRef; 51 using base::android::JavaParamRef;
48 using base::android::ScopedJavaGlobalRef; 52 using base::android::ScopedJavaGlobalRef;
49 using base::android::ScopedJavaLocalRef; 53 using base::android::ScopedJavaLocalRef;
50 54
51 namespace autofill { 55 namespace autofill {
52 namespace { 56 namespace {
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 }; 268 };
265 269
266 } // namespace 270 } // namespace
267 271
268 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, 272 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env,
269 jobject obj) 273 jobject obj)
270 : weak_java_obj_(env, obj), 274 : weak_java_obj_(env, obj),
271 personal_data_manager_(PersonalDataManagerFactory::GetForProfile( 275 personal_data_manager_(PersonalDataManagerFactory::GetForProfile(
272 ProfileManager::GetActiveUserProfile())) { 276 ProfileManager::GetActiveUserProfile())) {
273 personal_data_manager_->AddObserver(this); 277 personal_data_manager_->AddObserver(this);
278
279 address_validator_.reset(new AddressValidator(
280 std::unique_ptr<::i18n::addressinput::Source>(
281 new autofill::ChromeMetadataSource(
282 I18N_ADDRESS_VALIDATION_DATA_URL,
283 personal_data_manager_->GetURLRequestContextGetter())),
284 ValidationRulesStorageFactory::CreateStorage(), this));
274 } 285 }
275 286
276 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { 287 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() {
277 personal_data_manager_->RemoveObserver(this); 288 personal_data_manager_->RemoveObserver(this);
278 } 289 }
279 290
280 jboolean PersonalDataManagerAndroid::IsDataLoaded( 291 jboolean PersonalDataManagerAndroid::IsDataLoaded(
281 JNIEnv* env, 292 JNIEnv* env,
282 const base::android::JavaParamRef<jobject>& unused_obj) const { 293 const base::android::JavaParamRef<jobject>& unused_obj) const {
283 return personal_data_manager_->IsDataLoaded(); 294 return personal_data_manager_->IsDataLoaded();
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 return card->use_date().ToTimeT(); 605 return card->use_date().ToTimeT();
595 } 606 }
596 607
597 // TODO(crbug.com/629507): Use a mock clock for testing. 608 // TODO(crbug.com/629507): Use a mock clock for testing.
598 jlong PersonalDataManagerAndroid::GetCurrentDateForTesting( 609 jlong PersonalDataManagerAndroid::GetCurrentDateForTesting(
599 JNIEnv* env, 610 JNIEnv* env,
600 const base::android::JavaParamRef<jobject>& unused_obj) { 611 const base::android::JavaParamRef<jobject>& unused_obj) {
601 return base::Time::Now().ToTimeT(); 612 return base::Time::Now().ToTimeT();
602 } 613 }
603 614
615 void PersonalDataManagerAndroid::LoadRulesForRegion(
616 JNIEnv* env,
617 const base::android::JavaParamRef<jobject>& unused_obj,
618 const base::android::JavaParamRef<jstring>& jregion_code) {
619 address_validator_->LoadRules(ConvertJavaStringToUTF8(env, jregion_code));
620 }
621
622 jboolean PersonalDataManagerAndroid::AreRulesDoneLoadingForRegion(
623 JNIEnv* env,
624 const base::android::JavaParamRef<jobject>& unused_obj,
625 const base::android::JavaParamRef<jstring>& jregion_code) {
please use gerrit instead 2016/09/16 22:30:41 This code might go away after you make normalizati
sebsg 2016/09/22 19:50:40 Done.
626 std::map<std::string, bool>::iterator it =
627 loaded_rules_.find(ConvertJavaStringToUTF8(env, jregion_code));
628
629 return it != loaded_rules_.end() ? true : false;
630 }
631
632 jboolean PersonalDataManagerAndroid::AreRulesSuccessfullyLoadedForRegion(
633 JNIEnv* env,
634 const base::android::JavaParamRef<jobject>& unused_obj,
635 const base::android::JavaParamRef<jstring>& jregion_code) {
636 std::map<std::string, bool>::iterator it =
637 loaded_rules_.find(ConvertJavaStringToUTF8(env, jregion_code));
638
639 return it != loaded_rules_.end() ? it->second : false;
640 }
641
642 ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::GetNormalizedProfile(
643 JNIEnv* env,
644 const JavaParamRef<jobject>& unused_obj,
645 const JavaParamRef<jstring>& jguid,
646 const JavaParamRef<jstring>& jregion_code) {
647 AutofillProfile* profile = personal_data_manager_->GetProfileByGUID(
648 ConvertJavaStringToUTF8(env, jguid));
649
650 if (!profile)
651 return ScopedJavaLocalRef<jobject>();
652
653 // Check if the rules are loaded every second for 5 seconds.
654 for (int i = 0; i < 5; ++i) {
please use gerrit instead 2016/09/16 22:30:42 /me closes his eyes. I'm going to pretend I never
sebsg 2016/09/22 19:50:40 Done.
655 if (AreRulesDoneLoadingForRegion(env, unused_obj, jregion_code))
656 break;
657 sleep(1);
658 }
659
660 if (!AreRulesDoneLoadingForRegion(env, unused_obj, jregion_code) ||
661 !AreRulesSuccessfullyLoadedForRegion(env, unused_obj, jregion_code))
662 return CreateJavaProfileFromNative(env, *profile);
663
664 // Create the AddressData from the profile.
665 ::i18n::addressinput::AddressData address_data =
666 *i18n::CreateAddressDataFromAutofillProfile(
667 *profile, personal_data_manager_->app_locale());
668
669 // Try to normalize the address.
670 if (address_validator_->NormalizeAddress(&address_data)) {
671 // Set the normalized state and city.
please use gerrit instead 2016/09/16 22:30:41 Normalize the dependent locality as well, please.
sebsg 2016/09/22 19:50:40 Done.
672 profile->SetRawInfo(ADDRESS_HOME_STATE,
673 base::UTF8ToUTF16(address_data.administrative_area));
674 profile->SetRawInfo(ADDRESS_HOME_CITY,
675 base::UTF8ToUTF16(address_data.locality));
676 }
677
678 return CreateJavaProfileFromNative(env, *profile);
679 }
680
681 void PersonalDataManagerAndroid::OnAddressValidationRulesLoaded(
682 const std::string& region_code,
683 bool success) {
684 loaded_rules_[region_code] = success;
685 }
686
687 void PersonalDataManagerAndroid::SetMockAddressValidatorForTesting(
688 JNIEnv* env,
689 const base::android::JavaParamRef<jobject>& unused_obj,
690 jboolean load_rules_response) {
691 address_validator_.reset(new MockAddressValidator(this, load_rules_response));
692 }
693
604 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileGUIDs( 694 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileGUIDs(
605 JNIEnv* env, 695 JNIEnv* env,
606 const std::vector<AutofillProfile*>& profiles) { 696 const std::vector<AutofillProfile*>& profiles) {
607 std::vector<base::string16> guids; 697 std::vector<base::string16> guids;
608 for (AutofillProfile* profile : profiles) 698 for (AutofillProfile* profile : profiles)
609 guids.push_back(base::UTF8ToUTF16(profile->guid())); 699 guids.push_back(base::UTF8ToUTF16(profile->guid()));
610 700
611 return base::android::ToJavaArrayOfStrings(env, guids); 701 return base::android::ToJavaArrayOfStrings(env, guids);
612 } 702 }
613 703
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 base::android::ConvertJavaStringToUTF16(env, jcountry_name))); 788 base::android::ConvertJavaStringToUTF16(env, jcountry_name)));
699 } 789 }
700 790
701 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { 791 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) {
702 PersonalDataManagerAndroid* personal_data_manager_android = 792 PersonalDataManagerAndroid* personal_data_manager_android =
703 new PersonalDataManagerAndroid(env, obj); 793 new PersonalDataManagerAndroid(env, obj);
704 return reinterpret_cast<intptr_t>(personal_data_manager_android); 794 return reinterpret_cast<intptr_t>(personal_data_manager_android);
705 } 795 }
706 796
707 } // namespace autofill 797 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698