| Index: chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactory.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactory.java
|
| index 06bf964172c65de8d180ec1d4b8670dbb0d33201..345dc144f6f670985bc506baac8bec5c4771e5ea 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactory.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactory.java
|
| @@ -5,17 +5,33 @@
|
| 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.net.Uri;
|
|
|
| import org.chromium.base.VisibleForTesting;
|
| +import org.chromium.chrome.browser.ChromeFeatureList;
|
| +import org.chromium.content.browser.ContentViewCore;
|
| import org.chromium.content_public.browser.WebContents;
|
| +import org.chromium.ui.base.WindowAndroid;
|
|
|
| import java.util.ArrayList;
|
| +import java.util.Collection;
|
| +import java.util.HashMap;
|
| import java.util.List;
|
| +import java.util.Map;
|
| +import java.util.Set;
|
|
|
| /**
|
| * Builds instances of payment apps.
|
| */
|
| public class PaymentAppFactory {
|
| + private static final String PAY_INTENT_ACTION = "org.chromium.intent.action.PAY";
|
| + private static final String IS_READY_TO_PAY_INTENT_ACTION =
|
| + "org.chromium.intent.action.IS_READY_TO_PAY";
|
| + private static final String METHOD_PREFIX = "https://";
|
| +
|
| /**
|
| * Can be used to build additional types of payment apps without Chrome knowing about their
|
| * types.
|
| @@ -36,6 +52,12 @@ public class PaymentAppFactory {
|
| }
|
|
|
| /**
|
| + */
|
| + public interface PaymentAppsCallback {
|
| + void onPaymentAppsReady(List<PaymentApp> apps);
|
| + }
|
| +
|
| + /**
|
| * Sets the additional factory that can build instances of payment apps.
|
| *
|
| * @param additionalFactory Can build instances of payment apps.
|
| @@ -50,14 +72,65 @@ public class PaymentAppFactory {
|
| *
|
| * @param context The context.
|
| * @param webContents The web contents where PaymentRequest was invoked.
|
| + * @param methods The methods that merchant supports.
|
| + * @param callback The callback to notify of payment apps.
|
| */
|
| - public static List<PaymentApp> create(Context context, WebContents webContents) {
|
| - List<PaymentApp> result = new ArrayList<>(2);
|
| + public static void create(Context context, WebContents webContents,
|
| + Set<String> methods, final PaymentAppsCallback callback) {
|
| + final List<PaymentApp> result = new ArrayList<>();
|
| result.add(new AutofillPaymentApp(context, webContents));
|
| - if (sAdditionalFactory != null) {
|
| - result.addAll(
|
| - sAdditionalFactory.create(context, webContents));
|
| + if (sAdditionalFactory != null) result.addAll(
|
| + sAdditionalFactory.create(context, webContents));
|
| + if (ChromeFeatureList.isEnabled(ChromeFeatureList.ANDROID_PAY_INTEGRATION_V1)) {
|
| + result.addAll(getInstalledApps(context,
|
| + ContentViewCore.fromWebContents(webContents).getWindowAndroid(), methods));
|
| }
|
| - return result;
|
| + new android.os.Handler().post(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + callback.onPaymentAppsReady(result);
|
| + }
|
| + });
|
| + }
|
| +
|
| + private static Collection<? extends PaymentApp> getInstalledApps(
|
| + Context context, WindowAndroid window, Set<String> methods) {
|
| + // Check cache of payment method specs.
|
| +
|
| + Map<String, AndroidPaymentApp> installedApps = new HashMap<>();
|
| + PackageManager pm = context.getPackageManager();
|
| + Intent payIntent = new Intent(PAY_INTENT_ACTION);
|
| + for (String methodName : methods) {
|
| + if (methodName.startsWith(METHOD_PREFIX)) {
|
| + payIntent.setData(Uri.parse(methodName));
|
| + 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;
|
| + AndroidPaymentApp installedApp = installedApps.get(packageName);
|
| + if (installedApp == null) {
|
| + CharSequence label = match.loadLabel(pm);
|
| + installedApp =
|
| + new AndroidPaymentApp(window, packageName, match.activityInfo.name,
|
| + label == null ? "" : label.toString(), match.loadIcon(pm));
|
| + installedApps.put(packageName, installedApp);
|
| + }
|
| + installedApp.addMethodName(methodName);
|
| + }
|
| + }
|
| + }
|
| +
|
| + List<ResolveInfo> matches =
|
| + pm.queryIntentServices(new Intent(IS_READY_TO_PAY_INTENT_ACTION), 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);
|
| + }
|
| +
|
| + // Update the cache of payment method specs.
|
| +
|
| + return installedApps.values();
|
| }
|
| }
|
|
|