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

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

Issue 2120973002: [Payments] Show complete profiles first and limit to 4 suggestions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments Created 4 years, 5 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.chrome.browser.payments; 5 package org.chromium.chrome.browser.payments;
6 6
7 import android.app.Activity; 7 import android.app.Activity;
8 import android.graphics.Bitmap; 8 import android.graphics.Bitmap;
9 import android.os.Handler; 9 import android.os.Handler;
10 import android.text.TextUtils; 10 import android.text.TextUtils;
(...skipping 27 matching lines...) Expand all
38 import org.chromium.mojom.payments.PaymentRequestClient; 38 import org.chromium.mojom.payments.PaymentRequestClient;
39 import org.chromium.mojom.payments.PaymentResponse; 39 import org.chromium.mojom.payments.PaymentResponse;
40 import org.chromium.mojom.payments.PaymentShippingOption; 40 import org.chromium.mojom.payments.PaymentShippingOption;
41 import org.chromium.ui.base.WindowAndroid; 41 import org.chromium.ui.base.WindowAndroid;
42 import org.json.JSONException; 42 import org.json.JSONException;
43 import org.json.JSONObject; 43 import org.json.JSONObject;
44 44
45 import java.io.IOException; 45 import java.io.IOException;
46 import java.util.ArrayList; 46 import java.util.ArrayList;
47 import java.util.Arrays; 47 import java.util.Arrays;
48 import java.util.Collections;
49 import java.util.Comparator;
48 import java.util.HashMap; 50 import java.util.HashMap;
49 import java.util.HashSet; 51 import java.util.HashSet;
50 import java.util.List; 52 import java.util.List;
51 import java.util.Locale; 53 import java.util.Locale;
52 import java.util.Set; 54 import java.util.Set;
53 55
54 /** 56 /**
55 * Android implementation of the PaymentRequest service defined in 57 * Android implementation of the PaymentRequest service defined in
56 * third_party/WebKit/public/platform/modules/payments/payment_request.mojom. 58 * third_party/WebKit/public/platform/modules/payments/payment_request.mojom.
57 */ 59 */
(...skipping 10 matching lines...) Expand all
68 void onPaymentRequestServiceUnableToAbort(); 70 void onPaymentRequestServiceUnableToAbort();
69 } 71 }
70 72
71 /** 73 /**
72 * The size for the favicon in density-independent pixels. 74 * The size for the favicon in density-independent pixels.
73 */ 75 */
74 private static final int FAVICON_SIZE_DP = 24; 76 private static final int FAVICON_SIZE_DP = 24;
75 77
76 private static final String TAG = "cr_PaymentRequest"; 78 private static final String TAG = "cr_PaymentRequest";
77 79
80 private static final int SUGGESTIONS_LIMIT = 4;
81
78 private static PaymentRequestServiceObserverForTest sObserverForTest; 82 private static PaymentRequestServiceObserverForTest sObserverForTest;
79 83
80 private final Handler mHandler = new Handler(); 84 private final Handler mHandler = new Handler();
81 85
82 private Activity mContext; 86 private Activity mContext;
83 private String mMerchantName; 87 private String mMerchantName;
84 private String mOrigin; 88 private String mOrigin;
85 private Bitmap mFavicon; 89 private Bitmap mFavicon;
86 private List<PaymentApp> mApps; 90 private List<PaymentApp> mApps;
87 private PaymentRequestClient mClient; 91 private PaymentRequestClient mClient;
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 } 205 }
202 206
203 mMethodData = getValidatedMethodData(methodData); 207 mMethodData = getValidatedMethodData(methodData);
204 if (mMethodData == null) { 208 if (mMethodData == null) {
205 disconnectFromClientWithDebugMessage("Invalid payment methods or dat a"); 209 disconnectFromClientWithDebugMessage("Invalid payment methods or dat a");
206 return; 210 return;
207 } 211 }
208 212
209 if (!parseAndValidateDetailsOrDisconnectFromClient(details)) return; 213 if (!parseAndValidateDetailsOrDisconnectFromClient(details)) return;
210 214
215 // Create a comparator to sort the suggestions by completeness.
216 Comparator<Completable> completenessComparator = new Comparator<Completa ble>() {
217 @Override
218 public int compare(Completable a, Completable b) {
219 if (a.isComplete() == b.isComplete()) {
220 return 0;
221 } else if (a.isComplete()) {
222 return -1;
223 } else {
224 return 1;
225 }
226 }
227 };
228
211 // If the merchant requests shipping and does not provide a selected shi pping option, then 229 // If the merchant requests shipping and does not provide a selected shi pping option, then
212 // the merchant needs the shipping address to calculate the shipping pri ce and availability. 230 // the merchant needs the shipping address to calculate the shipping pri ce and availability.
213 boolean requestShipping = options != null && options.requestShipping; 231 boolean requestShipping = options != null && options.requestShipping;
214 mMerchantNeedsShippingAddress = 232 mMerchantNeedsShippingAddress =
215 requestShipping && mUiShippingOptions.getSelectedItem() == null; 233 requestShipping && mUiShippingOptions.getSelectedItem() == null;
216 234
217 boolean requestPayerPhone = options != null && options.requestPayerPhone ; 235 boolean requestPayerPhone = options != null && options.requestPayerPhone ;
218 boolean requestPayerEmail = options != null && options.requestPayerEmail ; 236 boolean requestPayerEmail = options != null && options.requestPayerEmail ;
219 237
220 List<AutofillProfile> profiles = null; 238 List<AutofillProfile> profiles = null;
221 if (requestShipping || requestPayerPhone || requestPayerEmail) { 239 if (requestShipping || requestPayerPhone || requestPayerEmail) {
222 profiles = PersonalDataManager.getInstance().getProfilesToSuggest(); 240 profiles = PersonalDataManager.getInstance().getProfilesToSuggest();
223 } 241 }
224 242
225 if (requestShipping) { 243 if (requestShipping) {
226 mAddressEditor = new AddressEditor(); 244 mAddressEditor = new AddressEditor();
227 List<AutofillAddress> addresses = new ArrayList<>(); 245 List<AutofillAddress> addresses = new ArrayList<>();
228 int firstCompleteAddressIndex = SectionInformation.NO_SELECTION;
229 246
230 for (int i = 0; i < profiles.size(); i++) { 247 for (int i = 0; i < profiles.size(); i++) {
231 AutofillProfile profile = profiles.get(i); 248 AutofillProfile profile = profiles.get(i);
232 mAddressEditor.addPhoneNumberIfValid(profile.getPhoneNumber()); 249 mAddressEditor.addPhoneNumberIfValid(profile.getPhoneNumber());
233 250
234 boolean isComplete = mAddressEditor.isProfileComplete(profile); 251 boolean isComplete = mAddressEditor.isProfileComplete(profile);
235 addresses.add(new AutofillAddress(profile, isComplete)); 252 addresses.add(new AutofillAddress(profile, isComplete));
236 if (isComplete && firstCompleteAddressIndex == SectionInformatio n.NO_SELECTION
237 && !mMerchantNeedsShippingAddress) {
238 firstCompleteAddressIndex = i;
239 }
240 } 253 }
241 254
242 // The shipping address section automatically selects the first comp lete entry. 255 // Suggest complete addresses first.
256 Collections.sort(addresses, completenessComparator);
257
258 // Limit the number of suggestions.
259 addresses = addresses.subList(0, Math.min(addresses.size(), SUGGESTI ONS_LIMIT));
260
261 // Automatically select the first address if one is complete and if the merchant does
262 // not require a shipping address to calculate shipping costs.
263 int firstCompleteAddressIndex = SectionInformation.NO_SELECTION;
264 if (!mMerchantNeedsShippingAddress && !addresses.isEmpty()
265 && addresses.get(0).isComplete()) {
please use gerrit instead 2016/07/08 08:36:31 Should be +8. not +12 indent.
sebsg 2016/07/08 09:20:25 Done.
266 firstCompleteAddressIndex = 0;
267 }
268
243 mShippingAddressesSection = 269 mShippingAddressesSection =
244 new SectionInformation(PaymentRequestUI.TYPE_SHIPPING_ADDRES SES, 270 new SectionInformation(PaymentRequestUI.TYPE_SHIPPING_ADDRES SES,
245 firstCompleteAddressIndex, addresses); 271 firstCompleteAddressIndex, addresses);
246 } 272 }
247 273
248 if (requestPayerPhone || requestPayerEmail) { 274 if (requestPayerPhone || requestPayerEmail) {
249 Set<String> uniqueContactInfos = new HashSet<>(); 275 Set<String> uniqueContactInfos = new HashSet<>();
250 mContactEditor = new ContactEditor(requestPayerPhone, requestPayerEm ail); 276 mContactEditor = new ContactEditor(requestPayerPhone, requestPayerEm ail);
251 List<AutofillContact> contacts = new ArrayList<>(); 277 List<AutofillContact> contacts = new ArrayList<>();
252 int firstCompleteContactIndex = SectionInformation.NO_SELECTION;
253 278
254 for (int i = 0; i < profiles.size(); i++) { 279 for (int i = 0; i < profiles.size(); i++) {
255 AutofillProfile profile = profiles.get(i); 280 AutofillProfile profile = profiles.get(i);
256 String phone = requestPayerPhone && !TextUtils.isEmpty(profile.g etPhoneNumber()) 281 String phone = requestPayerPhone && !TextUtils.isEmpty(profile.g etPhoneNumber())
257 ? profile.getPhoneNumber() : null; 282 ? profile.getPhoneNumber() : null;
258 String email = requestPayerEmail && !TextUtils.isEmpty(profile.g etEmailAddress()) 283 String email = requestPayerEmail && !TextUtils.isEmpty(profile.g etEmailAddress())
259 ? profile.getEmailAddress() : null; 284 ? profile.getEmailAddress() : null;
260 mContactEditor.addPhoneNumberIfValid(phone); 285 mContactEditor.addPhoneNumberIfValid(phone);
261 mContactEditor.addEmailAddressIfValid(email); 286 mContactEditor.addEmailAddressIfValid(email);
262 287
263 if (phone != null || email != null) { 288 if (phone != null || email != null) {
264 // Different profiles can have identical contact info. Do no t add the same 289 // Different profiles can have identical contact info. Do no t add the same
265 // contact info to the list twice. 290 // contact info to the list twice.
266 String uniqueContactInfo = phone + email; 291 String uniqueContactInfo = phone + email;
267 if (!uniqueContactInfos.contains(uniqueContactInfo)) { 292 if (!uniqueContactInfos.contains(uniqueContactInfo)) {
268 uniqueContactInfos.add(uniqueContactInfo); 293 uniqueContactInfos.add(uniqueContactInfo);
269 294
270 boolean isComplete = 295 boolean isComplete =
271 mContactEditor.isContactInformationComplete(phon e, email); 296 mContactEditor.isContactInformationComplete(phon e, email);
272 contacts.add(new AutofillContact(profile, phone, email, isComplete)); 297 contacts.add(new AutofillContact(profile, phone, email, isComplete));
273 if (isComplete
274 && firstCompleteContactIndex == SectionInformati on.NO_SELECTION) {
275 firstCompleteContactIndex = i;
276 }
277 } 298 }
278 } 299 }
279 } 300 }
280 301
281 // The contact section automatically selects the first complete entr y. 302 // Suggest complete contact infos first.
303 Collections.sort(contacts, completenessComparator);
304
305 // Limit the number of suggestions.
306 contacts = contacts.subList(0, Math.min(contacts.size(), SUGGESTIONS _LIMIT));
307
308 // Automatically select the first address if it is complete.
309 int firstCompleteContactIndex = SectionInformation.NO_SELECTION;
310 if (!contacts.isEmpty() && contacts.get(0).isComplete()) {
311 firstCompleteContactIndex = 0;
312 }
313
282 mContactSection = new SectionInformation( 314 mContactSection = new SectionInformation(
283 PaymentRequestUI.TYPE_CONTACT_DETAILS, firstCompleteContactI ndex, contacts); 315 PaymentRequestUI.TYPE_CONTACT_DETAILS, firstCompleteContactI ndex, contacts);
284 } 316 }
285 317
286 mPendingApps = new ArrayList<>(mApps); 318 mPendingApps = new ArrayList<>(mApps);
287 mPendingInstruments = new ArrayList<>(); 319 mPendingInstruments = new ArrayList<>();
288 boolean isGettingInstruments = false; 320 boolean isGettingInstruments = false;
289 321
290 for (int i = 0; i < mApps.size(); i++) { 322 for (int i = 0; i < mApps.size(); i++) {
291 PaymentApp app = mApps.get(i); 323 PaymentApp app = mApps.get(i);
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after
862 private void closeClient() { 894 private void closeClient() {
863 if (mClient != null) mClient.close(); 895 if (mClient != null) mClient.close();
864 mClient = null; 896 mClient = null;
865 } 897 }
866 898
867 @VisibleForTesting 899 @VisibleForTesting
868 public static void setObserverForTest(PaymentRequestServiceObserverForTest o bserverForTest) { 900 public static void setObserverForTest(PaymentRequestServiceObserverForTest o bserverForTest) {
869 sObserverForTest = observerForTest; 901 sObserverForTest = observerForTest;
870 } 902 }
871 } 903 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698