Commit e207a0b1 authored by Liquan (Max) Gu's avatar Liquan (Max) Gu Committed by Commit Bot

[PlayBilling] Support knowing if running in AppStore TWA

In AndroidPaymentAppFinder#findAndroidPaymentApps, this CL adds a
support for it to know whether it is running in a TWA that is installed
from AppStore.

Bug: 1064740

Change-Id: I4e21787294f1e7a2e471f80b452ebdd0a9ab77e8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2128831
Commit-Queue: Liquan (Max) Gu <maxlg@chromium.org>
Reviewed-by: default avatarRouslan Solomakhin <rouslan@chromium.org>
Reviewed-by: default avatarPeter Conn <peconn@chromium.org>
Auto-Submit: Liquan (Max) Gu <maxlg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#755848}
parent 4b451a19
...@@ -187,4 +187,17 @@ public class TrustedWebActivityCoordinator implements InflationObserver { ...@@ -187,4 +187,17 @@ public class TrustedWebActivityCoordinator implements InflationObserver {
} }
} }
} }
/** @return The package name of the Trusted Web Activity. */
public String getTwaPackage() {
return mClientPackageNameProvider.get();
}
/**
* @return Whether the app is running in the "Trusted Web Activity" mode, where the
* TWA-specific UI is shown.
*/
public boolean isInTwaMode() {
return mInTwaMode;
}
} }
...@@ -35,6 +35,7 @@ import org.chromium.chrome.browser.LaunchIntentDispatcher; ...@@ -35,6 +35,7 @@ import org.chromium.chrome.browser.LaunchIntentDispatcher;
import org.chromium.chrome.browser.autofill_assistant.AutofillAssistantFacade; import org.chromium.chrome.browser.autofill_assistant.AutofillAssistantFacade;
import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider; import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider.CustomTabsUiType; import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider.CustomTabsUiType;
import org.chromium.chrome.browser.browserservices.trustedwebactivityui.TrustedWebActivityCoordinator;
import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabController; import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabController;
import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabProvider; import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabProvider;
import org.chromium.chrome.browser.customtabs.content.CustomTabIntentHandler.IntentIgnoringCriterion; import org.chromium.chrome.browser.customtabs.content.CustomTabIntentHandler.IntentIgnoringCriterion;
...@@ -67,6 +68,7 @@ public class CustomTabActivity extends BaseCustomTabActivity<CustomTabActivityCo ...@@ -67,6 +68,7 @@ public class CustomTabActivity extends BaseCustomTabActivity<CustomTabActivityCo
private CustomTabIntentDataProvider mIntentDataProvider; private CustomTabIntentDataProvider mIntentDataProvider;
private CustomTabsSessionToken mSession; private CustomTabsSessionToken mSession;
private CustomTabActivityTabController mTabController; private CustomTabActivityTabController mTabController;
private TrustedWebActivityCoordinator mTwaCoordinator;
private final CustomTabsConnection mConnection = CustomTabsConnection.getInstance(); private final CustomTabsConnection mConnection = CustomTabsConnection.getInstance();
...@@ -382,9 +384,27 @@ public class CustomTabActivity extends BaseCustomTabActivity<CustomTabActivityCo ...@@ -382,9 +384,27 @@ public class CustomTabActivity extends BaseCustomTabActivity<CustomTabActivityCo
component.resolveCustomTabIncognitoManager(); component.resolveCustomTabIncognitoManager();
if (mIntentDataProvider.isTrustedWebActivity()) { if (mIntentDataProvider.isTrustedWebActivity()) {
component.resolveTrustedWebActivityCoordinator(); mTwaCoordinator = component.resolveTrustedWebActivityCoordinator();
} }
return component; return component;
} }
/**
* @return The package name of the Trusted Web Activity, if the activity is a TWA; null
* otherwise.
*/
@Nullable
public String getTwaPackage() {
return mTwaCoordinator == null ? null : mTwaCoordinator.getTwaPackage();
}
/**
* @return Whether the app is running in the "Trusted Web Activity" mode, where the TWA-specific
* UI is shown.
*/
@Nullable
public Boolean isInTwaMode() {
return mTwaCoordinator == null ? false : mTwaCoordinator.isInTwaMode();
}
} }
...@@ -15,6 +15,7 @@ import androidx.annotation.VisibleForTesting; ...@@ -15,6 +15,7 @@ import androidx.annotation.VisibleForTesting;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.browser.payments.PaymentManifestVerifier.ManifestVerifyCallback; import org.chromium.chrome.browser.payments.PaymentManifestVerifier.ManifestVerifyCallback;
import org.chromium.components.payments.MethodStrings; import org.chromium.components.payments.MethodStrings;
import org.chromium.components.payments.PaymentManifestDownloader; import org.chromium.components.payments.PaymentManifestDownloader;
...@@ -41,6 +42,8 @@ import java.util.Set; ...@@ -41,6 +42,8 @@ import java.util.Set;
public class AndroidPaymentAppFinder implements ManifestVerifyCallback { public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
private static final String TAG = "PaymentAppFinder"; private static final String TAG = "PaymentAppFinder";
private static final String PLAY_STORE_PACKAGE_NAME = "com.android.vending";
/** The maximum number of payment method manifests to download. */ /** The maximum number of payment method manifests to download. */
private static final int MAX_NUMBER_OF_MANIFESTS = 10; private static final int MAX_NUMBER_OF_MANIFESTS = 10;
...@@ -76,6 +79,12 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback { ...@@ -76,6 +79,12 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
private final PaymentAppFactoryInterface mFactory; private final PaymentAppFactoryInterface mFactory;
private final boolean mIsIncognito; private final boolean mIsIncognito;
/**
* A map from an app-store app's package name to its billing method. All of the supported
* app-store billing method must insert an entry to this map.
*/
private final Map<String, String> mAppStoreBillingMethodMap = new HashMap();
/** /**
* A mapping from an Android package name to the payment app with that package name. The apps * A mapping from an Android package name to the payment app with that package name. The apps
* will be sent to the <code>PaymentAppFactoryDelegate</code> once all of their payment methods * will be sent to the <code>PaymentAppFactoryDelegate</code> once all of their payment methods
...@@ -160,6 +169,8 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback { ...@@ -160,6 +169,8 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
mIgnoredMethods.add(MethodStrings.GOOGLE_PLAY_BILLING); mIgnoredMethods.add(MethodStrings.GOOGLE_PLAY_BILLING);
mAppStoreBillingMethodMap.put(PLAY_STORE_PACKAGE_NAME, MethodStrings.GOOGLE_PLAY_BILLING);
mDownloader = downloader; mDownloader = downloader;
mWebDataService = webDataService; mWebDataService = webDataService;
mParser = parser; mParser = parser;
...@@ -170,6 +181,21 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback { ...@@ -170,6 +181,21 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
mIsIncognito = activity != null && activity.getCurrentTabModel().isIncognito(); mIsIncognito = activity != null && activity.getCurrentTabModel().isIncognito();
} }
private boolean isInTwaInstalledFromAppStore() {
ChromeActivity activity =
ChromeActivity.fromWebContents(mDelegate.getParams().getWebContents());
if (activity == null) return false;
if (!(activity instanceof CustomTabActivity)) return false;
CustomTabActivity customTabActivity = ((CustomTabActivity) activity);
if (!customTabActivity.isInTwaMode()) return false;
String twaPackageName = customTabActivity.getTwaPackage();
if (twaPackageName == null) return false;
String installerPackageName =
activity.getPackageManager().getInstallerPackageName(twaPackageName);
if (installerPackageName == null) return false;
return mAppStoreBillingMethodMap.keySet().contains(installerPackageName);
}
/** /**
* Finds and validates the installed android payment apps that support the payment method names * Finds and validates the installed android payment apps that support the payment method names
* that the merchant is using. * that the merchant is using.
...@@ -213,6 +239,11 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback { ...@@ -213,6 +239,11 @@ public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
} }
} }
if (isInTwaInstalledFromAppStore()) {
// TODO(crbug.com/1064740): the finder would special-case the TWA installed from App
// Store to return only the app-store app.
}
// All URI methods for which manifests should be downloaded. For example, if merchant // All URI methods for which manifests should be downloaded. For example, if merchant
// supports "https://bobpay.com/personal" payment method, but user also has Alice Pay app // supports "https://bobpay.com/personal" payment method, but user also has Alice Pay app
// that has the default payment method name of "https://alicepay.com/webpay" that claims to // that has the default payment method name of "https://alicepay.com/webpay" that claims to
......
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