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 360ab4ad67ee38eef702f31cb2ffa1f82a82e97e..84a1d265186667d2f08a75702d27b986a674e000 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 |
@@ -45,6 +45,8 @@ import org.json.JSONObject; |
import java.io.IOException; |
import java.util.ArrayList; |
import java.util.Arrays; |
+import java.util.Collections; |
+import java.util.Comparator; |
import java.util.HashMap; |
import java.util.HashSet; |
import java.util.List; |
@@ -75,6 +77,8 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
private static final String TAG = "cr_PaymentRequest"; |
+ private static final int SUGGESTIONS_LIMIT = 4; |
+ |
private static PaymentRequestServiceObserverForTest sObserverForTest; |
private final Handler mHandler = new Handler(); |
@@ -208,6 +212,20 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
if (!parseAndValidateDetailsOrDisconnectFromClient(details)) return; |
+ // Create a comparator to sort the suggestions by completeness. |
+ Comparator<Completable> completenessComparator = new Comparator<Completable>() { |
+ @Override |
+ public int compare(Completable a, Completable b) { |
+ if (a.isComplete() == b.isComplete()) { |
+ return 0; |
+ } else if (a.isComplete()) { |
+ return -1; |
+ } else { |
+ return 1; |
+ } |
+ } |
+ }; |
+ |
// If the merchant requests shipping and does not provide a selected shipping option, then |
// the merchant needs the shipping address to calculate the shipping price and availability. |
boolean requestShipping = options != null && options.requestShipping; |
@@ -225,7 +243,6 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
if (requestShipping) { |
mAddressEditor = new AddressEditor(); |
List<AutofillAddress> addresses = new ArrayList<>(); |
- int firstCompleteAddressIndex = SectionInformation.NO_SELECTION; |
for (int i = 0; i < profiles.size(); i++) { |
AutofillProfile profile = profiles.get(i); |
@@ -233,13 +250,22 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
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. |
+ // Suggest complete addresses first. |
+ Collections.sort(addresses, completenessComparator); |
+ |
+ // Limit the number of suggestions. |
+ addresses = addresses.subList(0, Math.min(addresses.size(), SUGGESTIONS_LIMIT)); |
+ |
+ // 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; |
+ if (!mMerchantNeedsShippingAddress && !addresses.isEmpty() |
+ && addresses.get(0).isComplete()) { |
+ firstCompleteAddressIndex = 0; |
+ } |
+ |
mShippingAddressesSection = |
new SectionInformation(PaymentRequestUI.TYPE_SHIPPING_ADDRESSES, |
firstCompleteAddressIndex, addresses); |
@@ -249,7 +275,6 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
Set<String> uniqueContactInfos = new HashSet<>(); |
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); |
@@ -270,15 +295,22 @@ public class PaymentRequestImpl implements PaymentRequest, PaymentRequestUI.Clie |
boolean isComplete = |
mContactEditor.isContactInformationComplete(phone, email); |
contacts.add(new AutofillContact(profile, phone, email, isComplete)); |
- if (isComplete |
- && firstCompleteContactIndex == SectionInformation.NO_SELECTION) { |
- firstCompleteContactIndex = i; |
- } |
} |
} |
} |
- // The contact section automatically selects the first complete entry. |
+ // Suggest complete contact infos first. |
+ Collections.sort(contacts, completenessComparator); |
+ |
+ // Limit the number of suggestions. |
+ contacts = contacts.subList(0, Math.min(contacts.size(), SUGGESTIONS_LIMIT)); |
+ |
+ // Automatically select the first address if it is complete. |
+ int firstCompleteContactIndex = SectionInformation.NO_SELECTION; |
+ if (!contacts.isEmpty() && contacts.get(0).isComplete()) { |
+ firstCompleteContactIndex = 0; |
+ } |
+ |
mContactSection = new SectionInformation( |
PaymentRequestUI.TYPE_CONTACT_DETAILS, firstCompleteContactIndex, contacts); |
} |