OLD | NEW |
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.telephony.PhoneNumberUtils; | |
11 import android.text.TextUtils; | 10 import android.text.TextUtils; |
12 import android.util.Patterns; | |
13 | 11 |
14 import org.chromium.base.Callback; | 12 import org.chromium.base.Callback; |
15 import org.chromium.base.Log; | 13 import org.chromium.base.Log; |
16 import org.chromium.base.VisibleForTesting; | 14 import org.chromium.base.VisibleForTesting; |
17 import org.chromium.chrome.R; | |
18 import org.chromium.chrome.browser.autofill.PersonalDataManager; | 15 import org.chromium.chrome.browser.autofill.PersonalDataManager; |
19 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; | 16 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; |
20 import org.chromium.chrome.browser.favicon.FaviconHelper; | 17 import org.chromium.chrome.browser.favicon.FaviconHelper; |
21 import org.chromium.chrome.browser.payments.ui.EditorFieldModel; | |
22 import org.chromium.chrome.browser.payments.ui.EditorFieldModel.EditorFieldValid
ator; | |
23 import org.chromium.chrome.browser.payments.ui.EditorModel; | |
24 import org.chromium.chrome.browser.payments.ui.LineItem; | 18 import org.chromium.chrome.browser.payments.ui.LineItem; |
25 import org.chromium.chrome.browser.payments.ui.PaymentInformation; | 19 import org.chromium.chrome.browser.payments.ui.PaymentInformation; |
26 import org.chromium.chrome.browser.payments.ui.PaymentOption; | 20 import org.chromium.chrome.browser.payments.ui.PaymentOption; |
27 import org.chromium.chrome.browser.payments.ui.PaymentRequestUI; | 21 import org.chromium.chrome.browser.payments.ui.PaymentRequestUI; |
28 import org.chromium.chrome.browser.payments.ui.SectionInformation; | 22 import org.chromium.chrome.browser.payments.ui.SectionInformation; |
29 import org.chromium.chrome.browser.payments.ui.ShoppingCart; | 23 import org.chromium.chrome.browser.payments.ui.ShoppingCart; |
30 import org.chromium.chrome.browser.preferences.PreferencesLauncher; | 24 import org.chromium.chrome.browser.preferences.PreferencesLauncher; |
31 import org.chromium.chrome.browser.preferences.autofill.AutofillCreditCardEditor
; | 25 import org.chromium.chrome.browser.preferences.autofill.AutofillCreditCardEditor
; |
32 import org.chromium.chrome.browser.preferences.autofill.AutofillProfileEditor; | 26 import org.chromium.chrome.browser.preferences.autofill.AutofillProfileEditor; |
33 import org.chromium.chrome.browser.profiles.Profile; | 27 import org.chromium.chrome.browser.profiles.Profile; |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 private SectionInformation mShippingAddressesSection; | 122 private SectionInformation mShippingAddressesSection; |
129 private SectionInformation mContactSection; | 123 private SectionInformation mContactSection; |
130 private List<PaymentApp> mPendingApps; | 124 private List<PaymentApp> mPendingApps; |
131 private List<PaymentInstrument> mPendingInstruments; | 125 private List<PaymentInstrument> mPendingInstruments; |
132 private SectionInformation mPaymentMethodsSection; | 126 private SectionInformation mPaymentMethodsSection; |
133 private PaymentRequestUI mUI; | 127 private PaymentRequestUI mUI; |
134 private Callback<PaymentInformation> mPaymentInformationCallback; | 128 private Callback<PaymentInformation> mPaymentInformationCallback; |
135 private Pattern mRegionCodePattern; | 129 private Pattern mRegionCodePattern; |
136 private boolean mMerchantNeedsShippingAddress; | 130 private boolean mMerchantNeedsShippingAddress; |
137 private boolean mPaymentAppRunning; | 131 private boolean mPaymentAppRunning; |
138 private boolean mRequestPayerPhone; | 132 private ContactEditor mContactEditor; |
139 private boolean mRequestPayerEmail; | |
140 private List<CharSequence> mAllPhoneNumbers; | |
141 private List<CharSequence> mAllEmailAddresses; | |
142 private EditorFieldValidator mPhoneValidator; | |
143 private EditorFieldValidator mEmailValidator; | |
144 | 133 |
145 /** | 134 /** |
146 * Builds the PaymentRequest service implementation. | 135 * Builds the PaymentRequest service implementation. |
147 * | 136 * |
148 * @param webContents The web contents that have invoked the PaymentRequest
API. | 137 * @param webContents The web contents that have invoked the PaymentRequest
API. |
149 */ | 138 */ |
150 public PaymentRequestImpl(WebContents webContents) { | 139 public PaymentRequestImpl(WebContents webContents) { |
151 if (webContents == null) return; | 140 if (webContents == null) return; |
152 | 141 |
153 ContentViewCore contentViewCore = ContentViewCore.fromWebContents(webCon
tents); | 142 ContentViewCore contentViewCore = ContentViewCore.fromWebContents(webCon
tents); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 } | 209 } |
221 | 210 |
222 if (!parseAndValidateDetailsOrDisconnectFromClient(details)) return; | 211 if (!parseAndValidateDetailsOrDisconnectFromClient(details)) return; |
223 | 212 |
224 // If the merchant requests shipping and does not provide a selected shi
pping option, then | 213 // If the merchant requests shipping and does not provide a selected shi
pping option, then |
225 // the merchant needs the shipping address to calculate the shipping pri
ce and availability. | 214 // the merchant needs the shipping address to calculate the shipping pri
ce and availability. |
226 boolean requestShipping = options != null && options.requestShipping; | 215 boolean requestShipping = options != null && options.requestShipping; |
227 mMerchantNeedsShippingAddress = | 216 mMerchantNeedsShippingAddress = |
228 requestShipping && mUiShippingOptions.getSelectedItem() == null; | 217 requestShipping && mUiShippingOptions.getSelectedItem() == null; |
229 | 218 |
230 mRequestPayerPhone = options != null && options.requestPayerPhone; | 219 boolean requestPayerPhone = options != null && options.requestPayerPhone
; |
231 mRequestPayerEmail = options != null && options.requestPayerEmail; | 220 boolean requestPayerEmail = options != null && options.requestPayerEmail
; |
| 221 if (requestPayerPhone || requestPayerEmail) { |
| 222 mContactEditor = new ContactEditor(requestPayerPhone, requestPayerEm
ail); |
| 223 } |
232 | 224 |
233 if (requestShipping || mRequestPayerPhone || mRequestPayerEmail) { | 225 if (requestShipping || requestPayerPhone || requestPayerEmail) { |
234 List<AutofillProfile> profiles = | 226 List<AutofillProfile> profiles = |
235 PersonalDataManager.getInstance().getProfilesToSuggest(); | 227 PersonalDataManager.getInstance().getProfilesToSuggest(); |
236 List<AutofillContact> contacts = new ArrayList<>(); | 228 List<AutofillContact> contacts = new ArrayList<>(); |
237 List<AutofillAddress> addresses = new ArrayList<>(); | 229 List<AutofillAddress> addresses = new ArrayList<>(); |
238 mAllPhoneNumbers = new ArrayList<>(); | |
239 mAllEmailAddresses = new ArrayList<>(); | |
240 int firstCompleteContactIndex = SectionInformation.NO_SELECTION; | 230 int firstCompleteContactIndex = SectionInformation.NO_SELECTION; |
241 for (int i = 0; i < profiles.size(); i++) { | 231 for (int i = 0; i < profiles.size(); i++) { |
242 AutofillProfile profile = profiles.get(i); | 232 AutofillProfile profile = profiles.get(i); |
243 | 233 |
244 String phone = mRequestPayerPhone && !TextUtils.isEmpty(profile.
getPhoneNumber()) | 234 String phone = requestPayerPhone && !TextUtils.isEmpty(profile.g
etPhoneNumber()) |
245 ? profile.getPhoneNumber() : null; | 235 ? profile.getPhoneNumber() : null; |
246 String email = mRequestPayerEmail && !TextUtils.isEmpty(profile.
getEmailAddress()) | 236 String email = requestPayerEmail && !TextUtils.isEmpty(profile.g
etEmailAddress()) |
247 ? profile.getEmailAddress() : null; | 237 ? profile.getEmailAddress() : null; |
248 if (phone != null || email != null) { | 238 if (phone != null || email != null) { |
249 boolean isComplete = isContactInformationComplete(phone, ema
il); | 239 boolean isComplete = mContactEditor.isContactInformationComp
lete(phone, email); |
250 contacts.add(new AutofillContact(profile, phone, email, isCo
mplete)); | 240 contacts.add(new AutofillContact(profile, phone, email, isCo
mplete)); |
251 if (isComplete && firstCompleteContactIndex < 0) firstComple
teContactIndex = i; | 241 if (isComplete && firstCompleteContactIndex < 0) firstComple
teContactIndex = i; |
252 if (getPhoneValidator().isValid(phone)) mAllPhoneNumbers.add
(phone); | 242 mContactEditor.addPhoneNumberIfValid(phone); |
253 if (getEmailValidator().isValid(email)) mAllEmailAddresses.a
dd(email); | 243 mContactEditor.addEmailAddressIfValid(email); |
254 } | 244 } |
255 | 245 |
256 if (canUseAddress(profile, requestShipping)) { | 246 if (canUseAddress(profile, requestShipping)) { |
257 addresses.add(new AutofillAddress(profile)); | 247 addresses.add(new AutofillAddress(profile)); |
258 } | 248 } |
259 } | 249 } |
260 | 250 |
261 if (requestShipping) { | 251 if (requestShipping) { |
262 int selectedIndex = SectionInformation.NO_SELECTION; | 252 int selectedIndex = SectionInformation.NO_SELECTION; |
263 if (!addresses.isEmpty() && mUiShippingOptions.getSelectedItem()
!= null) { | 253 if (!addresses.isEmpty() && mUiShippingOptions.getSelectedItem()
!= null) { |
264 selectedIndex = 0; | 254 selectedIndex = 0; |
265 } | 255 } |
266 mShippingAddressesSection = new SectionInformation( | 256 mShippingAddressesSection = new SectionInformation( |
267 PaymentRequestUI.TYPE_SHIPPING_ADDRESSES, selectedIndex,
addresses); | 257 PaymentRequestUI.TYPE_SHIPPING_ADDRESSES, selectedIndex,
addresses); |
268 } | 258 } |
269 | 259 |
270 // The contact section automatically selects the first complete entr
y. | 260 // The contact section automatically selects the first complete entr
y. |
271 if (mRequestPayerPhone || mRequestPayerEmail) { | 261 if (requestPayerPhone || requestPayerEmail) { |
272 mContactSection = new SectionInformation( | 262 mContactSection = new SectionInformation( |
273 PaymentRequestUI.TYPE_CONTACT_DETAILS, firstCompleteCont
actIndex, contacts); | 263 PaymentRequestUI.TYPE_CONTACT_DETAILS, firstCompleteCont
actIndex, contacts); |
274 } | 264 } |
275 } | 265 } |
276 | 266 |
277 mPendingApps = new ArrayList<>(mApps); | 267 mPendingApps = new ArrayList<>(mApps); |
278 mPendingInstruments = new ArrayList<>(); | 268 mPendingInstruments = new ArrayList<>(); |
279 boolean isGettingInstruments = false; | 269 boolean isGettingInstruments = false; |
280 | 270 |
281 for (int i = 0; i < mApps.size(); i++) { | 271 for (int i = 0; i < mApps.size(); i++) { |
282 PaymentApp app = mApps.get(i); | 272 PaymentApp app = mApps.get(i); |
283 Set<String> appMethods = app.getSupportedMethodNames(); | 273 Set<String> appMethods = app.getSupportedMethodNames(); |
284 appMethods.retainAll(mMethodData.keySet()); | 274 appMethods.retainAll(mMethodData.keySet()); |
285 if (appMethods.isEmpty()) { | 275 if (appMethods.isEmpty()) { |
286 mPendingApps.remove(app); | 276 mPendingApps.remove(app); |
287 } else { | 277 } else { |
288 isGettingInstruments = true; | 278 isGettingInstruments = true; |
289 app.getInstruments(mRawTotal, mRawLineItems, this); | 279 app.getInstruments(mRawTotal, mRawLineItems, this); |
290 } | 280 } |
291 } | 281 } |
292 | 282 |
293 if (!isGettingInstruments) { | 283 if (!isGettingInstruments) { |
294 mPaymentMethodsSection = new SectionInformation(PaymentRequestUI.TYP
E_PAYMENT_METHODS); | 284 mPaymentMethodsSection = new SectionInformation(PaymentRequestUI.TYP
E_PAYMENT_METHODS); |
295 } | 285 } |
296 | 286 |
297 mUI = new PaymentRequestUI(mContext, this, requestShipping, | 287 mUI = new PaymentRequestUI(mContext, this, requestShipping, |
298 mRequestPayerPhone || mRequestPayerEmail, mMerchantName, mOrigin
); | 288 requestPayerPhone || requestPayerEmail, mMerchantName, mOrigin); |
| 289 |
299 if (mFavicon != null) mUI.setTitleBitmap(mFavicon); | 290 if (mFavicon != null) mUI.setTitleBitmap(mFavicon); |
300 mFavicon = null; | 291 mFavicon = null; |
| 292 |
| 293 if (mContactEditor != null) mContactEditor.setEditorView(mUI.getEditorVi
ew()); |
301 } | 294 } |
302 | 295 |
303 private static HashMap<String, JSONObject> getValidatedMethodData( | 296 private static HashMap<String, JSONObject> getValidatedMethodData( |
304 PaymentMethodData[] methodData) { | 297 PaymentMethodData[] methodData) { |
305 // Payment methodData are required. | 298 // Payment methodData are required. |
306 if (methodData == null || methodData.length == 0) return null; | 299 if (methodData == null || methodData.length == 0) return null; |
307 HashMap<String, JSONObject> result = new HashMap<>(); | 300 HashMap<String, JSONObject> result = new HashMap<>(); |
308 for (int i = 0; i < methodData.length; i++) { | 301 for (int i = 0; i < methodData.length; i++) { |
309 JSONObject data = null; | 302 JSONObject data = null; |
310 if (!TextUtils.isEmpty(methodData[i].stringifiedData)) { | 303 if (!TextUtils.isEmpty(methodData[i].stringifiedData)) { |
(...skipping 17 matching lines...) Expand all Loading... |
328 | 321 |
329 for (int j = 0; j < methods.length; j++) { | 322 for (int j = 0; j < methods.length; j++) { |
330 // Payment methods should be non-empty. | 323 // Payment methods should be non-empty. |
331 if (TextUtils.isEmpty(methods[j])) return null; | 324 if (TextUtils.isEmpty(methods[j])) return null; |
332 result.put(methods[j], data); | 325 result.put(methods[j], data); |
333 } | 326 } |
334 } | 327 } |
335 return result; | 328 return result; |
336 } | 329 } |
337 | 330 |
338 private boolean isContactInformationComplete(String phone, String email) { | |
339 return (!mRequestPayerPhone || getPhoneValidator().isValid(phone)) | |
340 && (!mRequestPayerEmail || getEmailValidator().isValid(email)); | |
341 } | |
342 | |
343 private boolean canUseAddress(AutofillProfile profile, boolean requestShippi
ng) { | 331 private boolean canUseAddress(AutofillProfile profile, boolean requestShippi
ng) { |
344 return requestShipping && profile.getCountryCode() != null | 332 return requestShipping && profile.getCountryCode() != null |
345 && mRegionCodePattern.matcher(profile.getCountryCode()).matches(
) | 333 && mRegionCodePattern.matcher(profile.getCountryCode()).matches(
) |
346 && profile.getStreetAddress() != null && profile.getRegion() !=
null | 334 && profile.getStreetAddress() != null && profile.getRegion() !=
null |
347 && profile.getLocality() != null && profile.getDependentLocality
() != null | 335 && profile.getLocality() != null && profile.getDependentLocality
() != null |
348 && profile.getPostalCode() != null && profile.getSortingCode() !
= null | 336 && profile.getPostalCode() != null && profile.getSortingCode() !
= null |
349 && profile.getCompanyName() != null && profile.getFullName() !=
null | 337 && profile.getCompanyName() != null && profile.getFullName() !=
null |
350 && profile.getPhoneNumber() != null; | 338 && profile.getPhoneNumber() != null; |
351 } | 339 } |
352 | 340 |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
614 } else { | 602 } else { |
615 editContact(contact); | 603 editContact(contact); |
616 } | 604 } |
617 } else if (optionType == PaymentRequestUI.TYPE_PAYMENT_METHODS) { | 605 } else if (optionType == PaymentRequestUI.TYPE_PAYMENT_METHODS) { |
618 assert option instanceof PaymentInstrument; | 606 assert option instanceof PaymentInstrument; |
619 mPaymentMethodsSection.setSelectedItem(option); | 607 mPaymentMethodsSection.setSelectedItem(option); |
620 } | 608 } |
621 return false; | 609 return false; |
622 } | 610 } |
623 | 611 |
624 private void editContact(final AutofillContact contact) { | |
625 final EditorFieldModel phoneField = mRequestPayerPhone | |
626 ? new EditorFieldModel(EditorFieldModel.INPUT_TYPE_HINT_PHONE, | |
627 mContext.getString(R.string.autofill_profile_editor_ph
one_number), | |
628 mAllPhoneNumbers, getPhoneValidator(), | |
629 mContext.getString(R.string.payments_phone_required_va
lidation_message), | |
630 mContext.getString(R.string.payments_phone_invalid_val
idation_message), | |
631 contact == null ? null : contact.getPayerPhone()) | |
632 : null; | |
633 | |
634 final EditorFieldModel emailField = mRequestPayerEmail | |
635 ? new EditorFieldModel(EditorFieldModel.INPUT_TYPE_HINT_EMAIL, | |
636 mContext.getString(R.string.autofill_profile_editor_em
ail_address), | |
637 mAllEmailAddresses, getEmailValidator(), | |
638 mContext.getString(R.string.payments_email_required_va
lidation_message), | |
639 mContext.getString(R.string.payments_email_invalid_val
idation_message), | |
640 contact == null ? null : contact.getPayerEmail()) | |
641 : null; | |
642 | |
643 EditorModel editor = | |
644 new EditorModel(mContext.getString(R.string.payments_add_contact
_details_label)); | |
645 if (phoneField != null) editor.addField(phoneField); | |
646 if (emailField != null) editor.addField(emailField); | |
647 | |
648 editor.setCancelCallback(new Runnable() { | |
649 @Override | |
650 public void run() { | |
651 mContactSection.setSelectedItemIndex(SectionInformation.NO_SELEC
TION); | |
652 mUI.updateSection(PaymentRequestUI.TYPE_CONTACT_DETAILS, mContac
tSection); | |
653 } | |
654 }); | |
655 | |
656 editor.setDoneCallback(new Runnable() { | |
657 @Override | |
658 public void run() { | |
659 AutofillProfile profile = | |
660 contact != null ? contact.getProfile() : new AutofillPro
file(); | |
661 String phone = null; | |
662 String email = null; | |
663 if (phoneField != null) { | |
664 phone = phoneField.getValue().toString(); | |
665 profile.setPhoneNumber(phone); | |
666 } | |
667 if (emailField != null) { | |
668 email = emailField.getValue().toString(); | |
669 profile.setEmailAddress(email); | |
670 } | |
671 PersonalDataManager.getInstance().setProfile(profile); | |
672 | |
673 if (contact == null) { | |
674 mContactSection.addAndSelectItem( | |
675 new AutofillContact(profile, phone, email, true)); | |
676 } else { | |
677 contact.completeContact(phone, email); | |
678 } | |
679 mUI.updateSection(PaymentRequestUI.TYPE_CONTACT_DETAILS, mContac
tSection); | |
680 } | |
681 }); | |
682 mUI.showEditor(editor); | |
683 } | |
684 | |
685 private EditorFieldValidator getPhoneValidator() { | |
686 if (mPhoneValidator == null) { | |
687 mPhoneValidator = new EditorFieldValidator() { | |
688 @Override | |
689 public boolean isValid(CharSequence value) { | |
690 return value != null | |
691 && PhoneNumberUtils.isGlobalPhoneNumber( | |
692 PhoneNumberUtils.stripSeparators(value.to
String())); | |
693 } | |
694 }; | |
695 } | |
696 return mPhoneValidator; | |
697 } | |
698 | |
699 private EditorFieldValidator getEmailValidator() { | |
700 if (mEmailValidator == null) { | |
701 mEmailValidator = new EditorFieldValidator() { | |
702 @Override | |
703 public boolean isValid(CharSequence value) { | |
704 return value != null && Patterns.EMAIL_ADDRESS.matcher(value
).matches(); | |
705 } | |
706 }; | |
707 } | |
708 return mEmailValidator; | |
709 } | |
710 | |
711 @Override | 612 @Override |
712 public void onSectionAddOption(@PaymentRequestUI.DataType int optionType) { | 613 public void onSectionAddOption(@PaymentRequestUI.DataType int optionType) { |
713 if (optionType == PaymentRequestUI.TYPE_SHIPPING_ADDRESSES) { | 614 if (optionType == PaymentRequestUI.TYPE_SHIPPING_ADDRESSES) { |
714 PreferencesLauncher.launchSettingsPage(mContext, AutofillProfileEdit
or.class.getName()); | 615 PreferencesLauncher.launchSettingsPage(mContext, AutofillProfileEdit
or.class.getName()); |
715 } else if (optionType == PaymentRequestUI.TYPE_CONTACT_DETAILS) { | 616 } else if (optionType == PaymentRequestUI.TYPE_CONTACT_DETAILS) { |
716 editContact(null); | 617 editContact(null); |
717 } else if (optionType == PaymentRequestUI.TYPE_PAYMENT_METHODS) { | 618 } else if (optionType == PaymentRequestUI.TYPE_PAYMENT_METHODS) { |
718 PreferencesLauncher.launchSettingsPage( | 619 PreferencesLauncher.launchSettingsPage( |
719 mContext, AutofillCreditCardEditor.class.getName()); | 620 mContext, AutofillCreditCardEditor.class.getName()); |
720 } | 621 } |
721 } | 622 } |
722 | 623 |
| 624 private void editContact(final AutofillContact toEdit) { |
| 625 mContactEditor.editContact(toEdit, new Callback<AutofillContact>() { |
| 626 @Override |
| 627 public void onResult(AutofillContact completeContact) { |
| 628 if (completeContact == null) { |
| 629 mContactSection.setSelectedItemIndex(SectionInformation.NO_S
ELECTION); |
| 630 } else if (toEdit == null) { |
| 631 mContactSection.addAndSelectItem(completeContact); |
| 632 } |
| 633 |
| 634 mUI.updateSection(PaymentRequestUI.TYPE_CONTACT_DETAILS, mContac
tSection); |
| 635 } |
| 636 }); |
| 637 } |
| 638 |
723 @Override | 639 @Override |
724 public void onPayClicked(PaymentOption selectedShippingAddress, | 640 public void onPayClicked(PaymentOption selectedShippingAddress, |
725 PaymentOption selectedShippingOption, PaymentOption selectedPaymentM
ethod) { | 641 PaymentOption selectedShippingOption, PaymentOption selectedPaymentM
ethod) { |
726 assert selectedPaymentMethod instanceof PaymentInstrument; | 642 assert selectedPaymentMethod instanceof PaymentInstrument; |
727 PaymentInstrument instrument = (PaymentInstrument) selectedPaymentMethod
; | 643 PaymentInstrument instrument = (PaymentInstrument) selectedPaymentMethod
; |
728 mPaymentAppRunning = true; | 644 mPaymentAppRunning = true; |
729 instrument.getDetails(mMerchantName, mOrigin, mRawTotal, mRawLineItems, | 645 instrument.getDetails(mMerchantName, mOrigin, mRawTotal, mRawLineItems, |
730 mMethodData.get(instrument.getMethodName()), this); | 646 mMethodData.get(instrument.getMethodName()), this); |
731 } | 647 } |
732 | 648 |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
891 private void closeClient() { | 807 private void closeClient() { |
892 if (mClient != null) mClient.close(); | 808 if (mClient != null) mClient.close(); |
893 mClient = null; | 809 mClient = null; |
894 } | 810 } |
895 | 811 |
896 @VisibleForTesting | 812 @VisibleForTesting |
897 public static void setObserverForTest(PaymentRequestServiceObserverForTest o
bserverForTest) { | 813 public static void setObserverForTest(PaymentRequestServiceObserverForTest o
bserverForTest) { |
898 sObserverForTest = observerForTest; | 814 sObserverForTest = observerForTest; |
899 } | 815 } |
900 } | 816 } |
OLD | NEW |