| Index: chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinder.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinder.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinder.java
|
| index 50f0757202f797f8b91bccf9094a33d0ea883b29..222826ef02983d7e3e9d28bb8dc8c724bd7f5034 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinder.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinder.java
|
| @@ -69,6 +69,7 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
|
| private final boolean mQueryBasicCard;
|
| private final Set<URI> mPaymentMethods;
|
| private final PaymentManifestDownloader mDownloader;
|
| + private final PaymentManifestWebDataService mWebDataService;
|
| private final PaymentManifestParser mParser;
|
| private final PackageManagerDelegate mPackageManagerDelegate;
|
| private final PaymentAppCreatedCallback mCallback;
|
| @@ -81,6 +82,12 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
|
| */
|
| private final Map<URI, Set<ResolveInfo>> mPendingApps;
|
|
|
| + /**
|
| + * List of payment manifest verifiers. Note that each non basic card payment method has a
|
| + * dedicated payment manifest verifier.
|
| + */
|
| + private final List<PaymentManifestVerifier> mManifestVerifiers;
|
| +
|
| /** A map of Android package name to the payment app. */
|
| private final Map<String, AndroidPaymentApp> mResult;
|
|
|
| @@ -91,6 +98,7 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
|
| * @param methods The list of payment methods requested by the merchant. For
|
| * example, "https://bobpay.com", "https://android.com/pay",
|
| * "basic-card".
|
| + * @param webDataService The web data service to cache manifest.
|
| * @param downloader The manifest downloader.
|
| * @param parser The manifest parser.
|
| * @param packageManagerDelegate The package information retriever.
|
| @@ -98,16 +106,18 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
|
| * all Android payment apps have been found.
|
| */
|
| public static void find(WebContents webContents, Set<String> methods,
|
| - PaymentManifestDownloader downloader, PaymentManifestParser parser,
|
| - PackageManagerDelegate packageManagerDelegate, PaymentAppCreatedCallback callback) {
|
| - new AndroidPaymentAppFinder(
|
| - webContents, methods, downloader, parser, packageManagerDelegate, callback)
|
| + PaymentManifestWebDataService webDataService, PaymentManifestDownloader downloader,
|
| + PaymentManifestParser parser, PackageManagerDelegate packageManagerDelegate,
|
| + PaymentAppCreatedCallback callback) {
|
| + new AndroidPaymentAppFinder(webContents, methods, webDataService, downloader, parser,
|
| + packageManagerDelegate, callback)
|
| .findAndroidPaymentApps();
|
| }
|
|
|
| private AndroidPaymentAppFinder(WebContents webContents, Set<String> methods,
|
| - PaymentManifestDownloader downloader, PaymentManifestParser parser,
|
| - PackageManagerDelegate packageManagerDelegate, PaymentAppCreatedCallback callback) {
|
| + PaymentManifestWebDataService webDataService, PaymentManifestDownloader downloader,
|
| + PaymentManifestParser parser, PackageManagerDelegate packageManagerDelegate,
|
| + PaymentAppCreatedCallback callback) {
|
| mWebContents = webContents;
|
| mQueryBasicCard = methods.contains(BASIC_CARD_PAYMENT_METHOD);
|
| mPaymentMethods = new HashSet<>();
|
| @@ -132,10 +142,12 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
|
| }
|
|
|
| mDownloader = downloader;
|
| + mWebDataService = webDataService;
|
| mParser = parser;
|
| mPackageManagerDelegate = packageManagerDelegate;
|
| mCallback = callback;
|
| mPendingApps = new HashMap<>();
|
| + mManifestVerifiers = new ArrayList<>();
|
| mResult = new HashMap<>();
|
| ChromeActivity activity = ChromeActivity.fromWebContents(mWebContents);
|
| mIsIncognito = activity != null && activity.getCurrentTabModel() != null
|
| @@ -161,7 +173,6 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
|
| appSupportedDefaultMethods.add(getDefaultPaymentMethodName(apps.get(i).activityInfo));
|
| }
|
|
|
| - List<PaymentManifestVerifier> verifiers = new ArrayList<>();
|
| for (URI methodName : mPaymentMethods) {
|
| List<ResolveInfo> supportedApps = filterAppsByMethodName(
|
| apps, appSupportedMethods, appSupportedDefaultMethods, methodName.toString());
|
| @@ -171,11 +182,12 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
|
| // manifest file needs to be parsed. The startup can take up to 2 seconds.
|
| if (!mParser.isUtilityProcessRunning()) mParser.startUtilityProcess();
|
|
|
| - verifiers.add(new PaymentManifestVerifier(methodName, supportedApps, mDownloader,
|
| - mParser, mPackageManagerDelegate, this /* callback */));
|
| + mManifestVerifiers.add(
|
| + new PaymentManifestVerifier(methodName, supportedApps, mWebDataService,
|
| + mDownloader, mParser, mPackageManagerDelegate, this /* callback */));
|
| mPendingApps.put(methodName, new HashSet<>(supportedApps));
|
|
|
| - if (verifiers.size() == MAX_NUMBER_OF_MANIFESTS) {
|
| + if (mManifestVerifiers.size() == MAX_NUMBER_OF_MANIFESTS) {
|
| Log.d(TAG, "Reached maximum number of allowed payment app manifests.");
|
| break;
|
| }
|
| @@ -190,13 +202,13 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
|
| }
|
| }
|
|
|
| - if (verifiers.isEmpty()) {
|
| + if (mManifestVerifiers.isEmpty()) {
|
| onSearchFinished();
|
| return;
|
| }
|
|
|
| - for (int i = 0; i < verifiers.size(); i++) {
|
| - verifiers.get(i).verify();
|
| + for (int i = 0; i < mManifestVerifiers.size(); i++) {
|
| + mManifestVerifiers.get(i).verify();
|
| }
|
| }
|
|
|
| @@ -291,6 +303,16 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
|
| if (mPendingApps.isEmpty()) onSearchFinished();
|
| }
|
|
|
| + @Override
|
| + public void onVerifyFinished(PaymentManifestVerifier verifier) {
|
| + mManifestVerifiers.remove(verifier);
|
| + if (!mManifestVerifiers.isEmpty()) return;
|
| +
|
| + assert mPendingApps.isEmpty();
|
| + mWebDataService.destroy();
|
| + if (mParser.isUtilityProcessRunning()) mParser.stopUtilityProcess();
|
| + }
|
| +
|
| /**
|
| * Checks for IS_READY_TO_PAY service in each valid payment app and returns the valid apps
|
| * to the caller. Called when finished verifying all payment methods and apps.
|
| @@ -298,8 +320,6 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
|
| private void onSearchFinished() {
|
| assert mPendingApps.isEmpty();
|
|
|
| - if (mParser.isUtilityProcessRunning()) mParser.stopUtilityProcess();
|
| -
|
| if (!mIsIncognito) {
|
| List<ResolveInfo> resolveInfos =
|
| mPackageManagerDelegate.getServicesThatCanRespondToIntent(
|
|
|