| Index: chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
|
| index 99b9ae1703adaa483b32a27744d5d22a70ee558a..56f79ddacb00f2d1ddd4a39f8770ad49e2d310ec 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
|
| @@ -7,20 +7,14 @@ package org.chromium.chrome.browser.payments;
|
| import android.app.Activity;
|
| import android.graphics.Bitmap;
|
| import android.os.Handler;
|
| -import android.telephony.PhoneNumberUtils;
|
| import android.text.TextUtils;
|
| -import android.util.Patterns;
|
|
|
| import org.chromium.base.Callback;
|
| import org.chromium.base.Log;
|
| import org.chromium.base.VisibleForTesting;
|
| -import org.chromium.chrome.R;
|
| import org.chromium.chrome.browser.autofill.PersonalDataManager;
|
| import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
|
| import org.chromium.chrome.browser.favicon.FaviconHelper;
|
| -import org.chromium.chrome.browser.payments.ui.EditorFieldModel;
|
| -import org.chromium.chrome.browser.payments.ui.EditorFieldModel.EditorFieldValidator;
|
| -import org.chromium.chrome.browser.payments.ui.EditorModel;
|
| import org.chromium.chrome.browser.payments.ui.LineItem;
|
| import org.chromium.chrome.browser.payments.ui.PaymentInformation;
|
| import org.chromium.chrome.browser.payments.ui.PaymentOption;
|
| @@ -135,12 +129,7 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| private Pattern mRegionCodePattern;
|
| private boolean mMerchantNeedsShippingAddress;
|
| private boolean mPaymentAppRunning;
|
| - private boolean mRequestPayerPhone;
|
| - private boolean mRequestPayerEmail;
|
| - private List<CharSequence> mAllPhoneNumbers;
|
| - private List<CharSequence> mAllEmailAddresses;
|
| - private EditorFieldValidator mPhoneValidator;
|
| - private EditorFieldValidator mEmailValidator;
|
| + private ContactEditor mContactEditor;
|
|
|
| /**
|
| * Builds the PaymentRequest service implementation.
|
| @@ -227,30 +216,31 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| mMerchantNeedsShippingAddress =
|
| requestShipping && mUiShippingOptions.getSelectedItem() == null;
|
|
|
| - mRequestPayerPhone = options != null && options.requestPayerPhone;
|
| - mRequestPayerEmail = options != null && options.requestPayerEmail;
|
| + boolean requestPayerPhone = options != null && options.requestPayerPhone;
|
| + boolean requestPayerEmail = options != null && options.requestPayerEmail;
|
| + if (requestPayerPhone || requestPayerEmail) {
|
| + mContactEditor = new ContactEditor(requestPayerPhone, requestPayerEmail);
|
| + }
|
|
|
| - if (requestShipping || mRequestPayerPhone || mRequestPayerEmail) {
|
| + if (requestShipping || requestPayerPhone || requestPayerEmail) {
|
| List<AutofillProfile> profiles =
|
| PersonalDataManager.getInstance().getProfilesToSuggest();
|
| List<AutofillContact> contacts = new ArrayList<>();
|
| List<AutofillAddress> addresses = new ArrayList<>();
|
| - mAllPhoneNumbers = new ArrayList<>();
|
| - mAllEmailAddresses = new ArrayList<>();
|
| int firstCompleteContactIndex = SectionInformation.NO_SELECTION;
|
| for (int i = 0; i < profiles.size(); i++) {
|
| AutofillProfile profile = profiles.get(i);
|
|
|
| - String phone = mRequestPayerPhone && !TextUtils.isEmpty(profile.getPhoneNumber())
|
| + String phone = requestPayerPhone && !TextUtils.isEmpty(profile.getPhoneNumber())
|
| ? profile.getPhoneNumber() : null;
|
| - String email = mRequestPayerEmail && !TextUtils.isEmpty(profile.getEmailAddress())
|
| + String email = requestPayerEmail && !TextUtils.isEmpty(profile.getEmailAddress())
|
| ? profile.getEmailAddress() : null;
|
| if (phone != null || email != null) {
|
| - boolean isComplete = isContactInformationComplete(phone, email);
|
| + boolean isComplete = mContactEditor.isContactInformationComplete(phone, email);
|
| contacts.add(new AutofillContact(profile, phone, email, isComplete));
|
| if (isComplete && firstCompleteContactIndex < 0) firstCompleteContactIndex = i;
|
| - if (getPhoneValidator().isValid(phone)) mAllPhoneNumbers.add(phone);
|
| - if (getEmailValidator().isValid(email)) mAllEmailAddresses.add(email);
|
| + mContactEditor.addPhoneNumberIfValid(phone);
|
| + mContactEditor.addEmailAddressIfValid(email);
|
| }
|
|
|
| if (canUseAddress(profile, requestShipping)) {
|
| @@ -268,7 +258,7 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| }
|
|
|
| // The contact section automatically selects the first complete entry.
|
| - if (mRequestPayerPhone || mRequestPayerEmail) {
|
| + if (requestPayerPhone || requestPayerEmail) {
|
| mContactSection = new SectionInformation(
|
| PaymentRequestUI.TYPE_CONTACT_DETAILS, firstCompleteContactIndex, contacts);
|
| }
|
| @@ -295,9 +285,12 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| }
|
|
|
| mUI = new PaymentRequestUI(mContext, this, requestShipping,
|
| - mRequestPayerPhone || mRequestPayerEmail, mMerchantName, mOrigin);
|
| + requestPayerPhone || requestPayerEmail, mMerchantName, mOrigin);
|
| +
|
| if (mFavicon != null) mUI.setTitleBitmap(mFavicon);
|
| mFavicon = null;
|
| +
|
| + if (mContactEditor != null) mContactEditor.setEditorView(mUI.getEditorView());
|
| }
|
|
|
| private static HashMap<String, JSONObject> getValidatedMethodData(
|
| @@ -335,11 +328,6 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| return result;
|
| }
|
|
|
| - private boolean isContactInformationComplete(String phone, String email) {
|
| - return (!mRequestPayerPhone || getPhoneValidator().isValid(phone))
|
| - && (!mRequestPayerEmail || getEmailValidator().isValid(email));
|
| - }
|
| -
|
| private boolean canUseAddress(AutofillProfile profile, boolean requestShipping) {
|
| return requestShipping && profile.getCountryCode() != null
|
| && mRegionCodePattern.matcher(profile.getCountryCode()).matches()
|
| @@ -621,93 +609,6 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| return false;
|
| }
|
|
|
| - private void editContact(final AutofillContact contact) {
|
| - final EditorFieldModel phoneField = mRequestPayerPhone
|
| - ? new EditorFieldModel(EditorFieldModel.INPUT_TYPE_HINT_PHONE,
|
| - mContext.getString(R.string.autofill_profile_editor_phone_number),
|
| - mAllPhoneNumbers, getPhoneValidator(),
|
| - mContext.getString(R.string.payments_phone_required_validation_message),
|
| - mContext.getString(R.string.payments_phone_invalid_validation_message),
|
| - contact == null ? null : contact.getPayerPhone())
|
| - : null;
|
| -
|
| - final EditorFieldModel emailField = mRequestPayerEmail
|
| - ? new EditorFieldModel(EditorFieldModel.INPUT_TYPE_HINT_EMAIL,
|
| - mContext.getString(R.string.autofill_profile_editor_email_address),
|
| - mAllEmailAddresses, getEmailValidator(),
|
| - mContext.getString(R.string.payments_email_required_validation_message),
|
| - mContext.getString(R.string.payments_email_invalid_validation_message),
|
| - contact == null ? null : contact.getPayerEmail())
|
| - : null;
|
| -
|
| - EditorModel editor =
|
| - new EditorModel(mContext.getString(R.string.payments_add_contact_details_label));
|
| - if (phoneField != null) editor.addField(phoneField);
|
| - if (emailField != null) editor.addField(emailField);
|
| -
|
| - editor.setCancelCallback(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - mContactSection.setSelectedItemIndex(SectionInformation.NO_SELECTION);
|
| - mUI.updateSection(PaymentRequestUI.TYPE_CONTACT_DETAILS, mContactSection);
|
| - }
|
| - });
|
| -
|
| - editor.setDoneCallback(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - AutofillProfile profile =
|
| - contact != null ? contact.getProfile() : new AutofillProfile();
|
| - String phone = null;
|
| - String email = null;
|
| - if (phoneField != null) {
|
| - phone = phoneField.getValue().toString();
|
| - profile.setPhoneNumber(phone);
|
| - }
|
| - if (emailField != null) {
|
| - email = emailField.getValue().toString();
|
| - profile.setEmailAddress(email);
|
| - }
|
| - PersonalDataManager.getInstance().setProfile(profile);
|
| -
|
| - if (contact == null) {
|
| - mContactSection.addAndSelectItem(
|
| - new AutofillContact(profile, phone, email, true));
|
| - } else {
|
| - contact.completeContact(phone, email);
|
| - }
|
| - mUI.updateSection(PaymentRequestUI.TYPE_CONTACT_DETAILS, mContactSection);
|
| - }
|
| - });
|
| - mUI.showEditor(editor);
|
| - }
|
| -
|
| - private EditorFieldValidator getPhoneValidator() {
|
| - if (mPhoneValidator == null) {
|
| - mPhoneValidator = new EditorFieldValidator() {
|
| - @Override
|
| - public boolean isValid(CharSequence value) {
|
| - return value != null
|
| - && PhoneNumberUtils.isGlobalPhoneNumber(
|
| - PhoneNumberUtils.stripSeparators(value.toString()));
|
| - }
|
| - };
|
| - }
|
| - return mPhoneValidator;
|
| - }
|
| -
|
| - private EditorFieldValidator getEmailValidator() {
|
| - if (mEmailValidator == null) {
|
| - mEmailValidator = new EditorFieldValidator() {
|
| - @Override
|
| - public boolean isValid(CharSequence value) {
|
| - return value != null && Patterns.EMAIL_ADDRESS.matcher(value).matches();
|
| - }
|
| - };
|
| - }
|
| - return mEmailValidator;
|
| - }
|
| -
|
| @Override
|
| public void onSectionAddOption(@PaymentRequestUI.DataType int optionType) {
|
| if (optionType == PaymentRequestUI.TYPE_SHIPPING_ADDRESSES) {
|
| @@ -720,6 +621,21 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| }
|
| }
|
|
|
| + private void editContact(final AutofillContact toEdit) {
|
| + mContactEditor.editContact(toEdit, new Callback<AutofillContact>() {
|
| + @Override
|
| + public void onResult(AutofillContact completeContact) {
|
| + if (completeContact == null) {
|
| + mContactSection.setSelectedItemIndex(SectionInformation.NO_SELECTION);
|
| + } else if (toEdit == null) {
|
| + mContactSection.addAndSelectItem(completeContact);
|
| + }
|
| +
|
| + mUI.updateSection(PaymentRequestUI.TYPE_CONTACT_DETAILS, mContactSection);
|
| + }
|
| + });
|
| + }
|
| +
|
| @Override
|
| public void onPayClicked(PaymentOption selectedShippingAddress,
|
| PaymentOption selectedShippingOption, PaymentOption selectedPaymentMethod) {
|
|
|