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

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: Addressed vabr@'s comments 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" 16 #include "base/memory/weak_ptr.h"
17 #include "base/strings/stringprintf.h" 17 #include "base/strings/stringprintf.h"
18 #include "base/strings/utf_string_conversions.h" 18 #include "base/strings/utf_string_conversions.h"
19 #include "base/time/time.h" 19 #include "base/time/time.h"
20 #include "chrome/browser/android/resource_mapper.h" 20 #include "chrome/browser/android/resource_mapper.h"
21 #include "chrome/browser/autofill/personal_data_manager_factory.h" 21 #include "chrome/browser/autofill/personal_data_manager_factory.h"
22 #include "chrome/browser/browser_process.h" 22 #include "chrome/browser/browser_process.h"
23 #include "chrome/browser/profiles/profile.h" 23 #include "chrome/browser/profiles/profile.h"
24 #include "chrome/browser/profiles/profile_manager.h" 24 #include "chrome/browser/profiles/profile_manager.h"
25 #include "chrome/common/pref_names.h" 25 #include "chrome/common/pref_names.h"
26 #include "components/autofill/content/browser/content_autofill_driver.h" 26 #include "components/autofill/content/browser/content_autofill_driver.h"
27 #include "components/autofill/content/browser/content_autofill_driver_factory.h" 27 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
28 #include "components/autofill/core/browser/address_i18n.h"
28 #include "components/autofill/core/browser/autofill_country.h" 29 #include "components/autofill/core/browser/autofill_country.h"
29 #include "components/autofill/core/browser/autofill_data_util.h" 30 #include "components/autofill/core/browser/autofill_data_util.h"
30 #include "components/autofill/core/browser/autofill_type.h" 31 #include "components/autofill/core/browser/autofill_type.h"
31 #include "components/autofill/core/browser/country_names.h" 32 #include "components/autofill/core/browser/country_names.h"
32 #include "components/autofill/core/browser/field_types.h" 33 #include "components/autofill/core/browser/field_types.h"
33 #include "components/autofill/core/browser/payments/full_card_request.h" 34 #include "components/autofill/core/browser/payments/full_card_request.h"
34 #include "components/autofill/core/browser/personal_data_manager.h" 35 #include "components/autofill/core/browser/personal_data_manager.h"
35 #include "components/autofill/core/browser/validation.h" 36 #include "components/autofill/core/browser/validation.h"
36 #include "components/autofill/core/common/autofill_constants.h" 37 #include "components/autofill/core/common/autofill_constants.h"
37 #include "components/autofill/core/common/autofill_pref_names.h" 38 #include "components/autofill/core/common/autofill_pref_names.h"
38 #include "components/autofill/core/common/autofill_switches.h" 39 #include "components/autofill/core/common/autofill_switches.h"
39 #include "components/grit/components_scaled_resources.h" 40 #include "components/grit/components_scaled_resources.h"
40 #include "components/prefs/pref_service.h" 41 #include "components/prefs/pref_service.h"
41 #include "content/public/browser/web_contents.h" 42 #include "content/public/browser/web_contents.h"
42 #include "jni/PersonalDataManager_jni.h" 43 #include "jni/PersonalDataManager_jni.h"
44 #include "third_party/libaddressinput/chromium/chrome_metadata_source.h"
45 #include "third_party/libaddressinput/chromium/chrome_storage_impl.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 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 Java_FullCardRequestDelegate_onFullCardError(env, jdelegate_); 260 Java_FullCardRequestDelegate_onFullCardError(env, jdelegate_);
257 delete this; 261 delete this;
258 } 262 }
259 263
260 std::unique_ptr<CreditCard> card_; 264 std::unique_ptr<CreditCard> card_;
261 ScopedJavaGlobalRef<jobject> jdelegate_; 265 ScopedJavaGlobalRef<jobject> jdelegate_;
262 266
263 DISALLOW_COPY_AND_ASSIGN(FullCardRequester); 267 DISALLOW_COPY_AND_ASSIGN(FullCardRequester);
264 }; 268 };
265 269
270 // Self-deleting requester of address normalization.
271 class AddressNormalizationRequester
272 : public PersonalDataManagerAndroid::Delegate,
273 public base::SupportsWeakPtr<AddressNormalizationRequester> {
274 public:
275 AddressNormalizationRequester(
276 JNIEnv* env,
277 const base::android::JavaParamRef<jobject>& jdelegate,
278 const std::string& region_code,
279 const std::string& guid,
280 PersonalDataManagerAndroid* personal_data_manager_android) {
281 jdelegate_.Reset(env, jdelegate);
282 region_code_ = region_code;
283 guid_ = guid;
284 personal_data_manager_android_ = personal_data_manager_android;
285 env_ = env;
286 }
287
288 private:
289 virtual ~AddressNormalizationRequester() {}
290
291 void OnRulesSuccessfullyLoaded() override {
292 if (personal_data_manager_android_) {
gone 2016/09/28 18:04:31 The only place the personal_data_manager_android_
sebsg 2016/09/28 18:50:39 Done.
293 JNIEnv* env = base::android::AttachCurrentThread();
294 Java_NormalizedAddressRequestDelegate_onAddressNormalized(
295 env, jdelegate_, personal_data_manager_android_->NormalizeAddress(
296 guid_, region_code_, env));
297 }
298
299 delete this;
300 }
301
302 ScopedJavaGlobalRef<jobject> jdelegate_;
303 std::string guid_;
304 std::string region_code_;
305 PersonalDataManagerAndroid* personal_data_manager_android_;
306 JNIEnv* env_;
307
308 DISALLOW_COPY_AND_ASSIGN(AddressNormalizationRequester);
309 };
310
266 } // namespace 311 } // namespace
267 312
268 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, 313 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, jobject obj)
269 jobject obj)
270 : weak_java_obj_(env, obj), 314 : weak_java_obj_(env, obj),
271 personal_data_manager_(PersonalDataManagerFactory::GetForProfile( 315 personal_data_manager_(PersonalDataManagerFactory::GetForProfile(
272 ProfileManager::GetActiveUserProfile())) { 316 ProfileManager::GetActiveUserProfile())),
317 address_validator_(
318 std::unique_ptr<::i18n::addressinput::Source>(
319 new autofill::ChromeMetadataSource(
320 I18N_ADDRESS_VALIDATION_DATA_URL,
321 personal_data_manager_->GetURLRequestContextGetter())),
322 ValidationRulesStorageFactory::CreateStorage(),
323 this) {
273 personal_data_manager_->AddObserver(this); 324 personal_data_manager_->AddObserver(this);
274 } 325 }
275 326
276 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { 327 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() {
277 personal_data_manager_->RemoveObserver(this); 328 personal_data_manager_->RemoveObserver(this);
278 } 329 }
279 330
280 jboolean PersonalDataManagerAndroid::IsDataLoaded( 331 jboolean PersonalDataManagerAndroid::IsDataLoaded(
281 JNIEnv* env, 332 JNIEnv* env,
282 const base::android::JavaParamRef<jobject>& unused_obj) const { 333 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(); 645 return card->use_date().ToTimeT();
595 } 646 }
596 647
597 // TODO(crbug.com/629507): Use a mock clock for testing. 648 // TODO(crbug.com/629507): Use a mock clock for testing.
598 jlong PersonalDataManagerAndroid::GetCurrentDateForTesting( 649 jlong PersonalDataManagerAndroid::GetCurrentDateForTesting(
599 JNIEnv* env, 650 JNIEnv* env,
600 const base::android::JavaParamRef<jobject>& unused_obj) { 651 const base::android::JavaParamRef<jobject>& unused_obj) {
601 return base::Time::Now().ToTimeT(); 652 return base::Time::Now().ToTimeT();
602 } 653 }
603 654
655 void PersonalDataManagerAndroid::LoadRulesForRegion(
656 JNIEnv* env,
657 const base::android::JavaParamRef<jobject>& unused_obj,
658 const base::android::JavaParamRef<jstring>& jregion_code) {
659 address_validator_.LoadRules(ConvertJavaStringToUTF8(env, jregion_code));
660 }
661
662 void PersonalDataManagerAndroid::OnAddressValidationRulesLoaded(
663 const std::string& region_code,
664 bool success) {
665 // Check if an address normalization is pending.
666 std::map<std::string, Delegate*>::iterator it =
667 pending_normalization_.find(region_code);
668 if (it != pending_normalization_.end()) {
669 // The Delegate will self delete after normalizing.
670 it->second->OnRulesSuccessfullyLoaded();
671 pending_normalization_.erase(it);
672 }
673 }
674
675 void PersonalDataManagerAndroid::StartAddressNormalizationTask(
676 JNIEnv* env,
677 const JavaParamRef<jobject>& unused_obj,
678 const JavaParamRef<jstring>& jguid,
679 const JavaParamRef<jstring>& jregion_code,
680 const JavaParamRef<jobject>& jdelegate) {
681 const std::string region_code = ConvertJavaStringToUTF8(env, jregion_code);
682 const std::string guid = ConvertJavaStringToUTF8(env, jguid);
683
684 Delegate* requester = new AddressNormalizationRequester(
685 env, jdelegate, region_code, guid, this);
686
687 // Check if the rules are already loaded.
688 if (AreRulesLoadedForRegion(region_code)) {
689 requester->OnRulesSuccessfullyLoaded();
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 }
696 }
697
698 ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::NormalizeAddress(
699 const std::string& guid,
700 const std::string& region_code,
701 JNIEnv* env) {
702 AutofillProfile* profile = personal_data_manager_->GetProfileByGUID(guid);
703
704 if (!profile || !AreRulesLoadedForRegion(region_code))
705 return nullptr;
706
707 // Create the AddressData from the profile.
708 ::i18n::addressinput::AddressData address_data =
709 *i18n::CreateAddressDataFromAutofillProfile(
710 *profile, personal_data_manager_->app_locale());
711
712 // Normalize the address.
713 if (address_validator_.NormalizeAddress(&address_data)) {
714 // Set the normalized state, city and dependent locality.
gone 2016/09/28 18:04:31 Don't know if this comment's too helpful; seems pr
sebsg 2016/09/28 18:50:39 Done.
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

Powered by Google App Engine
This is Rietveld 408576698