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

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java

Issue 2093363002: Autofill address editor in PaymentRequest UI. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@contact-editor
Patch Set: Fix try-bot Created 4 years, 6 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 side-by-side diff with in-line comments
Download patch
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 1ab439e13af48533ef64f65484f52d5be16517db..7e5b7bdb88496feff2c3faa465d73d748790f963 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,62 @@ 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 == SectionInformation.NO_SELECTION
+ && !mMerchantNeedsShippingAddress) {
+ 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;
+ if (isComplete
+ && firstCompleteContactIndex == SectionInformation.NO_SELECTION) {
+ firstCompleteContactIndex = i;
+ }
}
- 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 +299,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 +338,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 +583,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 +607,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 +617,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) {

Powered by Google App Engine
This is Rietveld 408576698