Chromium Code Reviews| 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 56f79ddacb00f2d1ddd4a39f8770ad49e2d310ec..9b521b7e3afcf36aa347e9863c07ce2561509bf4 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 |
| @@ -23,7 +23,6 @@ import org.chromium.chrome.browser.payments.ui.SectionInformation; |
| import org.chromium.chrome.browser.payments.ui.ShoppingCart; |
| import org.chromium.chrome.browser.preferences.PreferencesLauncher; |
| import org.chromium.chrome.browser.preferences.autofill.AutofillCreditCardEditor; |
| -import org.chromium.chrome.browser.preferences.autofill.AutofillProfileEditor; |
| import org.chromium.chrome.browser.profiles.Profile; |
| import org.chromium.chrome.browser.util.UrlUtilities; |
| import org.chromium.components.safejson.JsonSanitizer; |
| @@ -50,7 +49,6 @@ import java.util.HashMap; |
| import java.util.List; |
| import java.util.Locale; |
| import java.util.Set; |
| -import java.util.regex.Pattern; |
| /** |
| * Android implementation of the PaymentRequest service defined in |
| @@ -126,9 +124,9 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
| private SectionInformation mPaymentMethodsSection; |
| private PaymentRequestUI mUI; |
| private Callback<PaymentInformation> mPaymentInformationCallback; |
| - private Pattern mRegionCodePattern; |
| private boolean mMerchantNeedsShippingAddress; |
| private boolean mPaymentAppRunning; |
| + private AddressEditor mAddressEditor; |
| private ContactEditor mContactEditor; |
| /** |
| @@ -170,7 +168,6 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
| }); |
| mApps = PaymentAppFactory.create(webContents); |
| - mRegionCodePattern = Pattern.compile(AutofillAddress.REGION_CODE_PATTERN); |
| } |
| /** |
| @@ -218,50 +215,58 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
| boolean requestPayerPhone = options != null && options.requestPayerPhone; |
| boolean requestPayerEmail = options != null && options.requestPayerEmail; |
| - if (requestPayerPhone || requestPayerEmail) { |
| - mContactEditor = new ContactEditor(requestPayerPhone, requestPayerEmail); |
| - } |
| + List<AutofillProfile> profiles = null; |
| if (requestShipping || requestPayerPhone || requestPayerEmail) { |
| - List<AutofillProfile> profiles = |
| - PersonalDataManager.getInstance().getProfilesToSuggest(); |
| - List<AutofillContact> contacts = new ArrayList<>(); |
| + profiles = PersonalDataManager.getInstance().getProfilesToSuggest(); |
| + } |
| + |
| + if (requestShipping) { |
| + mAddressEditor = new AddressEditor(); |
| List<AutofillAddress> addresses = new ArrayList<>(); |
| - int firstCompleteContactIndex = SectionInformation.NO_SELECTION; |
| + int firstCompleteAddressIndex = SectionInformation.NO_SELECTION; |
| + |
| for (int i = 0; i < profiles.size(); i++) { |
| AutofillProfile profile = profiles.get(i); |
| + mAddressEditor.addPhoneNumberIfValid(profile.getPhoneNumber()); |
| + boolean isComplete = mAddressEditor.isProfileComplete(profile); |
| + addresses.add(new AutofillAddress(profile, isComplete)); |
| + if (isComplete && firstCompleteAddressIndex < 0 && !mMerchantNeedsShippingAddress) { |
|
gone
2016/06/28 17:30:29
firstCompleteAddressIndex == SectionInformation.NO
please use gerrit instead
2016/06/29 00:28:45
Done.
|
| + firstCompleteAddressIndex = i; |
| + } |
| + } |
| + |
| + // The shipping address section automatically selects the first complete entry. |
| + mShippingAddressesSection = |
| + new SectionInformation(PaymentRequestUI.TYPE_SHIPPING_ADDRESSES, |
| + firstCompleteAddressIndex, addresses); |
| + } |
| + |
| + if (requestPayerPhone || requestPayerEmail) { |
| + mContactEditor = new ContactEditor(requestPayerPhone, requestPayerEmail); |
| + List<AutofillContact> contacts = new ArrayList<>(); |
| + int firstCompleteContactIndex = SectionInformation.NO_SELECTION; |
| + |
| + for (int i = 0; i < profiles.size(); i++) { |
| + AutofillProfile profile = profiles.get(i); |
| String phone = requestPayerPhone && !TextUtils.isEmpty(profile.getPhoneNumber()) |
| ? profile.getPhoneNumber() : null; |
| String email = requestPayerEmail && !TextUtils.isEmpty(profile.getEmailAddress()) |
| ? profile.getEmailAddress() : null; |
| + mContactEditor.addPhoneNumberIfValid(phone); |
| + mContactEditor.addEmailAddressIfValid(email); |
| + |
| if (phone != null || email != null) { |
| boolean isComplete = mContactEditor.isContactInformationComplete(phone, email); |
| contacts.add(new AutofillContact(profile, phone, email, isComplete)); |
| if (isComplete && firstCompleteContactIndex < 0) firstCompleteContactIndex = i; |
| - mContactEditor.addPhoneNumberIfValid(phone); |
| - mContactEditor.addEmailAddressIfValid(email); |
| - } |
| - |
| - if (canUseAddress(profile, requestShipping)) { |
| - addresses.add(new AutofillAddress(profile)); |
| - } |
| - } |
| - |
| - if (requestShipping) { |
| - int selectedIndex = SectionInformation.NO_SELECTION; |
| - if (!addresses.isEmpty() && mUiShippingOptions.getSelectedItem() != null) { |
| - selectedIndex = 0; |
| } |
| - mShippingAddressesSection = new SectionInformation( |
| - PaymentRequestUI.TYPE_SHIPPING_ADDRESSES, selectedIndex, addresses); |
| } |
| // The contact section automatically selects the first complete entry. |
| - if (requestPayerPhone || requestPayerEmail) { |
| - mContactSection = new SectionInformation( |
| - PaymentRequestUI.TYPE_CONTACT_DETAILS, firstCompleteContactIndex, contacts); |
| - } |
| + mContactSection = new SectionInformation( |
| + PaymentRequestUI.TYPE_CONTACT_DETAILS, firstCompleteContactIndex, contacts); |
| } |
| mPendingApps = new ArrayList<>(mApps); |
| @@ -290,6 +295,7 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
| if (mFavicon != null) mUI.setTitleBitmap(mFavicon); |
| mFavicon = null; |
| + if (mAddressEditor != null) mAddressEditor.setEditorView(mUI.getEditorView()); |
| if (mContactEditor != null) mContactEditor.setEditorView(mUI.getEditorView()); |
| } |
| @@ -328,16 +334,6 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
| return result; |
| } |
| - private boolean canUseAddress(AutofillProfile profile, boolean requestShipping) { |
| - return requestShipping && profile.getCountryCode() != null |
| - && mRegionCodePattern.matcher(profile.getCountryCode()).matches() |
| - && profile.getStreetAddress() != null && profile.getRegion() != null |
| - && profile.getLocality() != null && profile.getDependentLocality() != null |
| - && profile.getPostalCode() != null && profile.getSortingCode() != null |
| - && profile.getCompanyName() != null && profile.getFullName() != null |
| - && profile.getPhoneNumber() != null; |
| - } |
| - |
| /** |
| * Called by merchant to update the shipping options and line items after the user has selected |
| * their shipping address or shipping option. |
| @@ -583,11 +579,21 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
| PaymentOption option, Callback<PaymentInformation> callback) { |
| if (optionType == PaymentRequestUI.TYPE_SHIPPING_ADDRESSES) { |
| assert option instanceof AutofillAddress; |
| - mShippingAddressesSection.setSelectedItem(option); |
| + AutofillAddress address = (AutofillAddress) option; |
| + |
| + if (address.isComplete()) { |
| + mShippingAddressesSection.setSelectedItem(option); |
| + |
| + // This updates the line items and the shipping options asynchronously. |
| + if (mMerchantNeedsShippingAddress) { |
| + mClient.onShippingAddressChange(address.toPaymentAddress()); |
| + } |
| + } else { |
| + editAddress(address); |
| + } |
| + |
| if (mMerchantNeedsShippingAddress) { |
| mPaymentInformationCallback = callback; |
| - // This updates the line items and the shipping options asynchronously. |
| - mClient.onShippingAddressChange(((AutofillAddress) option).toPaymentAddress()); |
| return true; |
| } |
| } else if (optionType == PaymentRequestUI.TYPE_SHIPPING_OPTIONS) { |
| @@ -597,6 +603,7 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
| } else if (optionType == PaymentRequestUI.TYPE_CONTACT_DETAILS) { |
| assert option instanceof AutofillContact; |
| AutofillContact contact = (AutofillContact) option; |
| + |
| if (contact.isComplete()) { |
| mContactSection.setSelectedItem(option); |
| } else { |
| @@ -606,23 +613,57 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
| assert option instanceof PaymentInstrument; |
| mPaymentMethodsSection.setSelectedItem(option); |
| } |
| + |
| return false; |
| } |
| @Override |
| - public void onSectionAddOption(@PaymentRequestUI.DataType int optionType) { |
| + public boolean onSectionAddOption( |
| + @PaymentRequestUI.DataType int optionType, Callback<PaymentInformation> callback) { |
| if (optionType == PaymentRequestUI.TYPE_SHIPPING_ADDRESSES) { |
| - PreferencesLauncher.launchSettingsPage(mContext, AutofillProfileEditor.class.getName()); |
| + editAddress(null); |
| + |
| + if (mMerchantNeedsShippingAddress) { |
| + mPaymentInformationCallback = callback; |
| + return true; |
| + } |
| } else if (optionType == PaymentRequestUI.TYPE_CONTACT_DETAILS) { |
| editContact(null); |
| } else if (optionType == PaymentRequestUI.TYPE_PAYMENT_METHODS) { |
| PreferencesLauncher.launchSettingsPage( |
| mContext, AutofillCreditCardEditor.class.getName()); |
| } |
| + |
| + return false; |
| + } |
| + |
| + private void editAddress(final AutofillAddress toEdit) { |
| + mAddressEditor.edit(toEdit, new Callback<AutofillAddress>() { |
| + @Override |
| + public void onResult(AutofillAddress completeAddress) { |
| + if (completeAddress == null) { |
| + mShippingAddressesSection.setSelectedItemIndex(SectionInformation.NO_SELECTION); |
| + } else if (toEdit == null) { |
| + mShippingAddressesSection.addAndSelectItem(completeAddress); |
| + } |
| + |
| + if (mMerchantNeedsShippingAddress) { |
| + if (completeAddress == null) { |
| + providePaymentInformation(); |
| + } else { |
| + mClient.onShippingAddressChange(completeAddress.toPaymentAddress()); |
| + } |
| + return; |
| + } |
| + |
| + mUI.updateSection( |
| + PaymentRequestUI.TYPE_SHIPPING_ADDRESSES, mShippingAddressesSection); |
| + } |
| + }); |
| } |
| private void editContact(final AutofillContact toEdit) { |
| - mContactEditor.editContact(toEdit, new Callback<AutofillContact>() { |
| + mContactEditor.edit(toEdit, new Callback<AutofillContact>() { |
| @Override |
| public void onResult(AutofillContact completeContact) { |
| if (completeContact == null) { |