Commit 22394cdc authored by Mia Glaese's avatar Mia Glaese Committed by Commit Bot

[Start Surface] Move logic to show Start Surface for NTP to Tabcreator

TabCreator:
-selects TabModel and shows StartSurface HomePage instead of launching NTP if applicable.

ChromeTabbedActivity:
-restores active tab if StartSurface is shown on start and not incognito.
-InternalIntentDelegate and shouldShowTabSwitcherOnStart updated

StartSurfaceMediator:
-trigger tabswitcher update when active tab is restored to load tab carousel

Change-Id: I45809c1cd604bd035c008375c1b68a2aba8ba715
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2032038
Commit-Queue: Mia Glaese <glamia@chromium.org>
Reviewed-by: default avatarYusuf Ozuysal <yusufo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#743594}
parent c3390f00
...@@ -204,6 +204,16 @@ class StartSurfaceMediator ...@@ -204,6 +204,16 @@ class StartSurfaceMediator
setTabCarouselVisibility(true); setTabCarouselVisibility(true);
} }
} }
@Override
public void restoreCompleted() {
if (!(mPropertyModel.get(IS_SHOWING_OVERVIEW)
&& mOverviewModeState == OverviewModeState.SHOWN_HOMEPAGE)) {
return;
}
setTabCarouselVisibility(
mTabModelSelector.getModel(false).getCount() > 0 && !mIsIncognito);
}
}; };
mFullScreenListener = new ChromeFullscreenManager.FullscreenListener() { mFullScreenListener = new ChromeFullscreenManager.FullscreenListener() {
......
...@@ -668,16 +668,10 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit ...@@ -668,16 +668,10 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit
} }
}; };
OnClickListener newTabClickHandler = v -> { OnClickListener newTabClickHandler = v -> {
// If Start Surface should be shown as the home page, show the start surface home getTabModelSelector().getModel(false).commitAllTabClosures();
// page. // This assumes that the keyboard can not be seen at the same time as the
if (ReturnToChromeExperimentsUtil.shouldShowStartSurfaceAsTheHomePage()) { // newtab button on the toolbar.
showOverview(OverviewModeState.SHOWING_HOMEPAGE); getCurrentTabCreator().launchNTP();
} else {
getTabModelSelector().getModel(false).commitAllTabClosures();
// This assumes that the keyboard can not be seen at the same time as the
// newtab button on the toolbar.
getCurrentTabCreator().launchNTP();
}
mLocaleManager.showSearchEnginePromoIfNeeded(ChromeTabbedActivity.this, null); mLocaleManager.showSearchEnginePromoIfNeeded(ChromeTabbedActivity.this, null);
if (getTabModelSelector().isIncognitoSelected()) { if (getTabModelSelector().isIncognitoSelected()) {
RecordUserAction.record("MobileToolbarStackViewNewIncognitoTab"); RecordUserAction.record("MobileToolbarStackViewNewIncognitoTab");
...@@ -697,7 +691,6 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit ...@@ -697,7 +691,6 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit
Supplier<Boolean> showStartSurfaceSupplier = () -> { Supplier<Boolean> showStartSurfaceSupplier = () -> {
if (ReturnToChromeExperimentsUtil.shouldShowStartSurfaceAsTheHomePage() if (ReturnToChromeExperimentsUtil.shouldShowStartSurfaceAsTheHomePage()
&& !isTablet()) { && !isTablet()) {
assert ReturnToChromeExperimentsUtil.shouldShowStartSurfaceAsTheHomePage();
showOverview(OverviewModeState.SHOWING_HOMEPAGE); showOverview(OverviewModeState.SHOWING_HOMEPAGE);
return true; return true;
} }
...@@ -988,7 +981,6 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit ...@@ -988,7 +981,6 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit
TAB_COUNT_ON_RETURN, getCurrentTabModel().getCount()); TAB_COUNT_ON_RETURN, getCurrentTabModel().getCount());
} }
if (CachedFeatureFlags.isGridTabSwitcherEnabled() && !isTablet()) { if (CachedFeatureFlags.isGridTabSwitcherEnabled() && !isTablet()) {
assert !getCurrentTabModel().isIncognito();
mStartSurface.getController().enableRecordingFirstMeaningfulPaint( mStartSurface.getController().enableRecordingFirstMeaningfulPaint(
getOnCreateTimestampMs()); getOnCreateTimestampMs());
} }
...@@ -1006,12 +998,18 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit ...@@ -1006,12 +998,18 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit
} }
private boolean shouldShowTabSwitcherOnStart() { private boolean shouldShowTabSwitcherOnStart() {
if (!isMainIntentFromLauncher(getIntent())) return false; if (ReturnToChromeExperimentsUtil.shouldShowStartSurfaceAsTheHomePage()) {
String intentUrl = IntentHandler.getUrlFromIntent(getIntent());
if (NewTabPage.isNTPUrl(intentUrl)
|| (isMainIntentFromLauncher(getIntent())
&& (getTabModelSelector().getTotalTabCount() <= 0))) {
return true;
}
}
long lastBackgroundedTimeMillis = mInactivityTracker.getLastBackgroundedTimeMs(); long lastBackgroundedTimeMillis = mInactivityTracker.getLastBackgroundedTimeMs();
return (ReturnToChromeExperimentsUtil.shouldShowStartSurfaceAsTheHomePage() return isMainIntentFromLauncher(getIntent())
&& getTabModelSelector().getTotalTabCount() <= 0) && ReturnToChromeExperimentsUtil.shouldShowTabSwitcher(lastBackgroundedTimeMillis);
|| ReturnToChromeExperimentsUtil.shouldShowTabSwitcher(lastBackgroundedTimeMillis);
} }
private boolean isMainIntentFromLauncher(Intent intent) { private boolean isMainIntentFromLauncher(Intent intent) {
...@@ -1100,7 +1098,9 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit ...@@ -1100,7 +1098,9 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit
// We always need to try to restore tabs. The set of tabs might be empty, but at least // We always need to try to restore tabs. The set of tabs might be empty, but at least
// it will trigger the notification that tab restore is complete which is needed by // it will trigger the notification that tab restore is complete which is needed by
// other parts of Chrome such as sync. // other parts of Chrome such as sync.
boolean activeTabBeingRestored = !mIntentWithEffect; boolean activeTabBeingRestored = !mIntentWithEffect
|| (shouldShowTabSwitcherOnStart()
&& !mTabModelSelectorImpl.isIncognitoSelected());
mMainIntentMetrics.setIgnoreEvents(true); mMainIntentMetrics.setIgnoreEvents(true);
mTabModelSelectorImpl.restoreTabs(activeTabBeingRestored); mTabModelSelectorImpl.restoreTabs(activeTabBeingRestored);
...@@ -1375,7 +1375,8 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit ...@@ -1375,7 +1375,8 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit
focus ? LocationBar.OmniboxFocusReason.LAUNCH_NEW_INCOGNITO_TAB focus ? LocationBar.OmniboxFocusReason.LAUNCH_NEW_INCOGNITO_TAB
: LocationBar.OmniboxFocusReason.UNFOCUS); : LocationBar.OmniboxFocusReason.UNFOCUS);
if (tabModel.getCount() > 0 && isInOverviewMode() && !isTablet()) { if (tabModel.getCount() > 0 && isInOverviewMode() && !isTablet()
&& !shouldShowTabSwitcherOnStart()) {
mOverviewModeController.hideOverview(true); mOverviewModeController.hideOverview(true);
} }
} }
...@@ -1568,10 +1569,21 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit ...@@ -1568,10 +1569,21 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit
return new TabbedModeTabDelegateFactory( return new TabbedModeTabDelegateFactory(
this, getAppBrowserControlsVisibilityDelegate(), getShareDelegateSupplier()); this, getAppBrowserControlsVisibilityDelegate(), getShareDelegateSupplier());
}; };
ChromeTabCreator.OverviewNTPCreator overviewNTPCreator = null;
if (CachedFeatureFlags.isStartSurfaceEnabled()) {
overviewNTPCreator = new ChromeTabCreator.OverviewNTPCreator() {
@Override
public boolean handleCreateNTPIfNeeded(boolean isNTP, boolean incognito) {
return showStartSurfaceHomeForNTP(isNTP, incognito);
}
};
}
return Pair.create(new ChromeTabCreator(this, getWindowAndroid(), getStartupTabPreloader(), return Pair.create(new ChromeTabCreator(this, getWindowAndroid(), getStartupTabPreloader(),
tabDelegateFactorySupplier, false), tabDelegateFactorySupplier, false, overviewNTPCreator),
new ChromeTabCreator(this, getWindowAndroid(), getStartupTabPreloader(), new ChromeTabCreator(this, getWindowAndroid(), getStartupTabPreloader(),
tabDelegateFactorySupplier, true)); tabDelegateFactorySupplier, true, overviewNTPCreator));
} }
@Override @Override
...@@ -1623,13 +1635,7 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit ...@@ -1623,13 +1635,7 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit
reportNewTabShortcutUsed(false); reportNewTabShortcutUsed(false);
if (fromMenu) RecordUserAction.record("MobileMenuNewTab.AppMenu"); if (fromMenu) RecordUserAction.record("MobileMenuNewTab.AppMenu");
// If Start Surface should be shown as the home page, show the start surface home page. getTabCreator(false).launchNTP();
if (ReturnToChromeExperimentsUtil.shouldShowStartSurfaceAsTheHomePage()) {
getTabModelSelector().selectModel(false);
showOverview(OverviewModeState.SHOWING_HOMEPAGE);
} else {
getTabCreator(false).launchNTP();
}
mLocaleManager.showSearchEnginePromoIfNeeded(this, null); mLocaleManager.showSearchEnginePromoIfNeeded(this, null);
} else if (id == R.id.new_incognito_tab_menu_id) { } else if (id == R.id.new_incognito_tab_menu_id) {
...@@ -1641,15 +1647,7 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit ...@@ -1641,15 +1647,7 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit
RecordUserAction.record("MobileNewTabOpened"); RecordUserAction.record("MobileNewTabOpened");
reportNewTabShortcutUsed(true); reportNewTabShortcutUsed(true);
if (fromMenu) RecordUserAction.record("MobileMenuNewIncognitoTab.AppMenu"); if (fromMenu) RecordUserAction.record("MobileMenuNewIncognitoTab.AppMenu");
getTabCreator(true).launchNTP();
// If Start Surface should be shown as the home page, show the start surface home
// page.
if (ReturnToChromeExperimentsUtil.shouldShowStartSurfaceAsTheHomePage()) {
getTabModelSelector().selectModel(true);
showOverview(OverviewModeState.SHOWING_HOMEPAGE);
} else {
getTabCreator(true).launchNTP();
}
} }
} else if (id == R.id.all_bookmarks_menu_id) { } else if (id == R.id.all_bookmarks_menu_id) {
// Note that 'currentTab' could be null in overview mode when start surface is // Note that 'currentTab' could be null in overview mode when start surface is
...@@ -1969,6 +1967,16 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit ...@@ -1969,6 +1967,16 @@ public class ChromeTabbedActivity extends ChromeActivity implements Accessibilit
} }
} }
private boolean showStartSurfaceHomeForNTP(boolean isNTP, boolean incognito) {
if (isNTP && ReturnToChromeExperimentsUtil.shouldShowStartSurfaceAsTheHomePage()
&& !isTablet()) {
getTabModelSelector().selectModel(incognito);
showOverview(OverviewModeState.SHOWING_HOMEPAGE);
return true;
}
return false;
}
private void updateAccessibilityState(boolean enabled) { private void updateAccessibilityState(boolean enabled) {
Tab currentTab = getActivityTab(); Tab currentTab = getActivityTab();
WebContents webContents = currentTab != null ? currentTab.getWebContents() : null; WebContents webContents = currentTab != null ? currentTab.getWebContents() : null;
......
...@@ -87,7 +87,7 @@ public class CustomTabActivityTabFactory { ...@@ -87,7 +87,7 @@ public class CustomTabActivityTabFactory {
private ChromeTabCreator createTabCreator(boolean incognito) { private ChromeTabCreator createTabCreator(boolean incognito) {
return new ChromeTabCreator(mActivity, mActivityWindowAndroid.get(), mStartupTabPreloader, return new ChromeTabCreator(mActivity, mActivityWindowAndroid.get(), mStartupTabPreloader,
mCustomTabDelegateFactory::get, incognito); mCustomTabDelegateFactory::get, incognito, null);
} }
/** Creates a new tab for a Custom Tab activity */ /** Creates a new tab for a Custom Tab activity */
......
...@@ -17,6 +17,7 @@ import org.chromium.chrome.browser.IntentHandler; ...@@ -17,6 +17,7 @@ import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.ServiceTabLauncher; import org.chromium.chrome.browser.ServiceTabLauncher;
import org.chromium.chrome.browser.init.StartupTabPreloader; import org.chromium.chrome.browser.init.StartupTabPreloader;
import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings; import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
import org.chromium.chrome.browser.ntp.NewTabPage;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabAssociatedApp; import org.chromium.chrome.browser.tab.TabAssociatedApp;
import org.chromium.chrome.browser.tab.TabBuilder; import org.chromium.chrome.browser.tab.TabBuilder;
...@@ -40,6 +41,16 @@ import org.chromium.url.GURL; ...@@ -40,6 +41,16 @@ import org.chromium.url.GURL;
* This class creates various kinds of new tabs and adds them to the right {@link TabModel}. * This class creates various kinds of new tabs and adds them to the right {@link TabModel}.
*/ */
public class ChromeTabCreator extends TabCreatorManager.TabCreator { public class ChromeTabCreator extends TabCreatorManager.TabCreator {
/**Interface to handle showing overview instead of NTP if needed. */
public interface OverviewNTPCreator {
/**
* Handles showing the StartSurface instead of the NTP if needed.
* @param isNTPUrl Whether tab with NTP should be created.
* @param isIncognito Whether tab is created in incognito.
* @return Whether NTP creation was handled.
*/
boolean handleCreateNTPIfNeeded(boolean isNTP, boolean incognito);
}
private final ChromeActivity mActivity; private final ChromeActivity mActivity;
private final StartupTabPreloader mStartupTabPreloader; private final StartupTabPreloader mStartupTabPreloader;
...@@ -49,15 +60,19 @@ public class ChromeTabCreator extends TabCreatorManager.TabCreator { ...@@ -49,15 +60,19 @@ public class ChromeTabCreator extends TabCreatorManager.TabCreator {
private TabModel mTabModel; private TabModel mTabModel;
private TabModelOrderController mOrderController; private TabModelOrderController mOrderController;
private Supplier<TabDelegateFactory> mTabDelegateFactorySupplier; private Supplier<TabDelegateFactory> mTabDelegateFactorySupplier;
@Nullable
private OverviewNTPCreator mOverviewNTPCreator;
public ChromeTabCreator(ChromeActivity activity, WindowAndroid nativeWindow, public ChromeTabCreator(ChromeActivity activity, WindowAndroid nativeWindow,
StartupTabPreloader startupTabPreloader, StartupTabPreloader startupTabPreloader,
Supplier<TabDelegateFactory> tabDelegateFactory, boolean incognito) { Supplier<TabDelegateFactory> tabDelegateFactory, boolean incognito,
OverviewNTPCreator overviewNTPCreator) {
mActivity = activity; mActivity = activity;
mStartupTabPreloader = startupTabPreloader; mStartupTabPreloader = startupTabPreloader;
mNativeWindow = nativeWindow; mNativeWindow = nativeWindow;
mTabDelegateFactorySupplier = tabDelegateFactory; mTabDelegateFactorySupplier = tabDelegateFactory;
mIncognito = incognito; mIncognito = incognito;
mOverviewNTPCreator = overviewNTPCreator;
} }
@Override @Override
...@@ -106,6 +121,11 @@ public class ChromeTabCreator extends TabCreatorManager.TabCreator { ...@@ -106,6 +121,11 @@ public class ChromeTabCreator extends TabCreatorManager.TabCreator {
*/ */
private Tab createNewTab(LoadUrlParams loadUrlParams, @TabLaunchType int type, Tab parent, private Tab createNewTab(LoadUrlParams loadUrlParams, @TabLaunchType int type, Tab parent,
int position, Intent intent) { int position, Intent intent) {
if (mOverviewNTPCreator != null
&& mOverviewNTPCreator.handleCreateNTPIfNeeded(
NewTabPage.isNTPUrl(loadUrlParams.getUrl()), mIncognito)) {
return null;
}
try { try {
TraceEvent.begin("ChromeTabCreator.createNewTab"); TraceEvent.begin("ChromeTabCreator.createNewTab");
int parentId = parent != null ? parent.getId() : Tab.INVALID_TAB_ID; int parentId = parent != null ? parent.getId() : Tab.INVALID_TAB_ID;
......
...@@ -171,7 +171,7 @@ public class StartupTabPreloaderUnitTest { ...@@ -171,7 +171,7 @@ public class StartupTabPreloaderUnitTest {
@Override @Override
public TabCreatorManager.TabCreator getTabCreator(boolean incognito) { public TabCreatorManager.TabCreator getTabCreator(boolean incognito) {
Assert.assertFalse(incognito); Assert.assertFalse(incognito);
return new ChromeTabCreator(null, null, null, null, false); return new ChromeTabCreator(null, null, null, null, false, null);
} }
} }
......
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