| Index: chrome/browser/autofill/android/personal_data_manager_android.cc
|
| diff --git a/chrome/browser/autofill/android/personal_data_manager_android.cc b/chrome/browser/autofill/android/personal_data_manager_android.cc
|
| index f3c87d171caf62a3391c500bd20072f12464f23e..9a8e24872d4d45244f4f653b11eb26059f3b2656 100644
|
| --- a/chrome/browser/autofill/android/personal_data_manager_android.cc
|
| +++ b/chrome/browser/autofill/android/personal_data_manager_android.cc
|
| @@ -305,6 +305,40 @@ class AndroidAddressNormalizerDelegate
|
| DISALLOW_COPY_AND_ASSIGN(AndroidAddressNormalizerDelegate);
|
| };
|
|
|
| +class GetSubKeysRequester : public PersonalDataManagerAndroid::Delegate,
|
| + public base::SupportsWeakPtr<GetSubKeysRequester> {
|
| + public:
|
| + GetSubKeysRequester(
|
| + JNIEnv* env,
|
| + const base::android::JavaParamRef<jobject>& jdelegate,
|
| + const std::string& region_code,
|
| + base::WeakPtr<PersonalDataManagerAndroid> personal_data_manager_android) {
|
| + jdelegate_.Reset(env, jdelegate);
|
| + region_code_ = region_code;
|
| + personal_data_manager_android_ = personal_data_manager_android;
|
| + env_ = env;
|
| + }
|
| +
|
| + private:
|
| + ~GetSubKeysRequester() override {}
|
| +
|
| + void OnRulesSuccessfullyLoaded() override {
|
| + if (personal_data_manager_android_) {
|
| + JNIEnv* env = base::android::AttachCurrentThread();
|
| + Java_GetSubKeysRequestDelegate_onSubKeysReceived(
|
| + env, jdelegate_,
|
| + personal_data_manager_android_->GetSubKeys(env, region_code_));
|
| + }
|
| + }
|
| +
|
| + ScopedJavaGlobalRef<jobject> jdelegate_;
|
| + std::string region_code_;
|
| + base::WeakPtr<PersonalDataManagerAndroid> personal_data_manager_android_;
|
| + JNIEnv* env_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(GetSubKeysRequester);
|
| +};
|
| +
|
| } // namespace
|
|
|
| PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, jobject obj)
|
| @@ -316,7 +350,14 @@ PersonalDataManagerAndroid::PersonalDataManagerAndroid(JNIEnv* env, jobject obj)
|
| new autofill::ChromeMetadataSource(
|
| I18N_ADDRESS_VALIDATION_DATA_URL,
|
| personal_data_manager_->GetURLRequestContextGetter())),
|
| - ValidationRulesStorageFactory::CreateStorage()) {
|
| + ValidationRulesStorageFactory::CreateStorage()),
|
| + address_validator_(
|
| + std::unique_ptr<::i18n::addressinput::Source>(
|
| + new autofill::ChromeMetadataSource(
|
| + I18N_ADDRESS_VALIDATION_DATA_URL,
|
| + personal_data_manager_->GetURLRequestContextGetter())),
|
| + ValidationRulesStorageFactory::CreateStorage(),
|
| + this) {
|
| personal_data_manager_->AddObserver(this);
|
| }
|
|
|
| @@ -697,7 +738,7 @@ jlong PersonalDataManagerAndroid::GetCurrentDateForTesting(
|
| return base::Time::Now().ToTimeT();
|
| }
|
|
|
| -void PersonalDataManagerAndroid::LoadRulesForRegion(
|
| +void PersonalDataManagerAndroid::LoadRulesForAddressNormalization(
|
| JNIEnv* env,
|
| const base::android::JavaParamRef<jobject>& unused_obj,
|
| const base::android::JavaParamRef<jstring>& jregion_code) {
|
| @@ -705,6 +746,13 @@ void PersonalDataManagerAndroid::LoadRulesForRegion(
|
| ConvertJavaStringToUTF8(env, jregion_code));
|
| }
|
|
|
| +void PersonalDataManagerAndroid::LoadRulesForSubKeys(
|
| + JNIEnv* env,
|
| + const base::android::JavaParamRef<jobject>& unused_obj,
|
| + const base::android::JavaParamRef<jstring>& jregion_code) {
|
| + address_validator_.LoadRules(ConvertJavaStringToUTF8(env, jregion_code));
|
| +}
|
| +
|
| void PersonalDataManagerAndroid::StartAddressNormalization(
|
| JNIEnv* env,
|
| const JavaParamRef<jobject>& unused_obj,
|
| @@ -739,6 +787,59 @@ jboolean PersonalDataManagerAndroid::HasCreditCards(
|
| return !personal_data_manager_->GetCreditCards().empty();
|
| }
|
|
|
| +base::android::ScopedJavaLocalRef<jobjectArray>
|
| +PersonalDataManagerAndroid::GetSubKeys(JNIEnv* env,
|
| + const std::string& region_code) {
|
| + std::vector<std::string> sub_keys =
|
| + address_validator_.GetRegionSubKeys(region_code);
|
| + return base::android::ToJavaArrayOfStrings(env, sub_keys);
|
| +}
|
| +
|
| +void PersonalDataManagerAndroid::OnAddressRulesLoaded(
|
| + const std::string& region_code,
|
| + bool success) {
|
| + // Check if there is any sub-key request.
|
| + auto it = pending_subkeys_request_.find(region_code);
|
| + if (it != pending_subkeys_request_.end()) {
|
| + for (size_t i = 0; i < it->second.size(); ++i) {
|
| + it->second[i]->OnRulesSuccessfullyLoaded();
|
| + }
|
| + pending_subkeys_request_.erase(it);
|
| + }
|
| +}
|
| +
|
| +void PersonalDataManagerAndroid::StartGettingRegionSubKeys(
|
| + JNIEnv* env,
|
| + const JavaParamRef<jobject>& unused_obj,
|
| + const JavaParamRef<jstring>& jregion_code,
|
| + const JavaParamRef<jobject>& jdelegate) {
|
| + const std::string region_code = ConvertJavaStringToUTF8(env, jregion_code);
|
| + std::unique_ptr<Delegate> requester(
|
| + new GetSubKeysRequester(env, jdelegate, region_code, AsWeakPtr()));
|
| +
|
| + if (AreRulesLoadedForRegion(region_code)) {
|
| + requester->OnRulesSuccessfullyLoaded();
|
| + } else {
|
| + // Setup the variables so that the sub-keys request is sent, when the rules
|
| + // are loaded.
|
| + auto it = pending_subkeys_request_.find(region_code);
|
| + if (it == pending_subkeys_request_.end()) {
|
| + // If no entry exists, create the entry and assign it to |it|.
|
| + it = pending_subkeys_request_
|
| + .insert(std::make_pair(region_code,
|
| + std::vector<std::unique_ptr<Delegate>>()))
|
| + .first;
|
| + }
|
| + it->second.push_back(std::move(requester));
|
| + }
|
| +}
|
| +
|
| +void PersonalDataManagerAndroid::CancelPendingGetSubKeys(
|
| + JNIEnv* env,
|
| + const base::android::JavaParamRef<jobject>& unused_obj) {
|
| + pending_subkeys_request_.clear();
|
| +}
|
| +
|
| ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileGUIDs(
|
| JNIEnv* env,
|
| const std::vector<AutofillProfile*>& profiles) {
|
| @@ -761,7 +862,7 @@ ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetCreditCardGUIDs(
|
|
|
| bool PersonalDataManagerAndroid::AreRulesLoadedForRegion(
|
| const std::string& region_code) {
|
| - return address_normalizer_.AreRulesLoadedForRegion(region_code);
|
| + return address_validator_.AreRulesLoadedForRegion(region_code);
|
| }
|
|
|
| ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileLabels(
|
|
|