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

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

Issue 2338283003: [Payments] Normalize addresses before passing them to merchants. (Closed)
Patch Set: Async Created 4 years, 3 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 ae353c0e2cf68353cfe9a94a62c9b88d6fb5662c..fcea802f283ebeaf2494fadf7ce19d9e57eb1e4e 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
@@ -15,6 +15,7 @@ import org.chromium.base.VisibleForTesting;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.autofill.NormalizedAddressRequester;
import org.chromium.chrome.browser.autofill.PersonalDataManager;
import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
import org.chromium.chrome.browser.favicon.FaviconHelper;
@@ -66,8 +67,9 @@ import java.util.Set;
* Android implementation of the PaymentRequest service defined in
* third_party/WebKit/public/platform/modules/payments/payment_request.mojom.
*/
-public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Client,
- PaymentApp.InstrumentsCallback, PaymentInstrument.DetailsCallback {
+public class PaymentRequestImpl
please use gerrit instead 2016/09/23 09:04:40 Please don't put a newline before "implements".
sebsg 2016/09/27 18:48:37 Done.
+ implements PaymentRequest, PaymentRequestUI.Client, PaymentApp.InstrumentsCallback,
+ PaymentInstrument.DetailsCallback, NormalizedAddressRequester {
/**
* Observer to be notified when PaymentRequest UI has been dismissed.
*/
@@ -189,6 +191,12 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
/** True if show() was called. */
private boolean mIsShowing;
+ private boolean mIsWaitingForNormalization;
+ private PaymentResponse mPendingPaymentResponse;
+ private boolean mIsPendingResponseProfileComplete;
+ private Handler mNormalizationTimer;
please use gerrit instead 2016/09/23 09:04:40 Reuse mHandler instead.
sebsg 2016/09/27 18:48:37 Done.
+ private static final int NORMALIZATION_TIMEOUT_MS = 5000;
please use gerrit instead 2016/09/23 09:04:40 Put all "private static final" variables together.
sebsg 2016/09/27 18:48:38 Done.
+
/**
* Builds the PaymentRequest service implementation.
*
@@ -290,6 +298,12 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
// Limit the number of suggestions.
addresses = addresses.subList(0, Math.min(addresses.size(), SUGGESTIONS_LIMIT));
+ // Start loading the validation rules for the regions associated with the profiles.
+ for (int i = 0; i < addresses.size(); ++i) {
+ PersonalDataManager.getInstance().loadRulesForRegion(
+ AutofillAddress.getCountryCode(addresses.get(i).getProfile()));
+ }
please use gerrit instead 2016/09/23 09:04:40 If you have 4 address from "CA", then you will cal
sebsg 2016/09/27 18:48:37 Done.
+
// Automatically select the first address if one is complete and if the merchant does
// not require a shipping address to calculate shipping costs.
int firstCompleteAddressIndex = SectionInformation.NO_SELECTION;
@@ -1013,22 +1027,6 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
}
}
- if (mShippingAddressesSection != null) {
- PaymentOption selectedShippingAddress = mShippingAddressesSection.getSelectedItem();
- if (selectedShippingAddress != null) {
- // Shipping addresses are created in show(). These should all be instances of
- // AutofillAddress.
- assert selectedShippingAddress instanceof AutofillAddress;
- AutofillAddress selectedAutofillAddress = (AutofillAddress) selectedShippingAddress;
-
- // Record the use of the profile.
- PersonalDataManager.getInstance().recordAndLogProfileUse(
- selectedAutofillAddress.getProfile().getGUID());
-
- response.shippingAddress = selectedAutofillAddress.toPaymentAddress();
- }
- }
-
if (mUiShippingOptions != null) {
PaymentOption selectedShippingOption = mUiShippingOptions.getSelectedItem();
if (selectedShippingOption != null && selectedShippingOption.getIdentifier() != null) {
@@ -1054,6 +1052,48 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
PaymentRequestMetrics.SELECTED_METHOD_OTHER_PAYMENT_APP);
}
please use gerrit instead 2016/09/23 09:04:39 Write "mUI.showProcessingMessage();" here and remo
sebsg 2016/09/27 18:48:37 Done.
+ if (mShippingAddressesSection != null) {
+ PaymentOption selectedShippingAddress = mShippingAddressesSection.getSelectedItem();
+ if (selectedShippingAddress != null) {
+ // Shipping addresses are created in show(). These should all be instances of
+ // AutofillAddress.
+ assert selectedShippingAddress instanceof AutofillAddress;
+ AutofillAddress selectedAutofillAddress = (AutofillAddress) selectedShippingAddress;
+
+ // Record the use of the profile.
+ PersonalDataManager.getInstance().recordAndLogProfileUse(
+ selectedAutofillAddress.getProfile().getGUID());
+
+ response.shippingAddress = selectedAutofillAddress.toPaymentAddress();
+
+ mUI.showProcessingMessage();
+
+ // Create the normalization task.
+ mIsWaitingForNormalization = true;
+ mPendingPaymentResponse = response;
+ mIsPendingResponseProfileComplete = selectedAutofillAddress.isComplete();
please use gerrit instead 2016/09/23 09:04:40 This should always be true. In fact you can write
sebsg 2016/09/27 18:48:37 Done.
+ PersonalDataManager.getInstance().startAddressNormalizationTask(
+ selectedAutofillAddress.getProfile().getGUID(),
+ AutofillAddress.getCountryCode(selectedAutofillAddress.getProfile()), this);
+
+ // Check if the normalization is already done.
+ if (!mIsWaitingForNormalization) {
please use gerrit instead 2016/09/23 09:04:40 Seems like incorrect logic here. if (!mIsWaitingF
sebsg 2016/09/27 18:48:38 Done.
+ // Start a timer to cancel the normalization if it takes too long.
+ mNormalizationTimer = new Handler();
please use gerrit instead 2016/09/23 09:04:40 Reuse mHandler. No need to create a new object. m
sebsg 2016/09/27 18:48:37 Done.
+ Runnable normalizationTimeout = new Runnable() {
+ @Override
+ public void run() {
+ onAddressNormalized(null);
+ }
+ };
+ mNormalizationTimer.postDelayed(normalizationTimeout, NORMALIZATION_TIMEOUT_MS);
+ }
+
+ // The payment response will be sent to the merchant in onAddressNormalized instead.
+ return;
+ }
+ }
+
mUI.showProcessingMessage();
mClient.onPaymentResponse(response);
@@ -1061,6 +1101,40 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
}
/**
+ * Callback method called either when the address has finished normalizing or when the timeout
+ * triggers. Replaces the address in the response with the normalized version if present and
+ * sends the response to the merchant.
+ *
+ * @param profile The profile with the address normalized or a null profile if the timeout
+ * triggered first.
+ */
+ public void onAddressNormalized(AutofillProfile profile) {
+ // Check if the response was already sent to the merchant.
+ if (!mIsWaitingForNormalization || mClient == null || mPendingPaymentResponse == null) {
+ return;
+ }
+
+ mIsWaitingForNormalization = false;
+
+ if (profile != null && !TextUtils.isEmpty(profile.getGUID())) {
+ // The normalization finished first: use the normalized address.
+ mPendingPaymentResponse.shippingAddress =
+ new AutofillAddress(profile, mIsPendingResponseProfileComplete)
please use gerrit instead 2016/09/23 09:04:40 s/mIsPendingResponseProfileComplete/true/ ...beca
sebsg 2016/09/27 18:48:37 Done.
+ .toPaymentAddress();
+ } else {
+ // The timeout triggered first: cancel the normalization task.
+ PersonalDataManager.getInstance().cancelAddressNormalizationTask();
+ }
+
+ // Send the payment response to the merchant.
+ mClient.onPaymentResponse(mPendingPaymentResponse);
+
+ mPendingPaymentResponse = null;
+
+ recordSuccessFunnelHistograms("ReceivedInstrumentDetails");
+ }
+
+ /**
* Called if unable to retrieve instrument details.
*/
@Override
@@ -1108,6 +1182,7 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie
private void closeClient() {
if (mClient != null) mClient.close();
mClient = null;
+ mIsWaitingForNormalization = false;
please use gerrit instead 2016/09/23 09:04:40 Did you find this necessary? If this does not solv
sebsg 2016/09/27 18:48:37 Done.
mDismissObserver.onPaymentRequestDismissed();
}

Powered by Google App Engine
This is Rietveld 408576698