Commit c00100dc authored by Rouslan Solomakhin's avatar Rouslan Solomakhin Committed by Commit Bot

[Payments] Allow apps without default method name.

Before this patch, if a payment app did not have its own default payment
method name, but only supported other non-default payment methods, then
Chrome would filter it out. This unnecessarily constrained some payment
apps to select one payment method to be the default, which is not always
the case. This patch relaxes this requirement.

After this patch, if a payment app does not have its own default payment
method name, then Chrome checks its non-default payment methods as well.

Bug: 735184
Change-Id: I6604c60aad4efa963120f4c66d505ab7e31bf94f
Reviewed-on: https://chromium-review.googlesource.com/600733Reviewed-by: default avatarGanggui Tang <gogerald@chromium.org>
Commit-Queue: Rouslan Solomakhin <rouslan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#492012}
parent f7d575ed
...@@ -232,34 +232,31 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback { ...@@ -232,34 +232,31 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
? null ? null
: app.activityInfo.metaData.getString( : app.activityInfo.metaData.getString(
META_DATA_NAME_OF_DEFAULT_PAYMENT_METHOD_NAME); META_DATA_NAME_OF_DEFAULT_PAYMENT_METHOD_NAME);
if (TextUtils.isEmpty(defaultMethod)) {
Log.e(TAG, "Skipping \"%s\" because of missing default payment method name.",
app.activityInfo.packageName);
continue;
}
if (!methodToAppsMapping.containsKey(defaultMethod)) {
methodToAppsMapping.put(defaultMethod, new HashSet<ResolveInfo>());
}
methodToAppsMapping.get(defaultMethod).add(app);
URI appOrigin = null; URI appOrigin = null;
if (UriUtils.looksLikeUriMethod(defaultMethod)) { if (!TextUtils.isEmpty(defaultMethod)) {
URI defaultUriMethod = UriUtils.parseUriFromString(defaultMethod); if (!methodToAppsMapping.containsKey(defaultMethod)) {
if (defaultUriMethod != null) { methodToAppsMapping.put(defaultMethod, new HashSet<ResolveInfo>());
uriMethods.add(defaultUriMethod); }
methodToAppsMapping.get(defaultMethod).add(app);
if (!uriMethodToDefaultAppsMapping.containsKey(defaultUriMethod)) {
uriMethodToDefaultAppsMapping.put( if (UriUtils.looksLikeUriMethod(defaultMethod)) {
defaultUriMethod, new HashSet<ResolveInfo>()); URI defaultUriMethod = UriUtils.parseUriFromString(defaultMethod);
} if (defaultUriMethod != null) {
uriMethodToDefaultAppsMapping.get(defaultUriMethod).add(app); uriMethods.add(defaultUriMethod);
appOrigin = UriUtils.getOrigin(defaultUriMethod); if (!uriMethodToDefaultAppsMapping.containsKey(defaultUriMethod)) {
if (!mOriginToUriDefaultMethodsMapping.containsKey(appOrigin)) { uriMethodToDefaultAppsMapping.put(
mOriginToUriDefaultMethodsMapping.put(appOrigin, new HashSet<URI>()); defaultUriMethod, new HashSet<ResolveInfo>());
}
uriMethodToDefaultAppsMapping.get(defaultUriMethod).add(app);
appOrigin = UriUtils.getOrigin(defaultUriMethod);
if (!mOriginToUriDefaultMethodsMapping.containsKey(appOrigin)) {
mOriginToUriDefaultMethodsMapping.put(appOrigin, new HashSet<URI>());
}
mOriginToUriDefaultMethodsMapping.get(appOrigin).add(defaultUriMethod);
} }
mOriginToUriDefaultMethodsMapping.get(appOrigin).add(defaultUriMethod);
} }
} }
......
...@@ -178,22 +178,94 @@ public class AndroidPaymentAppFinderTest implements PaymentAppCreatedCallback { ...@@ -178,22 +178,94 @@ public class AndroidPaymentAppFinderTest implements PaymentAppCreatedCallback {
} }
/** /**
* Payment apps without metadata or without default payment method name in metadata should be * Payment apps without metadata should be filtered out.
* filtered out.
*/ */
@Test @Test
@Feature({"Payments"}) @Feature({"Payments"})
public void testBadMetadata() throws Throwable { public void testNoMetadata() throws Throwable {
Set<String> methods = new HashSet<>(); Set<String> methods = new HashSet<>();
methods.add("basic-card"); methods.add("basic-card");
mPackageManager.installPaymentApp( mPackageManager.installPaymentApp("BobPay", "com.bobpay", null /* no metadata */, "01");
"BobPay", "com.bobpay", null /* no metadata */, "01020304050607080900");
mPackageManager.installPaymentApp("AlicePay", "com.alicepay",
"" /* no default payment method name in metadata */, "ABCDEFABCDEFABCDEFAB");
findApps(methods); findApps(methods);
Assert.assertTrue("No apps should match the query", mPaymentApps.isEmpty()); Assert.assertTrue("No apps should match the query", mPaymentApps.isEmpty());
mPaymentApps.clear();
mAllPaymentAppsCreated = false;
findApps(methods);
Assert.assertTrue("No apps should still match the query", mPaymentApps.isEmpty());
}
/**
* Payment apps without default payment method name in metadata should still be able to use
* non-URL payment method names.
*/
@Test
@Feature({"Payments"})
public void testNoDefaultPaymentMethodNameWithNonUrlPaymentMethodName() throws Throwable {
Set<String> methods = new HashSet<>();
methods.add("basic-card");
mPackageManager.installPaymentApp("AlicePay", "com.alicepay",
"" /* no default payment method name in metadata */, "AA");
mPackageManager.setStringArrayMetaData("com.alicepay", new String[] {"basic-card"});
findApps(methods);
Assert.assertEquals("1 app should match the query", 1, mPaymentApps.size());
Assert.assertEquals("com.alicepay", mPaymentApps.get(0).getAppIdentifier());
Assert.assertEquals(1, mPaymentApps.get(0).getAppMethodNames().size());
Assert.assertEquals(
"basic-card", mPaymentApps.get(0).getAppMethodNames().iterator().next());
mPaymentApps.clear();
mAllPaymentAppsCreated = false;
findApps(methods);
Assert.assertEquals("1 app should still match the query", 1, mPaymentApps.size());
Assert.assertEquals("com.alicepay", mPaymentApps.get(0).getAppIdentifier());
Assert.assertEquals(1, mPaymentApps.get(0).getAppMethodNames().size());
Assert.assertEquals(
"basic-card", mPaymentApps.get(0).getAppMethodNames().iterator().next());
}
/**
* Payment apps without default payment method name in metadata should still be able to use
* URL payment method names that support all origins.
*/
@Test
@Feature({"Payments"})
public void testNoDefaultPaymentMethodNameWithUrlPaymentMethodNameThatSupportsAllOrigins()
throws Throwable {
Set<String> methods = new HashSet<>();
methods.add(mServer.getURL("/components/test/data/payments/frankpay.com/webpay"));
mPackageManager.installPaymentApp("AlicePay", "com.alicepay",
"" /* no default payment method name in metadata */, "AA");
mPackageManager.setStringArrayMetaData("com.alicepay",
new String[] {
mServer.getURL("/components/test/data/payments/frankpay.com/webpay")});
findApps(methods);
Assert.assertEquals("1 app should match the query", 1, mPaymentApps.size());
Assert.assertEquals("com.alicepay", mPaymentApps.get(0).getAppIdentifier());
Assert.assertEquals(1, mPaymentApps.get(0).getAppMethodNames().size());
Assert.assertEquals(mServer.getURL("/components/test/data/payments/frankpay.com/webpay"),
mPaymentApps.get(0).getAppMethodNames().iterator().next());
mPaymentApps.clear();
mAllPaymentAppsCreated = false;
findApps(methods);
Assert.assertEquals("1 app should still match the query", 1, mPaymentApps.size());
Assert.assertEquals("com.alicepay", mPaymentApps.get(0).getAppIdentifier());
Assert.assertEquals(1, mPaymentApps.get(0).getAppMethodNames().size());
Assert.assertEquals(mServer.getURL("/components/test/data/payments/frankpay.com/webpay"),
mPaymentApps.get(0).getAppMethodNames().iterator().next());
} }
/** Payment apps without a human-readable name should be filtered out. */ /** Payment apps without a human-readable name should be filtered out. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment