Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1052)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentAppFactory.java

Issue 2341203002: Android payment apps. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 69681e9fa519d71f7212d87263cbd26d3e0f5094..b1718986c24e55a4743cb066ace5e8e949d7505b 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
@@ -4,16 +4,36 @@
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 org.chromium.base.VisibleForTesting;
+import org.chromium.content.browser.ContentViewCore;
import org.chromium.content_public.browser.WebContents;
+import org.chromium.ui.base.WindowAndroid;
+
+import org.json.JSONObject;
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.
@@ -30,6 +50,10 @@ public class PaymentAppFactory {
List<PaymentApp> create(WebContents webContents);
}
+ public interface PaymentAppsCallback {
+ void onPaymentAppsReady(List<PaymentApp> apps);
+ }
+
/**
* Sets the additional factory that can build instances of payment apps.
*
@@ -43,12 +67,64 @@ public class PaymentAppFactory {
/**
* Builds instances of payment apps.
*
+ * @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(WebContents webContents) {
- List<PaymentApp> result = new ArrayList<>(2);
- result.add(new AutofillPaymentApp(webContents));
+ 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(webContents));
- return result;
+ result.addAll(getInstalledApps(
+ context, ContentViewCore.fromWebContents(webContents).getWindowAndroid(), methods));
+ 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.setIsReadyToPayService(match.serviceInfo.name);
+ }
+
+ // Update the cache of payment method specs.
+
+ return installedApps.values();
}
}

Powered by Google App Engine
This is Rietveld 408576698