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(); |
} |
} |