Commit b215364a authored by Jinsuk Kim's avatar Jinsuk Kim Committed by Commit Bot

PreviewTab: Move EphemeralTabCoordiator to TabbedRootUiCoordiator

This CL moves EphemeralTabCoordinator field from ChromeActivity
to TabbedRootUiCoordinator since it is UI a component for tabbed
mode only. This aims to make the code structure better by
slimming down ChromeActivity (no more getter for the object),
hence one less usage of Tab.getActivity() in
TabContextMenuItemDelegate, replaced with an injection of a
dependency through the constructor.

Bug: 1051184
Change-Id: I5856cb27030f3b7e7e17efd93a001d2e84335a71
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2102029
Commit-Queue: Jinsuk Kim <jinsukkim@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Cr-Commit-Position: refs/heads/master@{#751583}
parent ac4cdd10
......@@ -58,7 +58,6 @@ import org.chromium.chrome.browser.bookmarks.BookmarkBridge;
import org.chromium.chrome.browser.bookmarks.BookmarkModel;
import org.chromium.chrome.browser.bookmarks.BookmarkUtils;
import org.chromium.chrome.browser.compositor.CompositorViewHolder;
import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabCoordinator;
import org.chromium.chrome.browser.compositor.layouts.Layout;
import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
......@@ -262,7 +261,6 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
protected ReaderModeManager mReaderModeManager;
private SnackbarManager mSnackbarManager;
private EphemeralTabCoordinator mEphemeralTabCoordinator;
private UpdateNotificationController mUpdateNotificationController;
private StatusBarColorController mStatusBarColorController;
......@@ -1340,12 +1338,6 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
findViewById(R.id.keyboard_accessory_stub),
findViewById(R.id.keyboard_accessory_sheet_stub));
if (EphemeralTabCoordinator.isSupported()) {
mEphemeralTabCoordinator = new EphemeralTabCoordinator(this, getWindowAndroid(),
getWindow().getDecorView(), getActivityTabProvider(),
this::getCurrentTabCreator, getBottomSheetController(), () -> !isCustomTab());
}
if (ChromeFeatureList.isEnabled(ChromeFeatureList.ANDROID_NIGHT_MODE_TAB_REPARENTING)) {
mNightModeReparentingController = new NightModeReparentingController(
ReparentingDelegateFactory.createNightModeReparentingControllerDelegate(
......@@ -1506,8 +1498,8 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
}
public TabDelegateFactory getTabDelegateFactory() {
return new TabbedModeTabDelegateFactory(
this, new ComposedBrowserControlsVisibilityDelegate(), getShareDelegateSupplier());
return new TabbedModeTabDelegateFactory(this,
new ComposedBrowserControlsVisibilityDelegate(), getShareDelegateSupplier(), null);
}
/**
......@@ -1642,13 +1634,6 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
return mContextualSearchManager;
}
/**
* @return The {@code EphemeralTabCoordinator}.
*/
public EphemeralTabCoordinator getEphemeralTabCoordinator() {
return mEphemeralTabCoordinator;
}
/**
* @return The {@code ReaderModeManager} or {@code null} if none;
*/
......
......@@ -54,6 +54,7 @@ import org.chromium.chrome.browser.IntentHandler.TabOpenType;
import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout;
import org.chromium.chrome.browser.bookmarks.BookmarkUtils;
import org.chromium.chrome.browser.compositor.CompositorViewHolder;
import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabCoordinator;
import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver;
import org.chromium.chrome.browser.compositor.layouts.Layout;
import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
......@@ -282,6 +283,9 @@ public class ChromeTabbedActivity
private OverviewModeBehavior.OverviewModeObserver mOverviewModeObserver;
private ObservableSupplierImpl<EphemeralTabCoordinator> mEphemeralTabCoordinatorSupplier =
new ObservableSupplierImpl<>();
private final IncognitoTabHost mIncognitoTabHost = new IncognitoTabHost() {
@Override
......@@ -1481,7 +1485,8 @@ public class ChromeTabbedActivity
@Override
protected RootUiCoordinator createRootUiCoordinator() {
return new TabbedRootUiCoordinator(this, this::onOmniboxFocusChanged, mIntentWithEffect,
getShareDelegateSupplier(), getActivityTabProvider());
getShareDelegateSupplier(), getActivityTabProvider(),
mEphemeralTabCoordinatorSupplier);
}
@Override
......@@ -1579,8 +1584,8 @@ public class ChromeTabbedActivity
@Override
protected Pair<ChromeTabCreator, ChromeTabCreator> createTabCreators() {
Supplier<TabDelegateFactory> tabDelegateFactorySupplier = () -> {
return new TabbedModeTabDelegateFactory(
this, getAppBrowserControlsVisibilityDelegate(), getShareDelegateSupplier());
return new TabbedModeTabDelegateFactory(this, getAppBrowserControlsVisibilityDelegate(),
getShareDelegateSupplier(), mEphemeralTabCoordinatorSupplier);
};
ChromeTabCreator.OverviewNTPCreator overviewNTPCreator = null;
......
......@@ -5,6 +5,7 @@
package org.chromium.chrome.browser;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabCoordinator;
import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator;
import org.chromium.chrome.browser.contextmenu.ContextMenuPopulator;
import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
......@@ -28,13 +29,16 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory {
private final ChromeActivity mActivity;
private final BrowserControlsVisibilityDelegate mAppBrowserControlsVisibilityDelegate;
private final Supplier<ShareDelegate> mShareDelegateSupplier;
private final Supplier<EphemeralTabCoordinator> mEphemeralTabCoordinatorSupplier;
public TabbedModeTabDelegateFactory(ChromeActivity activity,
BrowserControlsVisibilityDelegate appBrowserControlsVisibilityDelegate,
Supplier<ShareDelegate> shareDelegateSupplier) {
Supplier<ShareDelegate> shareDelegateSupplier,
Supplier<EphemeralTabCoordinator> ephemeralTabCoordinatorSupplier) {
mActivity = activity;
mAppBrowserControlsVisibilityDelegate = appBrowserControlsVisibilityDelegate;
mShareDelegateSupplier = shareDelegateSupplier;
mEphemeralTabCoordinatorSupplier = ephemeralTabCoordinatorSupplier;
}
@Override
......@@ -49,7 +53,8 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory {
@Override
public ContextMenuPopulator createContextMenuPopulator(Tab tab) {
return new ChromeContextMenuPopulator(new TabContextMenuItemDelegate(tab),
return new ChromeContextMenuPopulator(
new TabContextMenuItemDelegate(tab, mEphemeralTabCoordinatorSupplier),
mShareDelegateSupplier, ChromeContextMenuPopulator.ContextMenuMode.NORMAL,
ExternalAuthUtils.getInstance());
}
......
......@@ -479,7 +479,7 @@ public class CustomTabDelegateFactory implements TabDelegateFactory {
int contextMenuMode = getContextMenuMode(mActivityType);
Supplier<ShareDelegate> shareDelegateSupplier =
mActivity == null ? null : mActivity.getShareDelegateSupplier();
return new ChromeContextMenuPopulator(new TabContextMenuItemDelegate(tab),
return new ChromeContextMenuPopulator(new TabContextMenuItemDelegate(tab, null),
shareDelegateSupplier, contextMenuMode, ExternalAuthUtils.getInstance());
}
......
......@@ -3,6 +3,7 @@ include_rules = [
"+chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java",
"+chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java",
"+chrome/android/java/src/org/chromium/chrome/browser/TabHidingType.java",
"+chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java",
"+chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoUtils.java",
"+chrome/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewTabHelper.java",
"+chrome/android/java/src/org/chromium/chrome/browser/previews/Previews.java",
......
......@@ -17,12 +17,13 @@ import org.chromium.base.ContextUtils;
import org.chromium.base.IntentUtils;
import org.chromium.base.PackageManagerUtils;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.browser.DefaultBrowserInfo;
import org.chromium.chrome.browser.IntentHandler;
import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabCoordinator;
import org.chromium.chrome.browser.contextmenu.ContextMenuItemDelegate;
import org.chromium.chrome.browser.document.ChromeLauncherActivity;
import org.chromium.chrome.browser.download.ChromeDownloadDelegate;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.incognito.IncognitoUtils;
import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
......@@ -46,12 +47,16 @@ public class TabContextMenuItemDelegate implements ContextMenuItemDelegate {
private final TabImpl mTab;
private boolean mLoadOriginalImageRequestedForPageLoad;
private EmptyTabObserver mDataReductionProxyContextMenuTabObserver;
private final Supplier<EphemeralTabCoordinator> mEphemeralTabCoordinatorSupplier;
/**
* Builds a {@link TabContextMenuItemDelegate} instance.
*/
public TabContextMenuItemDelegate(Tab tab) {
public TabContextMenuItemDelegate(
Tab tab, Supplier<EphemeralTabCoordinator> ephemeralTabCoordinatorSupplier) {
mTab = (TabImpl) tab;
mEphemeralTabCoordinatorSupplier = ephemeralTabCoordinatorSupplier;
mDataReductionProxyContextMenuTabObserver = new EmptyTabObserver() {
@Override
public void onPageLoadStarted(Tab tab, String url) {
......@@ -236,10 +241,11 @@ public class TabContextMenuItemDelegate implements ContextMenuItemDelegate {
@Override
public void onOpenInEphemeralTab(String url, String title) {
if (ChromeFeatureList.isEnabled(ChromeFeatureList.EPHEMERAL_TAB_USING_BOTTOM_SHEET)) {
mTab.getActivity().getEphemeralTabCoordinator().requestOpenSheet(
url, title, mTab.isIncognito());
if (mEphemeralTabCoordinatorSupplier == null
|| mEphemeralTabCoordinatorSupplier.get() == null) {
return;
}
mEphemeralTabCoordinatorSupplier.get().requestOpenSheet(url, title, mTab.isIncognito());
}
@Override
......
......@@ -13,12 +13,14 @@ import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.Callback;
import org.chromium.base.TraceEvent;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.base.supplier.Supplier;
import org.chromium.base.task.PostTask;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabCoordinator;
import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
import org.chromium.chrome.browser.datareduction.DataReductionPromoScreen;
import org.chromium.chrome.browser.firstrun.FirstRunStatus;
......@@ -65,6 +67,7 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator implements Native
private ConnectivityDetector mConnectivityDetector;
private @Nullable ToolbarButtonInProductHelpController mToolbarButtonInProductHelpController;
private boolean mIntentWithEffect;
private ObservableSupplierImpl<EphemeralTabCoordinator> mEphemeralTabCoordinatorSupplier;
/**
* Construct a new TabbedRootUiCoordinator.
......@@ -79,9 +82,11 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator implements Native
public TabbedRootUiCoordinator(ChromeActivity activity,
Callback<Boolean> onOmniboxFocusChangedListener, boolean intentWithEffect,
ObservableSupplier<ShareDelegate> shareDelegateSupplier,
ActivityTabProvider tabProvider) {
ActivityTabProvider tabProvider,
ObservableSupplierImpl<EphemeralTabCoordinator> ephemeralTabCoordinatorSupplier) {
super(activity, onOmniboxFocusChangedListener, shareDelegateSupplier, tabProvider);
mIntentWithEffect = intentWithEffect;
mEphemeralTabCoordinatorSupplier = ephemeralTabCoordinatorSupplier;
}
@Override
......@@ -118,6 +123,15 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator implements Native
}
}
@Override
protected void onFindToolbarShown() {
super.onFindToolbarShown();
if (mEphemeralTabCoordinatorSupplier != null
&& mEphemeralTabCoordinatorSupplier.get().isOpened()) {
mEphemeralTabCoordinatorSupplier.get().close();
}
}
/**
* @return The toolbar button IPH controller for the tabbed UI this coordinator controls.
* TODO(pnoland, https://crbug.com/865801): remove this in favor of wiring it directly.
......@@ -139,6 +153,13 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator implements Native
mEmptyBackgroundViewWrapper.initialize();
}
if (EphemeralTabCoordinator.isSupported()) {
mEphemeralTabCoordinatorSupplier.set(new EphemeralTabCoordinator(mActivity,
mActivity.getWindowAndroid(), mActivity.getWindow().getDecorView(),
mActivity.getActivityTabProvider(), mActivity::getCurrentTabCreator,
mActivity.getBottomSheetController(), () -> !mActivity.isCustomTab()));
}
PostTask.postTask(UiThreadTaskTraits.DEFAULT, this::initializeIPH);
}
......
......@@ -485,14 +485,7 @@ public class RootUiCoordinator
mFindToolbarObserver = new FindToolbarObserver() {
@Override
public void onFindToolbarShown() {
if (mActivity.getContextualSearchManager() != null) {
mActivity.getContextualSearchManager().hideContextualSearch(
OverlayPanel.StateChangeReason.UNKNOWN);
}
if (mActivity.getEphemeralTabCoordinator() != null
&& mActivity.getEphemeralTabCoordinator().isOpened()) {
mActivity.getEphemeralTabCoordinator().close();
}
RootUiCoordinator.this.onFindToolbarShown();
}
@Override
......@@ -504,6 +497,17 @@ public class RootUiCoordinator
mActivity.getToolbarManager().setFindToolbarManager(mFindToolbarManager);
}
/**
* Called when the find in page toolbar is shown. Sub-classes may override to manage
* cross-feature interaction, e.g. hide other features when this feature is shown.
*/
protected void onFindToolbarShown() {
if (mActivity.getContextualSearchManager() != null) {
mActivity.getContextualSearchManager().hideContextualSearch(
OverlayPanel.StateChangeReason.UNKNOWN);
}
}
/**
* Initialize the {@link BottomSheetController}. The view for this component is not created
* until content is requested in the sheet.
......
......@@ -76,7 +76,7 @@ public class TabUmaTest {
BrowserControlsVisibilityDelegate visibilityDelegate =
new BrowserControlsVisibilityDelegate(BrowserControlsState.BOTH) {};
return new TabbedModeTabDelegateFactory(mActivityTestRule.getActivity(), visibilityDelegate,
new ObservableSupplierImpl<ShareDelegate>());
new ObservableSupplierImpl<ShareDelegate>(), null);
}
private Tab createLazilyLoadedTab(boolean show) throws ExecutionException {
......
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