Commit d9a7d364 authored by Peter Kotwicz's avatar Peter Kotwicz Committed by Commit Bot

[WebAPK] Enable adding site to homescreen when WebAPK is out of scope

This CL:
- Modifies CustomTabAppMenuPropertiesDelegateto enable adding site
to homescreen when WebAPK is out of scope
- Introduces EmptyVerifier and uses it for custom tabs
- Deletes ExternalIntentsPolicyProviderin favour of accessing
verifier directly
- Moves trustedwebactivityui.controller.Verifier ot
ui.controller.Verifier

BUG=1083256

Change-Id: Ic0c1c98ccb3ccef2b71019b3da544c34488477b2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2205519
Commit-Queue: Peter Kotwicz <pkotwicz@chromium.org>
Reviewed-by: default avatarPeter Conn <peconn@chromium.org>
Reviewed-by: default avatarGlenn Hartmann <hartmanng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#772468}
parent 1997565a
......@@ -190,7 +190,6 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TrustedWebActivityOpenTimeRecorder.java",
"java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TwaRegistrar.java",
"java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TwaVerifier.java",
"java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/Verifier.java",
"java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/sharing/TwaSharingController.java",
"java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/splashscreen/SplashImageHolder.java",
"java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/splashscreen/TwaSplashController.java",
......@@ -198,6 +197,8 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/view/DisclosureNotification.java",
"java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/view/DisclosureSnackbar.java",
"java/src/org/chromium/chrome/browser/browserservices/ui/SharedActivityCoordinator.java",
"java/src/org/chromium/chrome/browser/browserservices/ui/controller/EmptyVerifier.java",
"java/src/org/chromium/chrome/browser/browserservices/ui/controller/Verifier.java",
"java/src/org/chromium/chrome/browser/browserservices/ui/splashscreen/webapps/WebappSplashController.java",
"java/src/org/chromium/chrome/browser/browserservices/ui/trustedwebactivity/TrustedWebActivityCoordinator.java",
"java/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridge.java",
......@@ -435,7 +436,6 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/customtabs/CustomTabsClientFileProcessor.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java",
"java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionService.java",
"java/src/org/chromium/chrome/browser/customtabs/ExternalIntentsPolicyProvider.java",
"java/src/org/chromium/chrome/browser/customtabs/FirstMeaningfulPaintObserver.java",
"java/src/org/chromium/chrome/browser/customtabs/HiddenTabHolder.java",
"java/src/org/chromium/chrome/browser/customtabs/NavigationInfoCaptureTrigger.java",
......
......@@ -12,6 +12,7 @@ import org.chromium.base.ObserverList;
import org.chromium.base.Promise;
import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
import org.chromium.chrome.browser.browserservices.trustedwebactivityui.TrustedWebActivityModel;
import org.chromium.chrome.browser.browserservices.ui.controller.Verifier;
import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabProvider;
import org.chromium.chrome.browser.customtabs.content.TabObserverRegistrar;
import org.chromium.chrome.browser.customtabs.content.TabObserverRegistrar.CustomTabTabObserver;
......
......@@ -10,6 +10,7 @@ import androidx.browser.customtabs.CustomTabsService;
import org.chromium.base.Promise;
import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
import org.chromium.chrome.browser.browserservices.OriginVerifier;
import org.chromium.chrome.browser.browserservices.ui.controller.Verifier;
import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabProvider;
import org.chromium.chrome.browser.dependency_injection.ActivityScope;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
......
......@@ -17,7 +17,7 @@ import org.chromium.base.Promise;
import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
import org.chromium.chrome.browser.browserservices.TrustedWebActivityUmaRecorder;
import org.chromium.chrome.browser.browserservices.TrustedWebActivityUmaRecorder.ShareRequestMethod;
import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.Verifier;
import org.chromium.chrome.browser.browserservices.ui.controller.Verifier;
import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController;
import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabProvider;
import org.chromium.chrome.browser.dependency_injection.ActivityScope;
......
......@@ -14,9 +14,8 @@ import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProv
import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.CurrentPageVerifier;
import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.CurrentPageVerifier.VerificationStatus;
import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.TrustedWebActivityBrowserControlsVisibilityManager;
import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.Verifier;
import org.chromium.chrome.browser.browserservices.ui.controller.Verifier;
import org.chromium.chrome.browser.customtabs.CustomTabStatusBarColorProvider;
import org.chromium.chrome.browser.customtabs.ExternalIntentsPolicyProvider;
import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController;
import org.chromium.chrome.browser.customtabs.features.ImmersiveModeController;
import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarColorController;
......@@ -50,7 +49,6 @@ public class SharedActivityCoordinator implements InflationObserver {
@Inject
public SharedActivityCoordinator(CurrentPageVerifier currentPageVerifier, Verifier verifier,
CustomTabActivityNavigationController navigationController,
ExternalIntentsPolicyProvider externalIntentsPolicyProvider,
BrowserServicesIntentDataProvider intentDataProvider,
CustomTabToolbarColorController toolbarColorController,
CustomTabStatusBarColorProvider statusBarColorProvider,
......@@ -66,8 +64,6 @@ public class SharedActivityCoordinator implements InflationObserver {
mImmersiveDisplayMode = computeImmersiveMode(intentDataProvider);
navigationController.setLandingPageOnCloseCriterion(verifier::wasPreviouslyVerified);
externalIntentsPolicyProvider.setPolicyCriteria(
verifier::shouldIgnoreExternalIntentHandlers);
currentPageVerifier.addVerificationObserver(this::onVerificationUpdate);
lifecycleDispatcher.register(this);
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.browserservices.ui.controller;
import androidx.annotation.Nullable;
import org.chromium.base.Promise;
import org.chromium.chrome.browser.dependency_injection.ActivityScope;
import javax.inject.Inject;
/**
* Empty {@link Verifier} implementation.
*/
@ActivityScope
public class EmptyVerifier implements Verifier {
@Inject
public EmptyVerifier() {}
@Override
public final Promise<Boolean> verify(String url) {
return Promise.fulfilled(false);
}
@Override
public boolean wasPreviouslyVerified(String url) {
return false;
}
@Nullable
@Override
public String getVerifiedScope(String url) {
return url;
}
@Override
public boolean shouldIgnoreExternalIntentHandlers(String url) {
return false;
}
}
\ No newline at end of file
......@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller;
import org.chromium.base.Promise;
package org.chromium.chrome.browser.browserservices.ui.controller;
import androidx.annotation.Nullable;
import org.chromium.base.Promise;
/**
* A Delegate for the {@link CurrentPageVerifier} that provides implementation specific to
* Trusted Web Activities, WebAPKs or A2HS as appropriate.
......
......@@ -27,6 +27,7 @@ import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.KeyboardShortcuts;
import org.chromium.chrome.browser.WarmupManager;
import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
import org.chromium.chrome.browser.browserservices.ui.controller.Verifier;
import org.chromium.chrome.browser.browserservices.ui.trustedwebactivity.TrustedWebActivityCoordinator;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController;
......@@ -47,6 +48,7 @@ import org.chromium.chrome.browser.tabmodel.ChromeTabCreator;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
import org.chromium.chrome.browser.ui.RootUiCoordinator;
import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate;
import org.chromium.chrome.browser.usage_stats.UsageStatsService;
import org.chromium.chrome.browser.webapps.SameTaskWebApkActivity;
import org.chromium.chrome.browser.webapps.WebappActivityCoordinator;
......@@ -76,6 +78,7 @@ public abstract class BaseCustomTabActivity<C extends BaseCustomTabActivityCompo
protected CustomTabNightModeStateController mNightModeStateController;
protected @Nullable WebappActivityCoordinator mWebappActivityCoordinator;
protected @Nullable TrustedWebActivityCoordinator mTwaCoordinator;
protected Verifier mVerifier;
private ObservableSupplierImpl<OverviewModeBehavior> mOverviewModeBehaviorSupplier =
new ObservableSupplierImpl<>();
......@@ -165,6 +168,7 @@ public abstract class BaseCustomTabActivity<C extends BaseCustomTabActivityCompo
mStatusBarColorProvider = component.resolveCustomTabStatusBarColorProvider();
mTabFactory = component.resolveTabFactory();
mCustomTabIntentHandler = component.resolveIntentHandler();
mVerifier = component.resolveVerifier();
component.resolveCompositorContentInitializer();
component.resolveTaskDescriptionHelper();
......@@ -344,6 +348,18 @@ public abstract class BaseCustomTabActivity<C extends BaseCustomTabActivityCompo
return mTabProvider.getTab();
}
@Override
public AppMenuPropertiesDelegate createAppMenuPropertiesDelegate() {
return new CustomTabAppMenuPropertiesDelegate(this, getActivityTabProvider(),
getMultiWindowModeStateDispatcher(), getTabModelSelector(), getToolbarManager(),
getWindow().getDecorView(), mBookmarkBridgeSupplier, mVerifier,
mIntentDataProvider.getUiType(), mIntentDataProvider.getMenuTitles(),
mIntentDataProvider.isOpenedByChrome(),
mIntentDataProvider.shouldShowShareMenuItem(),
mIntentDataProvider.shouldShowStarButton(),
mIntentDataProvider.shouldShowDownloadButton(), mIntentDataProvider.isIncognito());
}
@Override
protected int getControlContainerLayoutId() {
return R.layout.custom_tabs_control_container;
......
......@@ -51,7 +51,6 @@ import org.chromium.chrome.browser.page_info.ChromePageInfoControllerDelegate;
import org.chromium.chrome.browser.page_info.ChromePermissionParamsListBuilderDelegate;
import org.chromium.chrome.browser.previews.Previews;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate;
import org.chromium.components.page_info.PageInfoController;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.WebContents;
......@@ -152,18 +151,6 @@ public class CustomTabActivity extends BaseCustomTabActivity<CustomTabActivityCo
getActivityTab().loadUrl(new LoadUrlParams(searchUrl));
}
@Override
public AppMenuPropertiesDelegate createAppMenuPropertiesDelegate() {
return new CustomTabAppMenuPropertiesDelegate(this, getActivityTabProvider(),
getMultiWindowModeStateDispatcher(), getTabModelSelector(), getToolbarManager(),
getWindow().getDecorView(), mBookmarkBridgeSupplier,
mIntentDataProvider.getUiType(), mIntentDataProvider.getMenuTitles(),
mIntentDataProvider.isOpenedByChrome(),
mIntentDataProvider.shouldShowShareMenuItem(),
mIntentDataProvider.shouldShowStarButton(),
mIntentDataProvider.shouldShowDownloadButton(), mIntentDataProvider.isIncognito());
}
@Override
public String getPackageName() {
if (mShouldOverridePackage) return mIntentDataProvider.getClientPackageName();
......
......@@ -25,6 +25,7 @@ import org.chromium.chrome.browser.DefaultBrowserInfo;
import org.chromium.chrome.browser.app.appmenu.AppMenuPropertiesDelegateImpl;
import org.chromium.chrome.browser.bookmarks.BookmarkBridge;
import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider.CustomTabsUiType;
import org.chromium.chrome.browser.browserservices.ui.controller.Verifier;
import org.chromium.chrome.browser.firstrun.FirstRunStatus;
import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcher;
import org.chromium.chrome.browser.share.ShareHelper;
......@@ -46,6 +47,7 @@ import java.util.Map;
public class CustomTabAppMenuPropertiesDelegate extends AppMenuPropertiesDelegateImpl {
private static final String CUSTOM_MENU_ITEM_ID_KEY = "CustomMenuItemId";
private final Verifier mVerifier;
private final @CustomTabsUiType int mUiType;
private final boolean mShowShare;
private final boolean mShowStar;
......@@ -65,11 +67,12 @@ public class CustomTabAppMenuPropertiesDelegate extends AppMenuPropertiesDelegat
ActivityTabProvider activityTabProvider,
MultiWindowModeStateDispatcher multiWindowModeStateDispatcher,
TabModelSelector tabModelSelector, ToolbarManager toolbarManager, View decorView,
ObservableSupplier<BookmarkBridge> bookmarkBridgeSupplier,
ObservableSupplier<BookmarkBridge> bookmarkBridgeSupplier, Verifier verifier,
@CustomTabsUiType final int uiType, List<String> menuEntries, boolean isOpenedByChrome,
boolean showShare, boolean showStar, boolean showDownload, boolean isIncognito) {
super(context, activityTabProvider, multiWindowModeStateDispatcher, tabModelSelector,
toolbarManager, decorView, null, bookmarkBridgeSupplier);
mVerifier = verifier;
mUiType = uiType;
mMenuEntries = menuEntries;
mIsOpenedByChrome = isOpenedByChrome;
......@@ -93,6 +96,8 @@ public class CustomTabAppMenuPropertiesDelegate extends AppMenuPropertiesDelegat
public void prepareMenu(Menu menu, AppMenuHandler handler) {
Tab currentTab = mActivityTabProvider.get();
if (currentTab != null) {
String url = currentTab.getUrlString();
MenuItem forwardMenuItem = menu.findItem(R.id.forward_menu_id);
forwardMenuItem.setEnabled(currentTab.canGoForward());
......@@ -147,7 +152,9 @@ public class CustomTabAppMenuPropertiesDelegate extends AppMenuPropertiesDelegat
menu.findItem(R.id.reader_mode_prefs_id).setVisible(true);
} else if (mUiType == CustomTabsUiType.MINIMAL_UI_WEBAPP) {
requestDesktopSiteVisible = false;
addToHomeScreenVisible = false;
// For Webapps & WebAPKs Verifier#wasPreviouslyVerified() performs verification
// (instead of looking up cached value).
addToHomeScreenVisible = !mVerifier.wasPreviouslyVerified(url);
downloadItemVisible = false;
bookmarkItemVisible = false;
} else if (mUiType == CustomTabsUiType.OFFLINE_PAGE) {
......@@ -169,7 +176,6 @@ public class CustomTabAppMenuPropertiesDelegate extends AppMenuPropertiesDelegat
addToHomeScreenVisible = false;
}
String url = currentTab.getUrlString();
boolean isChromeScheme = url.startsWith(UrlConstants.CHROME_URL_PREFIX)
|| url.startsWith(UrlConstants.CHROME_NATIVE_URL_PREFIX);
if (isChromeScheme || TextUtils.isEmpty(url)) {
......
......@@ -24,6 +24,7 @@ import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.ShortcutHelper;
import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
import org.chromium.chrome.browser.browserservices.ui.controller.Verifier;
import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabCoordinator;
import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator;
import org.chromium.chrome.browser.contextmenu.ContextMenuPopulator;
......@@ -82,7 +83,7 @@ public class CustomTabDelegateFactory implements TabDelegateFactory {
private static final String TAG = "customtabs";
private final String mClientPackageName;
private final ExternalAuthUtils mExternalAuthUtils;
private final ExternalIntentsPolicyProvider mExternalIntentsPolicyProvider;
private final Verifier mVerifier;
private final @ActivityType int mActivityType;
private boolean mHasActivityStarted;
......@@ -90,13 +91,12 @@ public class CustomTabDelegateFactory implements TabDelegateFactory {
/**
* Constructs a new instance of {@link CustomTabNavigationDelegate}.
*/
CustomTabNavigationDelegate(Tab tab, ExternalAuthUtils authUtils,
ExternalIntentsPolicyProvider externalIntentsPolicyProvider,
CustomTabNavigationDelegate(Tab tab, ExternalAuthUtils authUtils, Verifier verifier,
@ActivityType int activityType) {
super(tab);
mClientPackageName = TabAssociatedApp.from(tab).getAppId();
mExternalAuthUtils = authUtils;
mExternalIntentsPolicyProvider = externalIntentsPolicyProvider;
mVerifier = verifier;
mActivityType = activityType;
}
......@@ -183,7 +183,7 @@ public class CustomTabDelegateFactory implements TabDelegateFactory {
public boolean shouldDisableExternalIntentRequestsForUrl(String url) {
// http://crbug.com/647569 : Do not forward URL requests to external intents for URLs
// within the Webapp/TWA's scope.
return mExternalIntentsPolicyProvider.shouldIgnoreExternalIntentHandlers(url);
return mVerifier.shouldIgnoreExternalIntentHandlers(url);
}
}
......@@ -339,7 +339,7 @@ public class CustomTabDelegateFactory implements TabDelegateFactory {
private final ExternalAuthUtils mExternalAuthUtils;
private final MultiWindowUtils mMultiWindowUtils;
private final PendingIntent mFocusIntent;
private ExternalIntentsPolicyProvider mExternalIntentsPolicyProvider;
private final Verifier mVerifier;
private TabWebContentsDelegateAndroid mWebContentsDelegateAndroid;
private ExternalNavigationDelegateImpl mNavigationDelegate;
......@@ -358,8 +358,7 @@ public class CustomTabDelegateFactory implements TabDelegateFactory {
* @param authUtils To determine whether apps are Google signed.
* @param multiWindowUtils To use to determine which ChromeTabbedActivity to open new tabs in.
* @param focusIntent A PendingIntent to launch to focus the client.
* @param externalIntentsPolicyProvider A provider of {@link ExternalIntentPolicy} that decides
* how to handle navigation to a new URL.
* @param verifier Decides how to handle navigation to a new URL.
* @param ephemeralTabCoordinatorSupplier A provider of {@link EphemeralTabCoordinator} that
* shows preview tab.
*/
......@@ -368,8 +367,7 @@ public class CustomTabDelegateFactory implements TabDelegateFactory {
@WebDisplayMode int displayMode, boolean shouldEnableEmbeddedMediaExperience,
BrowserControlsVisibilityDelegate visibilityDelegate, ExternalAuthUtils authUtils,
MultiWindowUtils multiWindowUtils, @Nullable PendingIntent focusIntent,
ExternalIntentsPolicyProvider externalIntentsPolicyProvider,
Supplier<EphemeralTabCoordinator> ephemeralTabCoordinatorSupplier) {
Verifier verifier, Supplier<EphemeralTabCoordinator> ephemeralTabCoordinatorSupplier) {
mActivity = activity;
mShouldHideBrowserControls = shouldHideBrowserControls;
mIsOpenedByChrome = isOpenedByChrome;
......@@ -381,7 +379,7 @@ public class CustomTabDelegateFactory implements TabDelegateFactory {
mExternalAuthUtils = authUtils;
mMultiWindowUtils = multiWindowUtils;
mFocusIntent = focusIntent;
mExternalIntentsPolicyProvider = externalIntentsPolicyProvider;
mVerifier = verifier;
mEphemeralTabCoordinatorSupplier = ephemeralTabCoordinatorSupplier;
}
......@@ -389,15 +387,14 @@ public class CustomTabDelegateFactory implements TabDelegateFactory {
public CustomTabDelegateFactory(ChromeActivity<?> activity,
BrowserServicesIntentDataProvider intentDataProvider,
CustomTabBrowserControlsVisibilityDelegate visibilityDelegate,
ExternalAuthUtils authUtils, MultiWindowUtils multiWindowUtils,
ExternalIntentsPolicyProvider externalIntentsPolicyProvider,
ExternalAuthUtils authUtils, MultiWindowUtils multiWindowUtils, Verifier verifier,
Supplier<EphemeralTabCoordinator> ephemeralTabCoordinatorSupplier) {
this(activity, intentDataProvider.shouldEnableUrlBarHiding(),
intentDataProvider.isOpenedByChrome(), getWebApkScopeUrl(intentDataProvider),
getDisplayMode(intentDataProvider),
intentDataProvider.shouldEnableEmbeddedMediaExperience(), visibilityDelegate,
authUtils, multiWindowUtils, intentDataProvider.getFocusIntent(),
externalIntentsPolicyProvider, ephemeralTabCoordinatorSupplier);
authUtils, multiWindowUtils, intentDataProvider.getFocusIntent(), verifier,
ephemeralTabCoordinatorSupplier);
}
/**
......@@ -447,7 +444,7 @@ public class CustomTabDelegateFactory implements TabDelegateFactory {
mNavigationDelegate = new ExternalNavigationDelegateImpl(tab);
} else {
mNavigationDelegate = new CustomTabNavigationDelegate(
tab, mExternalAuthUtils, mExternalIntentsPolicyProvider, mActivityType);
tab, mExternalAuthUtils, mVerifier, mActivityType);
}
return new ExternalNavigationHandler(mNavigationDelegate);
}
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.customtabs;
import org.chromium.chrome.browser.dependency_injection.ActivityScope;
import javax.inject.Inject;
import androidx.annotation.Nullable;
/**
* This class is used to decide whether a navigation to a certain URL should be kept within Chrome
* (as opposed to considering Android Apps that can handle it).
*/
@ActivityScope
public class ExternalIntentsPolicyProvider {
@Nullable private PolicyCriteria mPolicyCriteria;
@Inject
ExternalIntentsPolicyProvider() {}
/**
* An interface that allows specifying whether a navigation to a given url should be kept within
* Chrome.
*/
public interface PolicyCriteria {
/** Whether a navigation to the given url should be kept within Chrome. */
boolean shouldIgnoreExternalIntentHandlers(String url);
}
public void setPolicyCriteria(PolicyCriteria criteria) {
assert mPolicyCriteria == null
: "ExternalIntentsPolicyProvider can't handle multiple policies";
mPolicyCriteria = criteria;
}
boolean shouldIgnoreExternalIntentHandlers(String url) {
return mPolicyCriteria != null && mPolicyCriteria.shouldIgnoreExternalIntentHandlers(url);
}
}
......@@ -6,6 +6,7 @@ package org.chromium.chrome.browser.customtabs.dependency_injection;
import org.chromium.chrome.browser.browserservices.trustedwebactivityui.TwaFinishHandler;
import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.CurrentPageVerifier;
import org.chromium.chrome.browser.browserservices.ui.controller.Verifier;
import org.chromium.chrome.browser.customtabs.CustomTabCompositorContentInitializer;
import org.chromium.chrome.browser.customtabs.CustomTabDelegateFactory;
import org.chromium.chrome.browser.customtabs.CustomTabStatusBarColorProvider;
......@@ -42,6 +43,7 @@ public interface BaseCustomTabActivityComponent extends ChromeActivityComponent
TwaFinishHandler resolveTwaFinishHandler();
WebappActivityCoordinator resolveWebappActivityCoordinator();
WebApkActivityCoordinator resolveWebApkActivityCoordinator();
Verifier resolveVerifier();
// For testing
SplashController resolveSplashController();
......
......@@ -7,7 +7,8 @@ package org.chromium.chrome.browser.customtabs.dependency_injection;
import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
import org.chromium.chrome.browser.browserservices.trustedwebactivityui.TwaIntentHandlingStrategy;
import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.TwaVerifier;
import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.Verifier;
import org.chromium.chrome.browser.browserservices.ui.controller.EmptyVerifier;
import org.chromium.chrome.browser.browserservices.ui.controller.Verifier;
import org.chromium.chrome.browser.customtabs.CustomTabNightModeStateController;
import org.chromium.chrome.browser.customtabs.content.CustomTabIntentHandler.IntentIgnoringCriterion;
import org.chromium.chrome.browser.customtabs.content.CustomTabIntentHandlingStrategy;
......@@ -67,14 +68,18 @@ public class BaseCustomTabActivityModule {
@Provides
public Verifier provideVerifier(Lazy<WebApkVerifier> webApkVerifier,
Lazy<AddToHomescreenVerifier> addToHomescreenVerifier, Lazy<TwaVerifier> twaVerifier) {
if (mActivityType == ActivityType.WEB_APK) {
return webApkVerifier.get();
Lazy<AddToHomescreenVerifier> addToHomescreenVerifier, Lazy<TwaVerifier> twaVerifier,
Lazy<EmptyVerifier> emptyVerifier) {
switch (mActivityType) {
case ActivityType.WEB_APK:
return webApkVerifier.get();
case ActivityType.WEBAPP:
return addToHomescreenVerifier.get();
case ActivityType.TRUSTED_WEB_ACTIVITY:
return twaVerifier.get();
default:
return emptyVerifier.get();
}
if (mActivityType == ActivityType.WEBAPP) {
return addToHomescreenVerifier.get();
}
return twaVerifier.get();
}
@Provides
......
......@@ -16,19 +16,14 @@ import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeApplication;
import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider.CustomTabsUiType;
import org.chromium.chrome.browser.customtabs.BaseCustomTabActivity;
import org.chromium.chrome.browser.customtabs.CustomTabAppMenuPropertiesDelegate;
import org.chromium.chrome.browser.customtabs.content.CustomTabIntentHandler.IntentIgnoringCriterion;
import org.chromium.chrome.browser.customtabs.content.TabObserverRegistrar;
import org.chromium.chrome.browser.customtabs.dependency_injection.BaseCustomTabActivityModule;
import org.chromium.chrome.browser.dependency_injection.ChromeActivityCommonsModule;
import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate;
import org.chromium.chrome.browser.webapps.dependency_injection.WebappActivityComponent;
import org.chromium.webapk.lib.common.WebApkConstants;
import java.util.ArrayList;
/**
* Displays a webapp in a nearly UI-less Chrome (InfoBars still appear).
*/
......@@ -99,17 +94,6 @@ public class WebappActivity extends BaseCustomTabActivity<WebappActivityComponen
getFullscreenManager().exitPersistentFullscreenMode();
}
@Override
public AppMenuPropertiesDelegate createAppMenuPropertiesDelegate() {
return new CustomTabAppMenuPropertiesDelegate(this, getActivityTabProvider(),
getMultiWindowModeStateDispatcher(), getTabModelSelector(), getToolbarManager(),
getWindow().getDecorView(), mBookmarkBridgeSupplier,
CustomTabsUiType.MINIMAL_UI_WEBAPP, new ArrayList<String>(),
false /* is opened by Chrome */, true /* should show share */,
false /* should show star (bookmarking) */, false /* should show download */,
false /* is incognito */);
}
@Override
public boolean onMenuOrKeyboardAction(int id, boolean fromMenu) {
// Disable creating bookmark.
......
......@@ -90,6 +90,27 @@ public class WebappIntentDataProvider extends BrowserServicesIntentDataProvider
return CustomTabsIntent.SHOW_PAGE_TITLE;
}
@Override
public boolean shouldShowShareMenuItem() {
return true;
}
@Override
@CustomTabsUiType
public int getUiType() {
return CustomTabsUiType.MINIMAL_UI_WEBAPP;
}
@Override
public boolean shouldShowStarButton() {
return false;
}
@Override
public boolean shouldShowDownloadButton() {
return false;
}
@Override
@Nullable
public ShareData getShareData() {
......
......@@ -7,7 +7,7 @@ package org.chromium.chrome.browser.webapps;
import androidx.annotation.Nullable;
import org.chromium.base.Promise;
import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.Verifier;
import org.chromium.chrome.browser.browserservices.ui.controller.Verifier;
/**
* Contains common implementation between {@link AddToHomescreenVerifier} and
......
......@@ -5,6 +5,7 @@
package org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller;
import org.chromium.base.Promise;
import org.chromium.chrome.browser.browserservices.ui.controller.Verifier;
import org.chromium.components.embedder_support.util.Origin;
import java.util.HashMap;
......
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