| 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 efedc9279891aba2c37ad0754e7035107b21198b..c95cb333cd53b10330986cd01245309e5b0ab2b0 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
|
| @@ -12,6 +12,7 @@ import android.text.TextUtils;
|
| 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;
|
| @@ -22,8 +23,6 @@ import org.chromium.chrome.browser.payments.ui.PaymentOption;
|
| import org.chromium.chrome.browser.payments.ui.PaymentRequestUI;
|
| 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.AutofillLocalCardEditor;
|
| import org.chromium.chrome.browser.profiles.Profile;
|
| import org.chromium.chrome.browser.util.UrlUtilities;
|
| import org.chromium.components.safejson.JsonSanitizer;
|
| @@ -69,12 +68,13 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| * Called when an abort request was denied.
|
| */
|
| void onPaymentRequestServiceUnableToAbort();
|
| - }
|
|
|
| - /**
|
| - * The size for the favicon in density-independent pixels.
|
| - */
|
| - private static final int FAVICON_SIZE_DP = 24;
|
| + /**
|
| + * Called when the controller is notified of billing address change, but does not alter the
|
| + * editor UI.
|
| + */
|
| + void onPaymentRequestServiceBillingAddressChangeProcessed();
|
| + }
|
|
|
| private static final String TAG = "cr_PaymentRequest";
|
|
|
| @@ -126,6 +126,7 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| private SectionInformation mShippingAddressesSection;
|
| private SectionInformation mContactSection;
|
| private List<PaymentApp> mPendingApps;
|
| + private int mFirstCompletePendingInstrument;
|
| private List<PaymentInstrument> mPendingInstruments;
|
| private SectionInformation mPaymentMethodsSection;
|
| private PaymentRequestUI mUI;
|
| @@ -133,6 +134,7 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| private boolean mMerchantNeedsShippingAddress;
|
| private boolean mPaymentAppRunning;
|
| private AddressEditor mAddressEditor;
|
| + private CardEditor mCardEditor;
|
| private ContactEditor mContactEditor;
|
|
|
| /**
|
| @@ -157,9 +159,9 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| mOrigin = UrlUtilities.formatUrlForSecurityDisplay(webContents.getVisibleUrl(), false);
|
|
|
| final FaviconHelper faviconHelper = new FaviconHelper();
|
| - float scale = mContext.getResources().getDisplayMetrics().density;
|
| faviconHelper.getLocalFaviconImageForURL(Profile.getLastUsedProfile(),
|
| - webContents.getVisibleUrl(), (int) (FAVICON_SIZE_DP * scale + 0.5f),
|
| + webContents.getVisibleUrl(),
|
| + mContext.getResources().getDimensionPixelSize(R.dimen.payments_favicon_size),
|
| new FaviconHelper.FaviconImageCallback() {
|
| @Override
|
| public void onFaviconAvailable(Bitmap bitmap, String iconUrl) {
|
| @@ -174,6 +176,9 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| });
|
|
|
| mApps = PaymentAppFactory.create(webContents);
|
| +
|
| + mAddressEditor = new AddressEditor();
|
| + mCardEditor = new CardEditor(webContents, mAddressEditor, sObserverForTest);
|
| }
|
|
|
| /**
|
| @@ -205,7 +210,7 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| return;
|
| }
|
|
|
| - mMethodData = getValidatedMethodData(methodData);
|
| + mMethodData = getValidatedMethodData(methodData, mCardEditor);
|
| if (mMethodData == null) {
|
| disconnectFromClientWithDebugMessage("Invalid payment methods or data");
|
| return;
|
| @@ -242,7 +247,6 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| }
|
|
|
| if (requestShipping) {
|
| - mAddressEditor = new AddressEditor();
|
| List<AutofillAddress> addresses = new ArrayList<>();
|
|
|
| for (int i = 0; i < profiles.size(); i++) {
|
| @@ -317,6 +321,7 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| }
|
|
|
| mPendingApps = new ArrayList<>(mApps);
|
| + mFirstCompletePendingInstrument = SectionInformation.NO_SELECTION;
|
| mPendingInstruments = new ArrayList<>();
|
| boolean isGettingInstruments = false;
|
|
|
| @@ -342,12 +347,13 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| if (mFavicon != null) mUI.setTitleBitmap(mFavicon);
|
| mFavicon = null;
|
|
|
| - if (mAddressEditor != null) mAddressEditor.setEditorView(mUI.getEditorView());
|
| + mAddressEditor.setEditorView(mUI.getEditorView());
|
| + mCardEditor.setEditorView(mUI.getCardEditorView());
|
| if (mContactEditor != null) mContactEditor.setEditorView(mUI.getEditorView());
|
| }
|
|
|
| private static HashMap<String, JSONObject> getValidatedMethodData(
|
| - PaymentMethodData[] methodData) {
|
| + PaymentMethodData[] methodData, CardEditor paymentMethodsCollector) {
|
| // Payment methodData are required.
|
| if (methodData == null || methodData.length == 0) return null;
|
| HashMap<String, JSONObject> result = new HashMap<>();
|
| @@ -377,6 +383,8 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| if (TextUtils.isEmpty(methods[j])) return null;
|
| result.put(methods[j], data);
|
| }
|
| +
|
| + paymentMethodsCollector.addAcceptedPaymentMethodsIfRecognized(methods);
|
| }
|
| return result;
|
| }
|
| @@ -658,6 +666,15 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| }
|
| } else if (optionType == PaymentRequestUI.TYPE_PAYMENT_METHODS) {
|
| assert option instanceof PaymentInstrument;
|
| + if (option instanceof AutofillPaymentInstrument) {
|
| + AutofillPaymentInstrument card = (AutofillPaymentInstrument) option;
|
| +
|
| + if (!card.isComplete()) {
|
| + editCard(card);
|
| + return false;
|
| + }
|
| + }
|
| +
|
| mPaymentMethodsSection.setSelectedItem(option);
|
| }
|
|
|
| @@ -677,8 +694,7 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| } else if (optionType == PaymentRequestUI.TYPE_CONTACT_DETAILS) {
|
| editContact(null);
|
| } else if (optionType == PaymentRequestUI.TYPE_PAYMENT_METHODS) {
|
| - PreferencesLauncher.launchSettingsPage(
|
| - mContext, AutofillLocalCardEditor.class.getName());
|
| + editCard(null);
|
| }
|
|
|
| return false;
|
| @@ -724,6 +740,21 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| });
|
| }
|
|
|
| + private void editCard(final AutofillPaymentInstrument toEdit) {
|
| + mCardEditor.edit(toEdit, new Callback<AutofillPaymentInstrument>() {
|
| + @Override
|
| + public void onResult(AutofillPaymentInstrument completeCard) {
|
| + if (completeCard == null) {
|
| + mPaymentMethodsSection.setSelectedItemIndex(SectionInformation.NO_SELECTION);
|
| + } else if (toEdit == null) {
|
| + mPaymentMethodsSection.addAndSelectItem(completeCard);
|
| + }
|
| +
|
| + mUI.updateSection(PaymentRequestUI.TYPE_PAYMENT_METHODS, mPaymentMethodsSection);
|
| + }
|
| + });
|
| + }
|
| +
|
| @Override
|
| public boolean onPayClicked(PaymentOption selectedShippingAddress,
|
| PaymentOption selectedShippingOption, PaymentOption selectedPaymentMethod) {
|
| @@ -797,6 +828,7 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| for (int i = 0; i < instruments.size(); i++) {
|
| PaymentInstrument instrument = instruments.get(i);
|
| if (mMethodData.containsKey(instrument.getMethodName())) {
|
| + checkForCompletePaymentInstrument(instrument, mPendingInstruments.size());
|
| mPendingInstruments.add(instrument);
|
| } else {
|
| instrument.dismiss();
|
| @@ -805,14 +837,27 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
|
| }
|
|
|
| if (mPendingApps.isEmpty()) {
|
| - mPaymentMethodsSection = new SectionInformation(
|
| - PaymentRequestUI.TYPE_PAYMENT_METHODS, 0, mPendingInstruments);
|
| + mPaymentMethodsSection = new SectionInformation(PaymentRequestUI.TYPE_PAYMENT_METHODS,
|
| + mFirstCompletePendingInstrument, mPendingInstruments);
|
| mPendingInstruments.clear();
|
|
|
| if (mPaymentInformationCallback != null) providePaymentInformation();
|
| }
|
| }
|
|
|
| + private void checkForCompletePaymentInstrument(PaymentInstrument instrument, int index) {
|
| + boolean isComplete = true;
|
| + if (instrument instanceof AutofillPaymentInstrument) {
|
| + AutofillPaymentInstrument autofillInstrument = (AutofillPaymentInstrument) instrument;
|
| + isComplete = mCardEditor.isCardComplete(autofillInstrument.getCard());
|
| + if (isComplete) autofillInstrument.setIsComplete();
|
| + }
|
| +
|
| + if (isComplete && mFirstCompletePendingInstrument == SectionInformation.NO_SELECTION) {
|
| + mFirstCompletePendingInstrument = index;
|
| + }
|
| + }
|
| +
|
| /**
|
| * Called after retrieving instrument details.
|
| */
|
|
|