Index: chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java |
index 57c5596b3f62b42393e74dc0e78edbd9f0c0c14f..e6dc4a9a6f45657b47269d1840be2fcae3aada56 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java |
@@ -72,6 +72,15 @@ public class CardEditor extends EditorBase<AutofillPaymentInstrument> { |
/** The web contents where the web payments API is invoked. */ |
private final WebContents mWebContents; |
+ /** |
+ * The map from GUIDs to profiles that can be used for billing address. This cache avoids |
+ * re-reading profiles from disk, which may have changed due to sync, for example. Note that |
+ * this cache prevents the user from adding a shipping address and then immediately using it as |
+ * a billing address. This is consistent with the rest of the PaymentRequest UI, because adding |
+ * a billing address does not enable its immediate use as a shipping address either. |
+ */ |
+ private final Map<String, AutofillProfile> mProfilesForBillingAddress; |
+ |
/** Used for verifying billing address completeness and also editing billing addresses. */ |
private final AddressEditor mAddressEditor; |
@@ -126,6 +135,19 @@ public class CardEditor extends EditorBase<AutofillPaymentInstrument> { |
mAddressEditor = addressEditor; |
mObserverForTest = observerForTest; |
+ List<AutofillProfile> profiles = PersonalDataManager.getInstance().getProfilesForSettings(); |
+ mProfilesForBillingAddress = new HashMap<>(); |
+ for (int i = 0; i < profiles.size(); i++) { |
+ AutofillProfile profile = profiles.get(i); |
+ // 1) Include only local profiles, because GUIDs of server profiles change on every |
+ // browser restart. Server profiles are not supported as billing addresses. |
+ // 2) Include only complete profiles, so that user launches the editor only when |
+ // explicitly selecting [+ ADD ADDRESS] in the dropdown. |
+ if (profile.getIsLocal() && mAddressEditor.isProfileComplete(profile)) { |
+ mProfilesForBillingAddress.put(profile.getGUID(), profile); |
+ } |
+ } |
+ |
mCardTypes = new HashMap<>(); |
mCardTypes.put("amex", |
new CardTypeInfo(R.drawable.pr_amex, R.string.autofill_cc_amex)); |
@@ -182,9 +204,7 @@ public class CardEditor extends EditorBase<AutofillPaymentInstrument> { |
* @return Whether the card is complete. |
*/ |
public boolean isCardComplete(CreditCard card) { |
- if (card == null || TextUtils.isEmpty(card.getBillingAddressId()) |
- || !mAddressEditor.isProfileComplete(PersonalDataManager.getInstance().getProfile( |
- card.getBillingAddressId()))) { |
+ if (card == null || !mProfilesForBillingAddress.containsKey(card.getBillingAddressId())) { |
return false; |
} |
@@ -288,8 +308,8 @@ public class CardEditor extends EditorBase<AutofillPaymentInstrument> { |
@Override |
public void run() { |
commitChanges(card, isNewCard); |
- instrument.completeInstrument(card, |
- PersonalDataManager.getInstance().getProfile(card.getBillingAddressId())); |
+ instrument.completeInstrument( |
+ card, mProfilesForBillingAddress.get(card.getBillingAddressId())); |
callback.onResult(instrument); |
} |
}); |
@@ -425,21 +445,10 @@ public class CardEditor extends EditorBase<AutofillPaymentInstrument> { |
billingAddresses.add(new DropdownKeyValue(BILLING_ADDRESS_NONE, |
mContext.getString(R.string.select))); |
- // Re-read profiles every time, in case any of them have changed. This does not cause a disk |
- // read, because personal_data_manager.h holds a cache. |
- final PersonalDataManager pdm = PersonalDataManager.getInstance(); |
- List<AutofillProfile> profiles = pdm.getProfilesForSettings(); |
- |
- // 1) Include only local profiles, because GUIDs of server profiles change on every browser |
- // restart. Server profiles are not supported as billing addresses. |
- // 2) Include only complete profiles, so that user launches the editor only when explicitly |
- // selecting [+ ADD ADDRESS] in the dropdown. |
- for (int i = 0; i < profiles.size(); i++) { |
- AutofillProfile profile = profiles.get(i); |
- if (profile.getIsLocal() && mAddressEditor.isProfileComplete(profile)) { |
- // Key is profile GUID. Value is profile label. |
- billingAddresses.add(new DropdownKeyValue(profile.getGUID(), profile.getLabel())); |
- } |
+ for (Map.Entry<String, AutofillProfile> address : mProfilesForBillingAddress.entrySet()) { |
+ // Key is profile GUID. Value is profile label. |
+ billingAddresses.add( |
+ new DropdownKeyValue(address.getKey(), address.getValue().getLabel())); |
} |
billingAddresses.add(new DropdownKeyValue(BILLING_ADDRESS_ADD_NEW, |
@@ -474,6 +483,8 @@ public class CardEditor extends EditorBase<AutofillPaymentInstrument> { |
} else { |
// User has added a new complete address. Add it to the top of the |
// dropdown, under the "Select" prompt. |
+ mProfilesForBillingAddress.put( |
+ billingAddress.getIdentifier(), billingAddress.getProfile()); |
billingAddresses.add(1, new DropdownKeyValue( |
billingAddress.getIdentifier(), billingAddress.getSublabel())); |
mBillingAddressField.setDropdownKeyValues(billingAddresses); |
@@ -517,7 +528,7 @@ public class CardEditor extends EditorBase<AutofillPaymentInstrument> { |
PersonalDataManager pdm = PersonalDataManager.getInstance(); |
if (!card.getIsLocal()) { |
- pdm.updateServerCardBillingAddress(card.getGUID(), card.getBillingAddressId()); |
+ pdm.updateServerCardBillingAddress(card.getServerId(), card.getBillingAddressId()); |
return; |
} |