Index: chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentResponseHelper.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentResponseHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentResponseHelper.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e84b29f63f38c2f3e3dc9fb5b5bf8e6fbbdaa793 |
--- /dev/null |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentResponseHelper.java |
@@ -0,0 +1,140 @@ |
+// Copyright 2016 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.chrome.browser.payments; |
+ |
+import android.os.Handler; |
+ |
+import org.chromium.chrome.browser.autofill.PersonalDataManager; |
+import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; |
+import org.chromium.chrome.browser.autofill.PersonalDataManager.NormalizedAddressRequestDelegate; |
+import org.chromium.chrome.browser.payments.ui.PaymentOption; |
+import org.chromium.payments.mojom.PaymentResponse; |
+ |
+/** |
+ * The helper class to create and prepare a PaymentResponse. |
+ */ |
+public class PaymentResponseHelper implements NormalizedAddressRequestDelegate { |
+ /** |
+ * 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 PaymentResponse mPaymentResponse; |
+ private PaymentResponseRequesterDelegate mDelegate; |
+ private boolean mIsWaitingForShippingNormalization; |
+ private boolean mIsWaitingForPaymentsDetails = true; |
+ |
+ /** |
+ * Builds a helper to contruct and fill a PaymentResponse. |
+ * |
+ * @param selectedShippingAddress The shipping address picked by the user. |
+ * @param selectedShippingOption The shipping option picked by the user. |
+ * @param selectedContact The contact info picked by the user. |
+ * @param delegate The object that will recieve the completed PaymentResponse. |
+ */ |
+ public PaymentResponseHelper(PaymentOption selectedShippingAddress, |
+ PaymentOption selectedShippingOption, PaymentOption selectedContact, |
+ PaymentResponseRequesterDelegate delegate) { |
+ mPaymentResponse = new PaymentResponse(); |
+ |
+ mDelegate = delegate; |
+ |
+ // Set up the contact section of the response. |
+ if (selectedContact != null) { |
+ // Contacts are created in PaymentRequestImpl.init(). These should all be instances of |
+ // AutofillContact. |
+ assert selectedContact instanceof AutofillContact; |
+ mPaymentResponse.payerName = ((AutofillContact) selectedContact).getPayerName(); |
+ mPaymentResponse.payerPhone = ((AutofillContact) selectedContact).getPayerPhone(); |
+ mPaymentResponse.payerEmail = ((AutofillContact) selectedContact).getPayerEmail(); |
+ } |
+ |
+ // Set up the shipping section of the response. |
+ if (selectedShippingOption != null && selectedShippingOption.getIdentifier() != null) { |
+ mPaymentResponse.shippingOption = selectedShippingOption.getIdentifier(); |
+ } |
+ |
+ // Set up the shipping address section of the response. |
+ if (selectedShippingAddress != null) { |
+ // Shipping addresses are created in PaymentRequestImpl.init(). These should all be |
+ // instances of AutofillAddress. |
+ assert selectedShippingAddress instanceof AutofillAddress; |
+ AutofillAddress selectedAutofillAddress = (AutofillAddress) selectedShippingAddress; |
+ |
+ // Addresses to be sent to the merchant should always be complete. |
+ assert selectedAutofillAddress.isComplete(); |
+ |
+ // Record the use of the profile. |
+ PersonalDataManager.getInstance().recordAndLogProfileUse( |
+ selectedAutofillAddress.getProfile().getGUID()); |
+ |
+ mPaymentResponse.shippingAddress = selectedAutofillAddress.toPaymentAddress(); |
+ |
+ // The shipping address needs to be normalized before sending the response to the |
+ // merchant. |
+ mIsWaitingForShippingNormalization = true; |
+ PersonalDataManager.getInstance().normalizeAddress( |
+ selectedAutofillAddress.getProfile().getGUID(), |
+ AutofillAddress.getCountryCode(selectedAutofillAddress.getProfile()), this); |
+ } |
+ } |
+ |
+ /** |
+ * Called when the intrument details have started loading. Starts a timeout to stop the shipping |
+ * address normalization if it takes too long. |
+ */ |
+ public void onInstrumentsDetailsLoading() { |
+ if (mIsWaitingForShippingNormalization) { |
+ // If the normalization is not completed yet, start a timer to cancel it if it takes too |
+ // long. |
+ new Handler().postDelayed(new Runnable() { |
+ @Override |
+ public void run() { |
+ onAddressNormalized(null); |
+ } |
+ }, PersonalDataManager.getInstance().getNormalizationTimeoutMS()); |
+ } |
+ } |
+ |
+ /** |
+ * Called after the payment instrument's details were received. |
+ * |
+ * @param methodName The method name of the payment instrument. |
+ * @param stringifiedDetails A string containing all the details of the payment instrument's |
+ * details. |
+ */ |
+ public void onInstrumentDetailsReceived(String methodName, String stringifiedDetails) { |
+ mPaymentResponse.methodName = methodName; |
+ mPaymentResponse.stringifiedDetails = stringifiedDetails; |
+ |
+ mIsWaitingForPaymentsDetails = false; |
+ |
+ // Wait for the shipping address normalization before sending the response. |
+ if (!mIsWaitingForShippingNormalization) mDelegate.onPaymentResponseReady(mPaymentResponse); |
+ } |
+ |
+ @Override |
+ public void onAddressNormalized(AutofillProfile profile) { |
+ // Check if a normalization is still required. |
+ if (!mIsWaitingForShippingNormalization) return; |
+ mIsWaitingForShippingNormalization = false; |
+ |
+ if (profile != null) { |
+ // The normalization finished first: use the normalized address. |
+ mPaymentResponse.shippingAddress = |
+ new AutofillAddress(profile, true /* isComplete */).toPaymentAddress(); |
+ } |
+ |
+ // Wait for the payment details before sending the response. |
+ if (!mIsWaitingForPaymentsDetails) mDelegate.onPaymentResponseReady(mPaymentResponse); |
+ } |
+} |