| Index: chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFactory.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFactory.java
|
| index 582b1bf48502b4e7588e8c3fbb1277ac3073cab3..58f37e7b2671173202eb6c800a5fb7edd4a39639 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFactory.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFactory.java
|
| @@ -4,20 +4,17 @@
|
|
|
| package org.chromium.chrome.browser.payments;
|
|
|
| -import android.content.Context;
|
| import android.content.Intent;
|
| -import android.content.pm.PackageManager;
|
| import android.content.pm.ResolveInfo;
|
| import android.graphics.drawable.Drawable;
|
| -import android.net.Uri;
|
| +import android.text.TextUtils;
|
| import android.util.Pair;
|
|
|
| -import org.chromium.base.ContextUtils;
|
| -import org.chromium.chrome.browser.ChromeActivity;
|
| import org.chromium.chrome.browser.ChromeFeatureList;
|
| -import org.chromium.chrome.browser.UrlConstants;
|
| import org.chromium.chrome.browser.payments.PaymentAppFactory.PaymentAppCreatedCallback;
|
| import org.chromium.chrome.browser.payments.PaymentAppFactory.PaymentAppFactoryAddition;
|
| +import org.chromium.components.payments.PaymentManifestDownloader;
|
| +import org.chromium.components.payments.PaymentManifestParser;
|
| import org.chromium.content_public.browser.WebContents;
|
|
|
| import java.util.HashMap;
|
| @@ -27,76 +24,13 @@ import java.util.Set;
|
|
|
| /** Builds instances of payment apps based on installed third party Android payment apps. */
|
| public class AndroidPaymentAppFactory implements PaymentAppFactoryAddition {
|
| - private static final String ACTION_IS_READY_TO_PAY =
|
| - "org.chromium.intent.action.IS_READY_TO_PAY";
|
| -
|
| - /** The action name for the Pay Basic-card Intent. */
|
| - private static final String ACTION_PAY_BASIC_CARD = "org.chromium.intent.action.PAY_BASIC_CARD";
|
| -
|
| - /**
|
| - * The basic-card payment method name used by merchant and defined by W3C:
|
| - * https://w3c.github.io/webpayments-methods-card/#method-id
|
| - */
|
| - private static final String BASIC_CARD_PAYMENT_METHOD = "basic-card";
|
| -
|
| @Override
|
| - public void create(WebContents webContents, Set<String> methods,
|
| - PaymentAppCreatedCallback callback) {
|
| - Context context = ChromeActivity.fromWebContents(webContents);
|
| - if (context == null) {
|
| - callback.onAllPaymentAppsCreated();
|
| - return;
|
| - }
|
| -
|
| - Map<String, AndroidPaymentApp> installedApps = new HashMap<>();
|
| - PackageManager pm = context.getPackageManager();
|
| - Intent payIntent = new Intent();
|
| -
|
| - boolean paymentAppsFilterEnabled =
|
| - ChromeFeatureList.isEnabled(ChromeFeatureList.ANDROID_PAYMENT_APPS_FILTER);
|
| - Intent filterIntent = new Intent(AndroidPaymentApp.ACTION_PAY);
|
| -
|
| - for (String methodName : methods) {
|
| - if (methodName.startsWith(UrlConstants.HTTPS_URL_PREFIX)) {
|
| - payIntent.setAction(AndroidPaymentApp.ACTION_PAY);
|
| - payIntent.setData(Uri.parse(methodName));
|
| - } else if (methodName.equals(BASIC_CARD_PAYMENT_METHOD)) {
|
| - payIntent.setAction(ACTION_PAY_BASIC_CARD);
|
| - payIntent.setData(null);
|
| - } else {
|
| - continue;
|
| - }
|
| -
|
| - List<ResolveInfo> matches = pm.queryIntentActivities(payIntent, 0);
|
| - for (int i = 0; i < matches.size(); i++) {
|
| - ResolveInfo match = matches.get(i);
|
| - String packageName = match.activityInfo.packageName;
|
| - if (paymentAppsFilterEnabled) {
|
| - filterIntent.setPackage(packageName);
|
| - if (pm.resolveActivity(filterIntent, 0) == null) continue;
|
| - }
|
| - AndroidPaymentApp installedApp = installedApps.get(packageName);
|
| - if (installedApp == null) {
|
| - CharSequence label = match.loadLabel(pm);
|
| - installedApp =
|
| - new AndroidPaymentApp(webContents, packageName, match.activityInfo.name,
|
| - label == null ? "" : label.toString(), match.loadIcon(pm));
|
| - callback.onPaymentAppCreated(installedApp);
|
| - installedApps.put(packageName, installedApp);
|
| - }
|
| - installedApp.addMethodName(methodName);
|
| - }
|
| - }
|
| -
|
| - List<ResolveInfo> matches = pm.queryIntentServices(new Intent(ACTION_IS_READY_TO_PAY), 0);
|
| - for (int i = 0; i < matches.size(); i++) {
|
| - ResolveInfo match = matches.get(i);
|
| - String packageName = match.serviceInfo.packageName;
|
| - AndroidPaymentApp installedApp = installedApps.get(packageName);
|
| - if (installedApp != null) installedApp.setIsReadyToPayAction(match.serviceInfo.name);
|
| - }
|
| -
|
| - callback.onAllPaymentAppsCreated();
|
| + public void create(
|
| + WebContents webContents, Set<String> methods, PaymentAppCreatedCallback callback) {
|
| + AndroidPaymentAppFinder.find(webContents, methods,
|
| + ChromeFeatureList.isEnabled(ChromeFeatureList.ANDROID_PAYMENT_APPS_FILTER),
|
| + new PaymentManifestDownloader(webContents), new PaymentManifestParser(),
|
| + new PackageManagerDelegate(), callback);
|
| }
|
|
|
| /**
|
| @@ -105,11 +39,11 @@ public class AndroidPaymentAppFactory implements PaymentAppFactoryAddition {
|
| * @return True if there are Android payment apps on device.
|
| */
|
| public static boolean hasAndroidPaymentApps() {
|
| - PackageManager pm = ContextUtils.getApplicationContext().getPackageManager();
|
| + PackageManagerDelegate packageManagerDelegate = new PackageManagerDelegate();
|
| // Note that all Android payment apps must support org.chromium.intent.action.PAY action
|
| // without additional data to be detected.
|
| Intent payIntent = new Intent(AndroidPaymentApp.ACTION_PAY);
|
| - return !pm.queryIntentActivities(payIntent, 0).isEmpty();
|
| + return !packageManagerDelegate.getActivitiesThatCanRespondToIntent(payIntent).isEmpty();
|
| }
|
|
|
| /**
|
| @@ -121,14 +55,17 @@ public class AndroidPaymentAppFactory implements PaymentAppFactoryAddition {
|
| public static Map<String, Pair<String, Drawable>> getAndroidPaymentAppsInfo() {
|
| Map<String, Pair<String, Drawable>> paymentAppsInfo = new HashMap<>();
|
|
|
| - PackageManager pm = ContextUtils.getApplicationContext().getPackageManager();
|
| + PackageManagerDelegate packageManagerDelegate = new PackageManagerDelegate();
|
| Intent payIntent = new Intent(AndroidPaymentApp.ACTION_PAY);
|
| - List<ResolveInfo> matches = pm.queryIntentActivities(payIntent, 0);
|
| + List<ResolveInfo> matches =
|
| + packageManagerDelegate.getActivitiesThatCanRespondToIntent(payIntent);
|
| if (matches.isEmpty()) return paymentAppsInfo;
|
|
|
| for (ResolveInfo match : matches) {
|
| + CharSequence label = packageManagerDelegate.getAppLabel(match);
|
| + if (TextUtils.isEmpty(label)) continue;
|
| Pair<String, Drawable> appInfo =
|
| - new Pair<>(match.loadLabel(pm).toString(), match.loadIcon(pm));
|
| + new Pair<>(label.toString(), packageManagerDelegate.getAppIcon(match));
|
| paymentAppsInfo.put(match.activityInfo.packageName, appInfo);
|
| }
|
|
|
|
|