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

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

Issue 2507223002: Implement IsReadyToPay handling (Closed)
Patch Set: Use aidl Created 4 years, 1 month 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 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();
}
}

Powered by Google App Engine
This is Rietveld 408576698