Commit e45fdec6 authored by Liquan (Max) Gu's avatar Liquan (Max) Gu Committed by Commit Bot

[WebLayer] Extracts an interface for PaymentResponseHelper

Breaks the current PaymentResponseHelper into 2 parts:
* PaymentResponseHelperInterface: a general interface.
* ChromePaymentResponseHelper: the helper that's used by Chrome, which
  includes the Autofill feature.

With the PaymentResponseHelperInterface, we will create another general
purpose implementation (without Autofill) that can be used by the
WebLayer.

Bug: 1146159

Change-Id: I7cbfbd9486f085179d2298fdf29428fd641217e7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2521369
Commit-Queue: Liquan (Max) Gu <maxlg@chromium.org>
Reviewed-by: default avatarRouslan Solomakhin <rouslan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#825193}
parent 88e2eb52
...@@ -1242,12 +1242,12 @@ chrome_java_sources = [ ...@@ -1242,12 +1242,12 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/payments/CardEditor.java", "java/src/org/chromium/chrome/browser/payments/CardEditor.java",
"java/src/org/chromium/chrome/browser/payments/ChromePaymentRequestFactory.java", "java/src/org/chromium/chrome/browser/payments/ChromePaymentRequestFactory.java",
"java/src/org/chromium/chrome/browser/payments/ChromePaymentRequestService.java", "java/src/org/chromium/chrome/browser/payments/ChromePaymentRequestService.java",
"java/src/org/chromium/chrome/browser/payments/ChromePaymentResponseHelper.java",
"java/src/org/chromium/chrome/browser/payments/ContactEditor.java", "java/src/org/chromium/chrome/browser/payments/ContactEditor.java",
"java/src/org/chromium/chrome/browser/payments/PaymentAppServiceBridge.java", "java/src/org/chromium/chrome/browser/payments/PaymentAppServiceBridge.java",
"java/src/org/chromium/chrome/browser/payments/PaymentManifestVerifier.java", "java/src/org/chromium/chrome/browser/payments/PaymentManifestVerifier.java",
"java/src/org/chromium/chrome/browser/payments/PaymentManifestWebDataService.java", "java/src/org/chromium/chrome/browser/payments/PaymentManifestWebDataService.java",
"java/src/org/chromium/chrome/browser/payments/PaymentPreferencesUtil.java", "java/src/org/chromium/chrome/browser/payments/PaymentPreferencesUtil.java",
"java/src/org/chromium/chrome/browser/payments/PaymentResponseHelper.java",
"java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentAppBridge.java", "java/src/org/chromium/chrome/browser/payments/ServiceWorkerPaymentAppBridge.java",
"java/src/org/chromium/chrome/browser/payments/SettingsAutofillAndPaymentsObserver.java", "java/src/org/chromium/chrome/browser/payments/SettingsAutofillAndPaymentsObserver.java",
"java/src/org/chromium/chrome/browser/payments/ShippingStrings.java", "java/src/org/chromium/chrome/browser/payments/ShippingStrings.java",
......
...@@ -42,6 +42,8 @@ import org.chromium.components.payments.PaymentOptionsUtils; ...@@ -42,6 +42,8 @@ import org.chromium.components.payments.PaymentOptionsUtils;
import org.chromium.components.payments.PaymentRequestService; import org.chromium.components.payments.PaymentRequestService;
import org.chromium.components.payments.PaymentRequestServiceUtil; import org.chromium.components.payments.PaymentRequestServiceUtil;
import org.chromium.components.payments.PaymentRequestSpec; import org.chromium.components.payments.PaymentRequestSpec;
import org.chromium.components.payments.PaymentResponseHelperInterface;
import org.chromium.components.payments.PaymentResponseHelperInterface.PaymentResponseResultCallback;
import org.chromium.components.payments.PaymentUIsObserver; import org.chromium.components.payments.PaymentUIsObserver;
import org.chromium.components.payments.PaymentValidator; import org.chromium.components.payments.PaymentValidator;
import org.chromium.components.payments.Section; import org.chromium.components.payments.Section;
...@@ -70,12 +72,11 @@ import java.util.Set; ...@@ -70,12 +72,11 @@ import java.util.Set;
* This is the Clank specific parts of {@link PaymentRequest}, with the parts shared with WebLayer * This is the Clank specific parts of {@link PaymentRequest}, with the parts shared with WebLayer
* living in {@link PaymentRequestService}. * living in {@link PaymentRequestService}.
*/ */
public class ChromePaymentRequestService public class ChromePaymentRequestService implements BrowserPaymentRequest, PaymentApp.AbortCallback,
implements BrowserPaymentRequest, PaymentApp.AbortCallback, PaymentApp.InstrumentDetailsCallback,
PaymentApp.InstrumentDetailsCallback, PaymentResponseResultCallback,
PaymentResponseHelper.PaymentResponseRequesterDelegate, PaymentDetailsConverter.MethodChecker,
PaymentDetailsConverter.MethodChecker, PaymentUiService.Delegate, PaymentUiService.Delegate, PaymentUIsObserver {
PaymentUIsObserver {
private static final String TAG = "PaymentRequest"; private static final String TAG = "PaymentRequest";
/** /**
...@@ -119,7 +120,7 @@ public class ChromePaymentRequestService ...@@ -119,7 +120,7 @@ public class ChromePaymentRequestService
private boolean mDidRecordShowEvent; private boolean mDidRecordShowEvent;
/** The helper to create and fill the response to send to the merchant. */ /** The helper to create and fill the response to send to the merchant. */
private PaymentResponseHelper mPaymentResponseHelper; private PaymentResponseHelperInterface mPaymentResponseHelper;
/** A helper to manage the Skip-to-GPay experimental flow. */ /** A helper to manage the Skip-to-GPay experimental flow. */
private SkipToGPayHelper mSkipToGPayHelper; private SkipToGPayHelper mSkipToGPayHelper;
...@@ -854,9 +855,9 @@ public class ChromePaymentRequestService ...@@ -854,9 +855,9 @@ public class ChromePaymentRequestService
EditableOption selectedContact = mPaymentUiService.getContactSection() != null EditableOption selectedContact = mPaymentUiService.getContactSection() != null
? mPaymentUiService.getContactSection().getSelectedItem() ? mPaymentUiService.getContactSection().getSelectedItem()
: null; : null;
mPaymentResponseHelper = new PaymentResponseHelper(selectedShippingAddress, mPaymentResponseHelper = new ChromePaymentResponseHelper(selectedShippingAddress,
selectedShippingOption, selectedContact, selectedPaymentApp, mPaymentOptions, selectedShippingOption, selectedContact, selectedPaymentApp, mPaymentOptions,
mSkipToGPayHelper != null, this); mSkipToGPayHelper != null);
selectedPaymentApp.setPaymentHandlerHost(getPaymentHandlerHost()); selectedPaymentApp.setPaymentHandlerHost(getPaymentHandlerHost());
// Only native apps can use PaymentDetailsUpdateService. // Only native apps can use PaymentDetailsUpdateService.
...@@ -1113,7 +1114,8 @@ public class ChromePaymentRequestService ...@@ -1113,7 +1114,8 @@ public class ChromePaymentRequestService
mJourneyLogger.setEventOccurred(Event.RECEIVED_INSTRUMENT_DETAILS); mJourneyLogger.setEventOccurred(Event.RECEIVED_INSTRUMENT_DETAILS);
mPaymentResponseHelper.onPaymentDetailsReceived(methodName, stringifiedDetails, payerData); mPaymentResponseHelper.generatePaymentResponse(
methodName, stringifiedDetails, payerData, /*resultCallback=*/this);
} }
@Override @Override
......
...@@ -12,6 +12,7 @@ import org.chromium.components.autofill.EditableOption; ...@@ -12,6 +12,7 @@ import org.chromium.components.autofill.EditableOption;
import org.chromium.components.payments.PayerData; import org.chromium.components.payments.PayerData;
import org.chromium.components.payments.PaymentAddressTypeConverter; import org.chromium.components.payments.PaymentAddressTypeConverter;
import org.chromium.components.payments.PaymentApp; import org.chromium.components.payments.PaymentApp;
import org.chromium.components.payments.PaymentResponseHelperInterface;
import org.chromium.payments.mojom.PayerDetail; import org.chromium.payments.mojom.PayerDetail;
import org.chromium.payments.mojom.PaymentOptions; import org.chromium.payments.mojom.PaymentOptions;
import org.chromium.payments.mojom.PaymentResponse; import org.chromium.payments.mojom.PaymentResponse;
...@@ -19,49 +20,34 @@ import org.chromium.payments.mojom.PaymentResponse; ...@@ -19,49 +20,34 @@ import org.chromium.payments.mojom.PaymentResponse;
/** /**
* The helper class to create and prepare a PaymentResponse. * The helper class to create and prepare a PaymentResponse.
*/ */
public class PaymentResponseHelper implements NormalizedAddressRequestDelegate { public class ChromePaymentResponseHelper
/** implements NormalizedAddressRequestDelegate, PaymentResponseHelperInterface {
* Observer to be notified when the payment response is completed.
*/
public interface PaymentResponseRequesterDelegate {
/*
* Called when the payment response is ready to be sent to the merchant.
*
* @param response The payment response to send to the merchant.
*/
void onPaymentResponseReady(PaymentResponse response);
}
private AutofillAddress mSelectedShippingAddress;
private final AutofillContact mSelectedContact; private final AutofillContact mSelectedContact;
private PaymentResponse mPaymentResponse;
private PaymentResponseRequesterDelegate mDelegate;
private boolean mIsWaitingForShippingNormalization;
private boolean mIsWaitingForPaymentsDetails = true;
private final PaymentApp mSelectedPaymentApp; private final PaymentApp mSelectedPaymentApp;
private final PaymentOptions mPaymentOptions; private final PaymentOptions mPaymentOptions;
private final boolean mSkipToGpay; private final boolean mSkipToGpay;
private AutofillAddress mSelectedShippingAddress;
private PaymentResponse mPaymentResponse;
private PaymentResponseResultCallback mResultCallback;
private boolean mIsWaitingForShippingNormalization;
private boolean mIsWaitingForPaymentsDetails = true;
private PayerData mPayerDataFromPaymentApp; private PayerData mPayerDataFromPaymentApp;
/** /**
* Builds a helper to contruct and fill a PaymentResponse. * Builds a helper to contruct and fill a PaymentResponse.
*
* @param selectedShippingAddress The shipping address picked by the user. * @param selectedShippingAddress The shipping address picked by the user.
* @param selectedShippingOption The shipping option picked by the user. * @param selectedShippingOption The shipping option picked by the user.
* @param selectedContact The contact info picked by the user. * @param selectedContact The contact info picked by the user.
* @param selectedPaymentApp The payment app picked by the user. * @param selectedPaymentApp The payment app picked by the user.
* @param paymentOptions The paymentOptions of the corresponding payment request. * @param paymentOptions The paymentOptions of the corresponding payment request.
* @param skipToGpay Whether or not Gpay bridge is activated for skip to Gpay. * @param skipToGpay Whether or not Gpay bridge is activated for skip to Gpay.
* @param delegate The object that will receive the completed PaymentResponse.
*/ */
public PaymentResponseHelper(EditableOption selectedShippingAddress, public ChromePaymentResponseHelper(EditableOption selectedShippingAddress,
EditableOption selectedShippingOption, EditableOption selectedContact, EditableOption selectedShippingOption, EditableOption selectedContact,
PaymentApp selectedPaymentApp, PaymentOptions paymentOptions, boolean skipToGpay, PaymentApp selectedPaymentApp, PaymentOptions paymentOptions, boolean skipToGpay) {
PaymentResponseRequesterDelegate delegate) {
mPaymentResponse = new PaymentResponse(); mPaymentResponse = new PaymentResponse();
mPaymentResponse.payer = new PayerDetail(); mPaymentResponse.payer = new PayerDetail();
mDelegate = delegate;
mSelectedPaymentApp = selectedPaymentApp; mSelectedPaymentApp = selectedPaymentApp;
mPaymentOptions = paymentOptions; mPaymentOptions = paymentOptions;
mSkipToGpay = skipToGpay; mSkipToGpay = skipToGpay;
...@@ -107,15 +93,10 @@ public class PaymentResponseHelper implements NormalizedAddressRequestDelegate { ...@@ -107,15 +93,10 @@ public class PaymentResponseHelper implements NormalizedAddressRequestDelegate {
} }
} }
/** @Override
* Called after the payment details were received. public void generatePaymentResponse(String methodName, String stringifiedDetails,
* PayerData payerData, PaymentResponseResultCallback resultCallback) {
* @param methodName The payment method name being used for payment. mResultCallback = resultCallback;
* @param stringifiedDetails A string containing all the details of the payment.
* @param payerData The payer data received from the payment app.
*/
public void onPaymentDetailsReceived(
String methodName, String stringifiedDetails, PayerData payerData) {
mPaymentResponse.methodName = methodName; mPaymentResponse.methodName = methodName;
mPaymentResponse.stringifiedDetails = stringifiedDetails; mPaymentResponse.stringifiedDetails = stringifiedDetails;
mPayerDataFromPaymentApp = payerData; mPayerDataFromPaymentApp = payerData;
...@@ -123,7 +104,7 @@ public class PaymentResponseHelper implements NormalizedAddressRequestDelegate { ...@@ -123,7 +104,7 @@ public class PaymentResponseHelper implements NormalizedAddressRequestDelegate {
mIsWaitingForPaymentsDetails = false; mIsWaitingForPaymentsDetails = false;
// Wait for the shipping address normalization before sending the response. // Wait for the shipping address normalization before sending the response.
if (!mIsWaitingForShippingNormalization) generatePaymentResponse(); if (!mIsWaitingForShippingNormalization) onAllDataReady();
} }
@Override @Override
...@@ -139,7 +120,7 @@ public class PaymentResponseHelper implements NormalizedAddressRequestDelegate { ...@@ -139,7 +120,7 @@ public class PaymentResponseHelper implements NormalizedAddressRequestDelegate {
} }
// Wait for the payment details before sending the response. // Wait for the payment details before sending the response.
if (!mIsWaitingForPaymentsDetails) generatePaymentResponse(); if (!mIsWaitingForPaymentsDetails) onAllDataReady();
} }
@Override @Override
...@@ -147,7 +128,7 @@ public class PaymentResponseHelper implements NormalizedAddressRequestDelegate { ...@@ -147,7 +128,7 @@ public class PaymentResponseHelper implements NormalizedAddressRequestDelegate {
onAddressNormalized(profile); onAddressNormalized(profile);
} }
private void generatePaymentResponse() { private void onAllDataReady() {
assert !mIsWaitingForPaymentsDetails; assert !mIsWaitingForPaymentsDetails;
assert !mIsWaitingForShippingNormalization; assert !mIsWaitingForShippingNormalization;
...@@ -197,6 +178,6 @@ public class PaymentResponseHelper implements NormalizedAddressRequestDelegate { ...@@ -197,6 +178,6 @@ public class PaymentResponseHelper implements NormalizedAddressRequestDelegate {
PhoneNumberUtil.formatForResponse(mPaymentResponse.payer.phone); PhoneNumberUtil.formatForResponse(mPaymentResponse.payer.phone);
} }
mDelegate.onPaymentResponseReady(mPaymentResponse); mResultCallback.onPaymentResponseReady(mPaymentResponse);
} }
} }
...@@ -133,6 +133,7 @@ android_library("all_java") { ...@@ -133,6 +133,7 @@ android_library("all_java") {
"java/src/org/chromium/components/payments/PaymentRequestService.java", "java/src/org/chromium/components/payments/PaymentRequestService.java",
"java/src/org/chromium/components/payments/PaymentRequestServiceUtil.java", "java/src/org/chromium/components/payments/PaymentRequestServiceUtil.java",
"java/src/org/chromium/components/payments/PaymentRequestSpec.java", "java/src/org/chromium/components/payments/PaymentRequestSpec.java",
"java/src/org/chromium/components/payments/PaymentResponseHelperInterface.java",
"java/src/org/chromium/components/payments/PaymentUIsObserver.java", "java/src/org/chromium/components/payments/PaymentUIsObserver.java",
"java/src/org/chromium/components/payments/PaymentValidator.java", "java/src/org/chromium/components/payments/PaymentValidator.java",
"java/src/org/chromium/components/payments/SkipToGPayHelper.java", "java/src/org/chromium/components/payments/SkipToGPayHelper.java",
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.components.payments;
import org.chromium.payments.mojom.PaymentResponse;
/**
* The interface of a helper class that generates a {@link PaymentResponse} with the input of
* payment details.
*/
public interface PaymentResponseHelperInterface {
/**
* Generates a {@link PaymentResponse} with the given payment details.
* @param methodName The payment method name being used for payment.
* @param stringifiedDetails The payment details received from the payment app.
* @param payerData The payer data received from the payment app.
* @param resultCallback The callback that output the payment response.
*/
void generatePaymentResponse(String methodName, String stringifiedDetails, PayerData payerData,
PaymentResponseResultCallback resultCallback);
/** The callback that output the payment response. */
interface PaymentResponseResultCallback {
/*
* Called when the payment response is generated.
* @param response The payment response to send to the merchant.
*/
void onPaymentResponseReady(PaymentResponse response);
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment