// Copyright 2015 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.externalnav; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabRedirectHandler; /** * A container object for passing navigation parameters to {@link ExternalNavigationHandler}. */ public class ExternalNavigationParams { /** The URL which we are navigating to. */ private final String mUrl; /** Whether we are currently in an incognito context. */ private final boolean mIsIncognito; /** The referrer URL for the current navigation. */ private final String mReferrerUrl; /** The page transition type for the current navigation. */ private final int mPageTransition; /** Whether the current navigation is a redirect. */ private final boolean mIsRedirect; /** Whether Chrome has to be in foreground for external navigation to occur. */ private final boolean mApplicationMustBeInForeground; /** A redirect handler. */ private final TabRedirectHandler mRedirectHandler; private final Tab mTab; /** Whether the intent should force a new tab to open. */ private final boolean mOpenInNewTab; /** Whether this navigation happens in background tab. */ private final boolean mIsBackgroundTabNavigation; /** Whether this navigation happens in main frame. */ private final boolean mIsMainFrame; /** * The package name of the WebAPK that the navigation happens in. Null if the navigation is not * happening in a WebAPK. */ private final String mWebApkPackageName; /** Whether this navigation is launched by user gesture. */ private final boolean mHasUserGesture; /** * Whether the current tab should be closed when an URL load was overridden and an * intent launched. */ private final boolean mShouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent; private ExternalNavigationParams(String url, boolean isIncognito, String referrerUrl, int pageTransition, boolean isRedirect, boolean appMustBeInForeground, TabRedirectHandler redirectHandler, Tab tab, boolean openInNewTab, boolean isBackgroundTabNavigation, boolean isMainFrame, String webApkPackageName, boolean hasUserGesture, boolean shouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent) { mUrl = url; mIsIncognito = isIncognito; mPageTransition = pageTransition; mReferrerUrl = referrerUrl; mIsRedirect = isRedirect; mApplicationMustBeInForeground = appMustBeInForeground; mRedirectHandler = redirectHandler; mTab = tab; mOpenInNewTab = openInNewTab; mIsBackgroundTabNavigation = isBackgroundTabNavigation; mIsMainFrame = isMainFrame; mWebApkPackageName = webApkPackageName; mHasUserGesture = hasUserGesture; mShouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent = shouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent; } /** @return The URL to potentially open externally. */ public String getUrl() { return mUrl; } /** @return Whether we are currently in incognito mode. */ public boolean isIncognito() { return mIsIncognito; } /** @return The referrer URL. */ public String getReferrerUrl() { return mReferrerUrl; } /** @return The page transition for the current navigation. */ public int getPageTransition() { return mPageTransition; } /** @return Whether the navigation is part of a redirect. */ public boolean isRedirect() { return mIsRedirect; } /** @return Whether the application has to be in foreground to open the URL. */ public boolean isApplicationMustBeInForeground() { return mApplicationMustBeInForeground; } /** @return The redirect handler. */ public TabRedirectHandler getRedirectHandler() { return mRedirectHandler; } /** @return The current tab. */ public Tab getTab() { return mTab; } /** * @return Whether the external navigation should be opened in a new tab if handled by Chrome * through the intent picker. */ public boolean isOpenInNewTab() { return mOpenInNewTab; } /** @return Whether this navigation happens in background tab. */ public boolean isBackgroundTabNavigation() { return mIsBackgroundTabNavigation; } /** @return Whether this navigation happens in main frame. */ public boolean isMainFrame() { return mIsMainFrame; } /** * @return Package name of the WebAPK that the navigation happens in. Null if the navigation is * not happening in a WebAPK. */ public String webApkPackageName() { return mWebApkPackageName; } /** @return Whether this navigation is launched by user gesture. */ public boolean hasUserGesture() { return mHasUserGesture; } /** * @return Whether the current tab should be closed when an URL load was overridden and an * intent launched. */ public boolean shouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent() { return mShouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent; } /** The builder for {@link ExternalNavigationParams} objects. */ public static class Builder { /** The URL which we are navigating to. */ private String mUrl; /** Whether we are currently in an incognito context. */ private boolean mIsIncognito; /** The referrer URL for the current navigation. */ private String mReferrerUrl; /** The page transition type for the current navigation. */ private int mPageTransition; /** Whether the current navigation is a redirect. */ private boolean mIsRedirect; /** Whether Chrome has to be in foreground for external navigation to occur. */ private boolean mApplicationMustBeInForeground; /** A redirect handler. */ private TabRedirectHandler mRedirectHandler; private Tab mTab; /** Whether the intent should force a new tab to open. */ private boolean mOpenInNewTab; /** Whether this navigation happens in background tab. */ private boolean mIsBackgroundTabNavigation; /** Whether this navigation happens in main frame. */ private boolean mIsMainFrame; /** * The package name of the WebAPK that the navigation happens in. Null if the navigation is * not happening in a WebAPK. */ private String mWebApkPackageName; /** Whether this navigation is launched by user gesture. */ private boolean mHasUserGesture; /** * Whether the current tab should be closed when an URL load was overridden and an * intent launched. */ private boolean mShouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent; public Builder(String url, boolean isIncognito) { mUrl = url; mIsIncognito = isIncognito; } public Builder(String url, boolean isIncognito, String referrer, int pageTransition, boolean isRedirect) { mUrl = url; mIsIncognito = isIncognito; mReferrerUrl = referrer; mPageTransition = pageTransition; mIsRedirect = isRedirect; } /** Specify whether the application must be in foreground to launch an external intent. */ public Builder setApplicationMustBeInForeground(boolean v) { mApplicationMustBeInForeground = v; return this; } /** Sets a tab redirect handler. */ public Builder setRedirectHandler(TabRedirectHandler handler) { mRedirectHandler = handler; return this; } /** Sets the current tab. */ public Builder setTab(Tab tab) { mTab = tab; return this; } /** Sets whether we want to open the intent URL in new tab, if handled by Chrome. */ public Builder setOpenInNewTab(boolean v) { mOpenInNewTab = v; return this; } /** Sets whether this navigation happens in background tab. */ public Builder setIsBackgroundTabNavigation(boolean v) { mIsBackgroundTabNavigation = v; return this; } /** Sets whether this navigation happens in main frame. */ public Builder setIsMainFrame(boolean v) { mIsMainFrame = v; return this; } /** * Sets the package name of the WebAPK that the navigation happens in. Null if the * navigation is not happening in a WebAPK. */ public Builder setWebApkPackageName(String v) { mWebApkPackageName = v; return this; } /** Sets whether this navigation happens in main frame. */ public Builder setHasUserGesture(boolean v) { mHasUserGesture = v; return this; } /** Sets whether the current tab should be closed when an URL load was overridden and an * intent launched. */ public Builder setShouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent(boolean v) { mShouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent = v; return this; } /** @return A fully constructed {@link ExternalNavigationParams} object. */ public ExternalNavigationParams build() { return new ExternalNavigationParams(mUrl, mIsIncognito, mReferrerUrl, mPageTransition, mIsRedirect, mApplicationMustBeInForeground, mRedirectHandler, mTab, mOpenInNewTab, mIsBackgroundTabNavigation, mIsMainFrame, mWebApkPackageName, mHasUserGesture, mShouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent); } } }