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.text.TextUtils; | 10 import android.text.TextUtils; |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 private List<LineItem> mLineItems; | 68 private List<LineItem> mLineItems; |
69 private SectionInformation mShippingOptions; | 69 private SectionInformation mShippingOptions; |
70 private JSONObject mData; | 70 private JSONObject mData; |
71 private SectionInformation mShippingAddresses; | 71 private SectionInformation mShippingAddresses; |
72 private List<PaymentApp> mPendingApps; | 72 private List<PaymentApp> mPendingApps; |
73 private List<PaymentInstrument> mPendingInstruments; | 73 private List<PaymentInstrument> mPendingInstruments; |
74 private SectionInformation mPaymentMethods; | 74 private SectionInformation mPaymentMethods; |
75 private PaymentRequestUI mUI; | 75 private PaymentRequestUI mUI; |
76 private Callback<PaymentInformation> mPaymentInformationCallback; | 76 private Callback<PaymentInformation> mPaymentInformationCallback; |
77 private Pattern mRegionCodePattern; | 77 private Pattern mRegionCodePattern; |
| 78 private boolean mMerchantNeedsShippingAddress; |
78 | 79 |
79 /** | 80 /** |
80 * Builds the dialog. | 81 * Builds the dialog. |
81 * | 82 * |
82 * @param webContents The web contents that have invoked the PaymentRequest
API. | 83 * @param webContents The web contents that have invoked the PaymentRequest
API. |
83 */ | 84 */ |
84 public PaymentRequestImpl(WebContents webContents) { | 85 public PaymentRequestImpl(WebContents webContents) { |
85 if (webContents == null) return; | 86 if (webContents == null) return; |
86 | 87 |
87 ContentViewCore contentViewCore = ContentViewCore.fromWebContents(webCon
tents); | 88 ContentViewCore contentViewCore = ContentViewCore.fromWebContents(webCon
tents); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 } | 161 } |
161 mPaymentItems = Arrays.asList(details.items); | 162 mPaymentItems = Arrays.asList(details.items); |
162 | 163 |
163 mShippingOptions = | 164 mShippingOptions = |
164 getValidatedShippingOptions(details.items[0].amount.currencyCode
, details); | 165 getValidatedShippingOptions(details.items[0].amount.currencyCode
, details); |
165 if (mShippingOptions == null) { | 166 if (mShippingOptions == null) { |
166 disconnectFromClientWithDebugMessage("Invalid shipping options"); | 167 disconnectFromClientWithDebugMessage("Invalid shipping options"); |
167 return; | 168 return; |
168 } | 169 } |
169 | 170 |
| 171 // If the merchant requests shipping and does not provide shipping optio
ns here, then the |
| 172 // merchant needs the shipping address to calculate shipping price and a
vailability. |
| 173 boolean requestShipping = options != null && options.requestShipping; |
| 174 mMerchantNeedsShippingAddress = requestShipping && mShippingOptions.isEm
pty(); |
| 175 |
170 mData = getValidatedData(mSupportedMethods, stringifiedData); | 176 mData = getValidatedData(mSupportedMethods, stringifiedData); |
171 if (mData == null) { | 177 if (mData == null) { |
172 disconnectFromClientWithDebugMessage("Invalid payment method specifi
c data"); | 178 disconnectFromClientWithDebugMessage("Invalid payment method specifi
c data"); |
173 return; | 179 return; |
174 } | 180 } |
175 | 181 |
176 List<AutofillAddress> addresses = new ArrayList<>(); | 182 List<AutofillAddress> addresses = new ArrayList<>(); |
177 List<AutofillProfile> profiles = PersonalDataManager.getInstance().getAd
dressOnlyProfiles(); | 183 List<AutofillProfile> profiles = PersonalDataManager.getInstance().getAd
dressOnlyProfiles(); |
178 for (int i = 0; i < profiles.size(); i++) { | 184 for (int i = 0; i < profiles.size(); i++) { |
179 AutofillProfile profile = profiles.get(i); | 185 AutofillProfile profile = profiles.get(i); |
(...skipping 24 matching lines...) Expand all Loading... |
204 Set<String> appMethods = app.getSupportedMethodNames(); | 210 Set<String> appMethods = app.getSupportedMethodNames(); |
205 appMethods.retainAll(mSupportedMethods); | 211 appMethods.retainAll(mSupportedMethods); |
206 if (!appMethods.isEmpty()) { | 212 if (!appMethods.isEmpty()) { |
207 isGettingInstruments = true; | 213 isGettingInstruments = true; |
208 app.getInstruments(mPaymentItems, this); | 214 app.getInstruments(mPaymentItems, this); |
209 } | 215 } |
210 } | 216 } |
211 | 217 |
212 if (!isGettingInstruments) mPaymentMethods = new SectionInformation(); | 218 if (!isGettingInstruments) mPaymentMethods = new SectionInformation(); |
213 | 219 |
214 boolean requestShipping = options != null && options.requestShipping; | |
215 mUI = new PaymentRequestUI(mContext, this, requestShipping, mMerchantNam
e, mOrigin); | 220 mUI = new PaymentRequestUI(mContext, this, requestShipping, mMerchantNam
e, mOrigin); |
216 if (mFavicon != null) mUI.setTitleBitmap(mFavicon); | 221 if (mFavicon != null) mUI.setTitleBitmap(mFavicon); |
217 mFavicon = null; | 222 mFavicon = null; |
218 } | 223 } |
219 | 224 |
220 private HashSet<String> getValidatedSupportedMethods(String[] methods) { | 225 private HashSet<String> getValidatedSupportedMethods(String[] methods) { |
221 // Payment methods are required. | 226 // Payment methods are required. |
222 if (methods == null || methods.length == 0) return null; | 227 if (methods == null || methods.length == 0) return null; |
223 | 228 |
224 HashSet<String> result = new HashSet<>(); | 229 HashSet<String> result = new HashSet<>(); |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 public void run() { | 392 public void run() { |
388 callback.onResult(mPaymentMethods); | 393 callback.onResult(mPaymentMethods); |
389 } | 394 } |
390 }); | 395 }); |
391 } | 396 } |
392 | 397 |
393 @Override | 398 @Override |
394 public void onShippingAddressChanged(PaymentOption selectedShippingAddress)
{ | 399 public void onShippingAddressChanged(PaymentOption selectedShippingAddress)
{ |
395 assert selectedShippingAddress instanceof AutofillAddress; | 400 assert selectedShippingAddress instanceof AutofillAddress; |
396 mShippingAddresses.setSelectedItem(selectedShippingAddress); | 401 mShippingAddresses.setSelectedItem(selectedShippingAddress); |
397 mClient.onShippingAddressChange( | 402 if (mMerchantNeedsShippingAddress) { |
398 ((AutofillAddress) selectedShippingAddress).toShippingAddress())
; | 403 mClient.onShippingAddressChange( |
| 404 ((AutofillAddress) selectedShippingAddress).toShippingAddres
s()); |
| 405 } |
399 } | 406 } |
400 | 407 |
401 @Override | 408 @Override |
402 public void onShippingOptionChanged(PaymentOption selectedShippingOption) { | 409 public void onShippingOptionChanged(PaymentOption selectedShippingOption) { |
403 mShippingOptions.setSelectedItem(selectedShippingOption); | 410 mShippingOptions.setSelectedItem(selectedShippingOption); |
404 mClient.onShippingOptionChange(selectedShippingOption.getIdentifier()); | 411 mClient.onShippingOptionChange(selectedShippingOption.getIdentifier()); |
405 } | 412 } |
406 | 413 |
407 @Override | 414 @Override |
408 public void onPaymentMethodChanged(PaymentOption selectedPaymentMethod) { | 415 public void onPaymentMethodChanged(PaymentOption selectedPaymentMethod) { |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 if (mPaymentMethods != null) { | 542 if (mPaymentMethods != null) { |
536 for (int i = 0; i < mPaymentMethods.getSize(); i++) { | 543 for (int i = 0; i < mPaymentMethods.getSize(); i++) { |
537 PaymentOption option = mPaymentMethods.getItem(i); | 544 PaymentOption option = mPaymentMethods.getItem(i); |
538 assert option instanceof PaymentInstrument; | 545 assert option instanceof PaymentInstrument; |
539 ((PaymentInstrument) option).dismiss(); | 546 ((PaymentInstrument) option).dismiss(); |
540 } | 547 } |
541 mPaymentMethods = null; | 548 mPaymentMethods = null; |
542 } | 549 } |
543 } | 550 } |
544 } | 551 } |
OLD | NEW |