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

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

Issue 2686613003: [Payments] Move address normalization code from android to native. (Closed)
Patch Set: Created 3 years, 10 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/strings/utf_string_conversions.h" 16 #include "base/strings/utf_string_conversions.h"
17 #include "base/time/time.h" 17 #include "base/time/time.h"
18 #include "chrome/browser/android/resource_mapper.h" 18 #include "chrome/browser/android/resource_mapper.h"
19 #include "chrome/browser/autofill/personal_data_manager_factory.h" 19 #include "chrome/browser/autofill/personal_data_manager_factory.h"
20 #include "chrome/browser/autofill/validation_rules_storage_factory.h"
20 #include "chrome/browser/browser_process.h" 21 #include "chrome/browser/browser_process.h"
21 #include "chrome/browser/profiles/profile.h" 22 #include "chrome/browser/profiles/profile.h"
22 #include "chrome/browser/profiles/profile_manager.h" 23 #include "chrome/browser/profiles/profile_manager.h"
23 #include "chrome/common/pref_names.h" 24 #include "chrome/common/pref_names.h"
24 #include "components/autofill/content/browser/content_autofill_driver.h" 25 #include "components/autofill/content/browser/content_autofill_driver.h"
25 #include "components/autofill/content/browser/content_autofill_driver_factory.h" 26 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
26 #include "components/autofill/core/browser/address_i18n.h" 27 #include "components/autofill/core/browser/address_i18n.h"
27 #include "components/autofill/core/browser/autofill_country.h" 28 #include "components/autofill/core/browser/autofill_country.h"
28 #include "components/autofill/core/browser/autofill_data_util.h" 29 #include "components/autofill/core/browser/autofill_data_util.h"
29 #include "components/autofill/core/browser/autofill_type.h" 30 #include "components/autofill/core/browser/autofill_type.h"
30 #include "components/autofill/core/browser/country_names.h" 31 #include "components/autofill/core/browser/country_names.h"
31 #include "components/autofill/core/browser/field_types.h" 32 #include "components/autofill/core/browser/field_types.h"
32 #include "components/autofill/core/browser/payments/full_card_request.h" 33 #include "components/autofill/core/browser/payments/full_card_request.h"
33 #include "components/autofill/core/browser/personal_data_manager.h" 34 #include "components/autofill/core/browser/personal_data_manager.h"
34 #include "components/autofill/core/browser/validation.h" 35 #include "components/autofill/core/browser/validation.h"
35 #include "components/autofill/core/common/autofill_constants.h" 36 #include "components/autofill/core/common/autofill_constants.h"
36 #include "components/autofill/core/common/autofill_pref_names.h" 37 #include "components/autofill/core/common/autofill_pref_names.h"
37 #include "components/autofill/core/common/autofill_switches.h" 38 #include "components/autofill/core/common/autofill_switches.h"
38 #include "components/grit/components_scaled_resources.h" 39 #include "components/grit/components_scaled_resources.h"
39 #include "components/prefs/pref_service.h" 40 #include "components/prefs/pref_service.h"
40 #include "content/public/browser/web_contents.h" 41 #include "content/public/browser/web_contents.h"
41 #include "jni/PersonalDataManager_jni.h" 42 #include "jni/PersonalDataManager_jni.h"
42 #include "third_party/libaddressinput/chromium/chrome_metadata_source.h" 43 #include "third_party/libaddressinput/chromium/chrome_metadata_source.h"
43 #include "third_party/libaddressinput/chromium/chrome_storage_impl.h" 44 #include "third_party/libaddressinput/chromium/chrome_storage_impl.h"
44 #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_da ta.h"
45 45
46 using base::android::ConvertJavaStringToUTF8; 46 using base::android::ConvertJavaStringToUTF8;
47 using base::android::ConvertUTF16ToJavaString; 47 using base::android::ConvertUTF16ToJavaString;
48 using base::android::ConvertUTF8ToJavaString; 48 using base::android::ConvertUTF8ToJavaString;
49 using base::android::JavaParamRef; 49 using base::android::JavaParamRef;
50 using base::android::ScopedJavaGlobalRef; 50 using base::android::ScopedJavaGlobalRef;
51 using base::android::ScopedJavaLocalRef; 51 using base::android::ScopedJavaLocalRef;
52 52
53 namespace autofill { 53 namespace autofill {
54 namespace { 54 namespace {
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 Java_FullCardRequestDelegate_onFullCardError(env, jdelegate_); 265 Java_FullCardRequestDelegate_onFullCardError(env, jdelegate_);
266 delete this; 266 delete this;
267 } 267 }
268 268
269 std::unique_ptr<CreditCard> card_; 269 std::unique_ptr<CreditCard> card_;
270 ScopedJavaGlobalRef<jobject> jdelegate_; 270 ScopedJavaGlobalRef<jobject> jdelegate_;
271 271
272 DISALLOW_COPY_AND_ASSIGN(FullCardRequester); 272 DISALLOW_COPY_AND_ASSIGN(FullCardRequester);
273 }; 273 };
274 274
275 class AddressNormalizationRequester 275 class AndroidAddressNormalizationRequester
please use gerrit instead 2017/02/14 21:31:08 nit: AddressNormalizerDelegate
sebsg 2017/02/15 16:18:30 Done.
276 : public PersonalDataManagerAndroid::Delegate, 276 : public ::payments::AddressNormalizationRequester,
277 public base::SupportsWeakPtr<AddressNormalizationRequester> { 277 public base::SupportsWeakPtr<AndroidAddressNormalizationRequester> {
278 public: 278 public:
279 AddressNormalizationRequester( 279 AndroidAddressNormalizationRequester(
280 JNIEnv* env, 280 JNIEnv* env,
281 const base::android::JavaParamRef<jobject>& jdelegate, 281 const base::android::JavaParamRef<jobject>& jdelegate) {
282 const std::string& region_code,
283 const std::string& guid,
284 base::WeakPtr<PersonalDataManagerAndroid> personal_data_manager_android) {
285 jdelegate_.Reset(env, jdelegate); 282 jdelegate_.Reset(env, jdelegate);
286 region_code_ = region_code; 283 }
287 guid_ = guid; 284
288 personal_data_manager_android_ = personal_data_manager_android; 285 void OnAddressNormalized(AutofillProfile normalized_profile) override {
please use gerrit instead 2017/02/14 21:31:08 const-ref for the normalized proifle.
sebsg 2017/02/15 16:18:30 Done.
289 env_ = env; 286 JNIEnv* env = base::android::AttachCurrentThread();
287 Java_NormalizedAddressRequestDelegate_onAddressNormalized(
288 env, jdelegate_, CreateJavaProfileFromNative(env, normalized_profile));
289 delete this;
290 } 290 }
291 291
292 private: 292 private:
293 ~AddressNormalizationRequester() override {} 293 virtual ~AndroidAddressNormalizationRequester() {}
please use gerrit instead 2017/02/14 21:31:08 override instead of virtual
sebsg 2017/02/15 16:18:30 Done.
294
295 void OnRulesSuccessfullyLoaded() override {
296 if (personal_data_manager_android_) {
297 JNIEnv* env = base::android::AttachCurrentThread();
298 Java_NormalizedAddressRequestDelegate_onAddressNormalized(
299 env, jdelegate_, personal_data_manager_android_->NormalizeAddress(
300 guid_, region_code_, env));
301 }
302 }
303 294
304 ScopedJavaGlobalRef<jobject> jdelegate_; 295 ScopedJavaGlobalRef<jobject> jdelegate_;
305 std::string guid_;
306 std::string region_code_;
307 base::WeakPtr<PersonalDataManagerAndroid> personal_data_manager_android_;
308 JNIEnv* env_;
309 296
310 DISALLOW_COPY_AND_ASSIGN(AddressNormalizationRequester); 297 DISALLOW_COPY_AND_ASSIGN(AndroidAddressNormalizationRequester);
311 }; 298 };
312 299
313 } // namespace 300 } // namespace
314 301
315 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, jobject obj) 302 PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, jobject obj)
316 : weak_java_obj_(env, obj), 303 : weak_java_obj_(env, obj),
317 personal_data_manager_(PersonalDataManagerFactory::GetForProfile( 304 personal_data_manager_(PersonalDataManagerFactory::GetForProfile(
318 ProfileManager::GetActiveUserProfile())), 305 ProfileManager::GetActiveUserProfile())),
319 address_validator_( 306 address_validator_helper_(
320 std::unique_ptr<::i18n::addressinput::Source>( 307 std::unique_ptr<::i18n::addressinput::Source>(
321 new autofill::ChromeMetadataSource( 308 new autofill::ChromeMetadataSource(
322 I18N_ADDRESS_VALIDATION_DATA_URL, 309 I18N_ADDRESS_VALIDATION_DATA_URL,
323 personal_data_manager_->GetURLRequestContextGetter())), 310 personal_data_manager_->GetURLRequestContextGetter())),
324 ValidationRulesStorageFactory::CreateStorage(), 311 ValidationRulesStorageFactory::CreateStorage()) {
325 this) {
326 personal_data_manager_->AddObserver(this); 312 personal_data_manager_->AddObserver(this);
327 } 313 }
328 314
329 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() { 315 PersonalDataManagerAndroid::~PersonalDataManagerAndroid() {
330 personal_data_manager_->RemoveObserver(this); 316 personal_data_manager_->RemoveObserver(this);
331 } 317 }
332 318
333 jboolean PersonalDataManagerAndroid::IsDataLoaded( 319 jboolean PersonalDataManagerAndroid::IsDataLoaded(
334 JNIEnv* env, 320 JNIEnv* env,
335 const base::android::JavaParamRef<jobject>& unused_obj) const { 321 const base::android::JavaParamRef<jobject>& unused_obj) const {
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 jlong PersonalDataManagerAndroid::GetCurrentDateForTesting( 686 jlong PersonalDataManagerAndroid::GetCurrentDateForTesting(
701 JNIEnv* env, 687 JNIEnv* env,
702 const base::android::JavaParamRef<jobject>& unused_obj) { 688 const base::android::JavaParamRef<jobject>& unused_obj) {
703 return base::Time::Now().ToTimeT(); 689 return base::Time::Now().ToTimeT();
704 } 690 }
705 691
706 void PersonalDataManagerAndroid::LoadRulesForRegion( 692 void PersonalDataManagerAndroid::LoadRulesForRegion(
707 JNIEnv* env, 693 JNIEnv* env,
708 const base::android::JavaParamRef<jobject>& unused_obj, 694 const base::android::JavaParamRef<jobject>& unused_obj,
709 const base::android::JavaParamRef<jstring>& jregion_code) { 695 const base::android::JavaParamRef<jstring>& jregion_code) {
710 address_validator_.LoadRules(ConvertJavaStringToUTF8(env, jregion_code)); 696 address_validator_helper_.LoadRulesForRegion(
697 ConvertJavaStringToUTF8(env, jregion_code));
711 } 698 }
712 699
713 void PersonalDataManagerAndroid::OnAddressValidationRulesLoaded( 700 void PersonalDataManagerAndroid::StartAddressNormalization(
714 const std::string& region_code,
715 bool success) {
716 // Check if an address normalization is pending.
717 auto it = pending_normalization_.find(region_code);
718 if (it != pending_normalization_.end()) {
719 for (size_t i = 0; i < it->second.size(); ++i)
720 it->second[i]->OnRulesSuccessfullyLoaded();
721 pending_normalization_.erase(it);
722 }
723 }
724
725 jboolean PersonalDataManagerAndroid::StartAddressNormalization(
726 JNIEnv* env, 701 JNIEnv* env,
727 const JavaParamRef<jobject>& unused_obj, 702 const JavaParamRef<jobject>& unused_obj,
728 const JavaParamRef<jstring>& jguid, 703 const JavaParamRef<jstring>& jguid,
729 const JavaParamRef<jstring>& jregion_code, 704 const JavaParamRef<jstring>& jregion_code,
730 const JavaParamRef<jobject>& jdelegate) { 705 const JavaParamRef<jobject>& jdelegate) {
731 const std::string region_code = ConvertJavaStringToUTF8(env, jregion_code); 706 const std::string region_code = ConvertJavaStringToUTF8(env, jregion_code);
732 const std::string guid = ConvertJavaStringToUTF8(env, jguid); 707 const std::string guid = ConvertJavaStringToUTF8(env, jguid);
733 708
734 std::unique_ptr<Delegate> requester(new AddressNormalizationRequester( 709 // Get the profile to normalize.
735 env, jdelegate, region_code, guid, AsWeakPtr()));
736
737 // Check if the rules are already loaded.
738 if (AreRulesLoadedForRegion(region_code)) {
739 requester->OnRulesSuccessfullyLoaded();
740 return false;
741 } else {
742 // Setup the variables so the profile gets normalized when the rules have
743 // finished loading.
744 auto it = pending_normalization_.find(region_code);
745 if (it == pending_normalization_.end()) {
746 // If no entry exists yet, create the entry and assign it to |it|.
747 it = pending_normalization_
748 .insert(std::make_pair(region_code,
749 std::vector<std::unique_ptr<Delegate>>()))
750 .first;
751 }
752
753 it->second.push_back(std::move(requester));
754
755 return true;
756 }
757 }
758
759 ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::NormalizeAddress(
760 const std::string& guid,
761 const std::string& region_code,
762 JNIEnv* env) {
763 AutofillProfile* profile = personal_data_manager_->GetProfileByGUID(guid); 710 AutofillProfile* profile = personal_data_manager_->GetProfileByGUID(guid);
764 711
765 if (!profile || !AreRulesLoadedForRegion(region_code)) 712 // Self-deleting object.
766 return nullptr; 713 AndroidAddressNormalizationRequester* requester =
714 new AndroidAddressNormalizationRequester(env, jdelegate);
767 715
768 // Create the AddressData from the profile. 716 // Start the normalization.
769 ::i18n::addressinput::AddressData address_data = 717 address_validator_helper_.StartAddressNormalization(*profile, region_code,
770 *i18n::CreateAddressDataFromAutofillProfile( 718 requester);
771 *profile, personal_data_manager_->app_locale());
772
773 // Normalize the address.
774 if (address_validator_.NormalizeAddress(&address_data)) {
775 profile->SetRawInfo(ADDRESS_HOME_STATE,
776 base::UTF8ToUTF16(address_data.administrative_area));
777 profile->SetRawInfo(ADDRESS_HOME_CITY,
778 base::UTF8ToUTF16(address_data.locality));
779 profile->SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY,
780 base::UTF8ToUTF16(address_data.dependent_locality));
781 }
782
783 return CreateJavaProfileFromNative(env, *profile);
784 }
785
786 void PersonalDataManagerAndroid::CancelPendingAddressNormalizations(
787 JNIEnv* env,
788 const base::android::JavaParamRef<jobject>& unused_obj) {
789 pending_normalization_.clear();
790 } 719 }
791 720
792 jboolean PersonalDataManagerAndroid::HasProfiles( 721 jboolean PersonalDataManagerAndroid::HasProfiles(
793 JNIEnv* env, 722 JNIEnv* env,
794 const base::android::JavaParamRef<jobject>& unused_obj) { 723 const base::android::JavaParamRef<jobject>& unused_obj) {
795 return !personal_data_manager_->GetProfiles().empty(); 724 return !personal_data_manager_->GetProfiles().empty();
796 } 725 }
797 726
798 jboolean PersonalDataManagerAndroid::HasCreditCards( 727 jboolean PersonalDataManagerAndroid::HasCreditCards(
799 JNIEnv* env, 728 JNIEnv* env,
(...skipping 16 matching lines...) Expand all
816 const std::vector<CreditCard*>& credit_cards) { 745 const std::vector<CreditCard*>& credit_cards) {
817 std::vector<base::string16> guids; 746 std::vector<base::string16> guids;
818 for (CreditCard* credit_card : credit_cards) 747 for (CreditCard* credit_card : credit_cards)
819 guids.push_back(base::UTF8ToUTF16(credit_card->guid())); 748 guids.push_back(base::UTF8ToUTF16(credit_card->guid()));
820 749
821 return base::android::ToJavaArrayOfStrings(env, guids); 750 return base::android::ToJavaArrayOfStrings(env, guids);
822 } 751 }
823 752
824 bool PersonalDataManagerAndroid::AreRulesLoadedForRegion( 753 bool PersonalDataManagerAndroid::AreRulesLoadedForRegion(
825 const std::string& region_code) { 754 const std::string& region_code) {
826 return address_validator_.AreRulesLoadedForRegion(region_code); 755 return address_validator_helper_.AreRulesLoadedForRegion(region_code);
827 } 756 }
828 757
829 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileLabels( 758 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileLabels(
830 JNIEnv* env, 759 JNIEnv* env,
831 bool address_only, 760 bool address_only,
832 bool include_name_in_label, 761 bool include_name_in_label,
833 bool include_organization_in_label, 762 bool include_organization_in_label,
834 bool include_country_in_label, 763 bool include_country_in_label,
835 std::vector<AutofillProfile*> profiles) { 764 std::vector<AutofillProfile*> profiles) {
836 std::unique_ptr<std::vector<ServerFieldType>> suggested_fields; 765 std::unique_ptr<std::vector<ServerFieldType>> suggested_fields;
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 base::android::ConvertJavaStringToUTF16(env, jcountry_name))); 865 base::android::ConvertJavaStringToUTF16(env, jcountry_name)));
937 } 866 }
938 867
939 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { 868 static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) {
940 PersonalDataManagerAndroid* personal_data_manager_android = 869 PersonalDataManagerAndroid* personal_data_manager_android =
941 new PersonalDataManagerAndroid(env, obj); 870 new PersonalDataManagerAndroid(env, obj);
942 return reinterpret_cast<intptr_t>(personal_data_manager_android); 871 return reinterpret_cast<intptr_t>(personal_data_manager_android);
943 } 872 }
944 873
945 } // namespace autofill 874 } // namespace autofill
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698