| 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 7a9000f3164c463193fae6b0dc8feb39e73aa5ff..b9f85f0f2001742a0111c9b1cd08918d27bca740 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
|
| @@ -70,6 +70,7 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
|
| private final Set<String> mNonUriPaymentMethods;
|
| private final Set<URI> mUriPaymentMethods;
|
| private final PaymentManifestDownloader mDownloader;
|
| + private final PaymentManifestWebDataService mWebDataService;
|
| private final PaymentManifestParser mParser;
|
| private final PackageManagerDelegate mPackageManagerDelegate;
|
| private final PaymentAppCreatedCallback mCallback;
|
| @@ -83,6 +84,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;
|
|
|
| @@ -93,6 +100,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.
|
| @@ -100,16 +108,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;
|
|
|
| // For non-URI payment method names, only names published by W3C should be supported.
|
| @@ -140,10 +150,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
|
| @@ -164,7 +176,6 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
|
| appSupportedMethods.add(getPaymentMethodNames(apps.get(i).activityInfo));
|
| }
|
|
|
| - List<PaymentManifestVerifier> verifiers = new ArrayList<>();
|
| for (URI uriMethodName : mUriPaymentMethods) {
|
| List<ResolveInfo> supportedApps =
|
| filterAppsByMethodName(apps, appSupportedMethods, uriMethodName.toString());
|
| @@ -174,11 +185,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(uriMethodName, supportedApps, mDownloader,
|
| - mParser, mPackageManagerDelegate, this /* callback */));
|
| + mManifestVerifiers.add(
|
| + new PaymentManifestVerifier(uriMethodName, supportedApps, mWebDataService,
|
| + mDownloader, mParser, mPackageManagerDelegate, this /* callback */));
|
| mPendingApps.put(uriMethodName, 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;
|
| }
|
| @@ -193,13 +205,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();
|
| }
|
| }
|
|
|
| @@ -290,6 +302,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.
|
| @@ -297,8 +319,6 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
|
| private void onSearchFinished() {
|
| assert mPendingApps.isEmpty();
|
|
|
| - if (mParser.isUtilityProcessRunning()) mParser.stopUtilityProcess();
|
| -
|
| if (!mIsIncognito) {
|
| List<ResolveInfo> resolveInfos =
|
| mPackageManagerDelegate.getServicesThatCanRespondToIntent(
|
|
|