Commit b84fd41e authored by Xi Han's avatar Xi Han Committed by Commit Bot

[Instant Start] Create LayoutManager with content container.

The content container which the LayoutManager is attached to has been
inflated before the LayoutManager is created. Thus, passing it to the
LayoutManager in its constructor, instead of init() method. This is
required to support stack tab switcher in instant start.

Bug: 1116449
Change-Id: I2761f51d72fdc86248934a7805c8cd27fec85bd2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2356165
Commit-Queue: Xi Han <hanxi@chromium.org>
Reviewed-by: default avatarWei-Yin Chen (陳威尹) <wychen@chromium.org>
Reviewed-by: default avatarMatthew Jones <mdjones@chromium.org>
Reviewed-by: default avatarYaron Friedman <yfriedman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#799780}
parent cf81ae39
......@@ -1713,8 +1713,8 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
mCompositorViewHolder.setBrowserControlsManager(getBrowserControlsManager());
mCompositorViewHolder.setUrlBar(urlBar);
mCompositorViewHolder.setInsetObserverView(getInsetObserverView());
mCompositorViewHolder.onFinishNativeInitialization(getTabModelSelector(), this,
getTabContentManager(), contentContainer, mContextualSearchManager);
mCompositorViewHolder.onFinishNativeInitialization(
getTabModelSelector(), this, getTabContentManager(), mContextualSearchManager);
if (controlContainer != null && DeviceClassManager.enableToolbarSwipe()
&& getCompositorViewHolder().getLayoutManager().getToolbarSwipeHandler() != null) {
......
......@@ -577,7 +577,8 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent
mRootUiCoordinator.getBottomSheetController());
}
}
mLayoutManager = new LayoutManagerChromePhone(compositorViewHolder, mStartSurface);
mLayoutManager = new LayoutManagerChromePhone(
compositorViewHolder, mContentContainer, mStartSurface);
}
}
......@@ -586,7 +587,8 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent
try (TraceEvent e = TraceEvent.scoped(
"ChromeTabbedActivity.setupCompositorContentPreNativeForTablet")) {
mLayoutManager = new LayoutManagerChromeTablet(getCompositorViewHolder());
mLayoutManager =
new LayoutManagerChromeTablet(getCompositorViewHolder(), mContentContainer);
}
}
......
......@@ -1218,17 +1218,14 @@ public class CompositorViewHolder extends FrameLayout
* represent.
* @param tabCreatorManager The {@link TabCreatorManager} for this view.
* @param tabContentManager The {@link TabContentManager} for the tabs.
* @param androidContentContainer The {@link ViewGroup} the {@link LayoutManager} should bind
* Android content to.
* @param contextualSearchManager A {@link ContextualSearchManagementDelegate} instance.
*/
public void onFinishNativeInitialization(TabModelSelector tabModelSelector,
TabCreatorManager tabCreatorManager, TabContentManager tabContentManager,
ViewGroup androidContentContainer,
ContextualSearchManagementDelegate contextualSearchManager) {
assert mLayoutManager != null && mControlContainer != null;
mLayoutManager.init(tabModelSelector, tabCreatorManager, tabContentManager,
androidContentContainer, mControlContainer, contextualSearchManager,
mControlContainer, contextualSearchManager,
mCompositorView.getResourceManager().getDynamicResourceLoader());
mTabModelSelector = tabModelSelector;
......
......@@ -99,6 +99,8 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider,
/** A {@link Layout} used for showing a normal web page. */
protected final StaticLayout mStaticLayout;
private final ViewGroup mContentContainer;
// External Dependencies
private TabModelSelector mTabModelSelector;
......@@ -108,8 +110,6 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider,
// An observer for watching TabModelFilters changes events.
private TabModelObserver mTabModelFilterObserver;
private ViewGroup mContentContainer;
// External Observers
private final ObserverList<SceneChangeObserver> mSceneChangeObservers = new ObserverList<>();
......@@ -245,8 +245,9 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider,
/**
* Creates a {@link LayoutManager} instance.
* @param host A {@link LayoutManagerHost} instance.
* @param contentContainer A {@link ViewGroup} for Android views to be bound to.
*/
public LayoutManager(LayoutManagerHost host) {
public LayoutManager(LayoutManagerHost host, ViewGroup contentContainer) {
mHost = host;
mPxToDp = 1.f / mHost.getContext().getResources().getDisplayMetrics().density;
mAndroidViewShownSupplier = new ObservableSupplierImpl<>();
......@@ -256,6 +257,9 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider,
mContext = host.getContext();
LayoutRenderHost renderHost = host.getLayoutRenderHost();
assert contentContainer != null;
mContentContainer = contentContainer;
mAnimationHandler = new CompositorAnimationHandler(this);
mOverlayPanelManager = new OverlayPanelManager();
......@@ -412,14 +416,12 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider,
* @param selector A {@link TabModelSelector} instance.
* @param creator A {@link TabCreatorManager} instance.
* @param content A {@link TabContentManager} instance.
* @param androidContentContainer A {@link ViewGroup} for Android views to be bound to.
* @param controlContainer A {@link ControlContainer} for browser controls' layout.
* @param contextualSearchDelegate A {@link ContextualSearchManagementDelegate} instance.
* @param dynamicResourceLoader A {@link DynamicResourceLoader} instance.
*/
public void init(TabModelSelector selector, TabCreatorManager creator,
TabContentManager content, ViewGroup androidContentContainer,
ControlContainer controlContainer,
TabContentManager content, ControlContainer controlContainer,
ContextualSearchManagementDelegate contextualSearchDelegate,
DynamicResourceLoader dynamicResourceLoader) {
LayoutRenderHost renderHost = mHost.getLayoutRenderHost();
......@@ -464,13 +466,11 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider,
// Set the dynamic resource loader for all overlay panels.
mOverlayPanelManager.setDynamicResourceLoader(dynamicResourceLoader);
mOverlayPanelManager.setContainerView(androidContentContainer);
mOverlayPanelManager.setContainerView(mContentContainer);
if (mTabModelSelector != selector) {
setTabModelSelector(selector);
}
mContentContainer = androidContentContainer;
}
public void setTabModelSelector(TabModelSelector selector) {
......
......@@ -77,12 +77,13 @@ public class LayoutManagerChrome
/**
* Creates the {@link LayoutManagerChrome} instance.
* @param host A {@link LayoutManagerHost} instance.
* @param contentContainer A {@link ViewGroup} for Android views to be bound to.
* @param startSurface An interface to talk to the Grid Tab Switcher. If it's NULL, VTS
* should be used, otherwise GTS should be used.
*/
public LayoutManagerChrome(LayoutManagerHost host, boolean createOverviewLayout,
@Nullable StartSurface startSurface) {
super(host);
public LayoutManagerChrome(LayoutManagerHost host, ViewGroup contentContainer,
boolean createOverviewLayout, @Nullable StartSurface startSurface) {
super(host, contentContainer);
Context context = host.getContext();
LayoutRenderHost renderHost = host.getLayoutRenderHost();
......@@ -144,8 +145,7 @@ public class LayoutManagerChrome
@Override
public void init(TabModelSelector selector, TabCreatorManager creator,
TabContentManager content, ViewGroup androidContentContainer,
ControlContainer controlContainer,
TabContentManager content, ControlContainer controlContainer,
ContextualSearchManagementDelegate contextualSearchDelegate,
DynamicResourceLoader dynamicResourceLoader) {
Context context = mHost.getContext();
......@@ -165,8 +165,8 @@ public class LayoutManagerChrome
(ObservableSupplier<BrowserControlsStateProvider>) browserControlsSupplier);
}
super.init(selector, creator, content, androidContentContainer, controlContainer,
contextualSearchDelegate, dynamicResourceLoader);
super.init(selector, creator, content, controlContainer, contextualSearchDelegate,
dynamicResourceLoader);
// TODO: TitleCache should be a part of the ResourceManager.
mTitleCache = mHost.getTitleCache();
......
......@@ -32,18 +32,18 @@ public class LayoutManagerChromePhone extends LayoutManagerChrome {
/**
* Creates an instance of a {@link LayoutManagerChromePhone}.
* @param host A {@link LayoutManagerHost} instance.
* @param contentContainer A {@link ViewGroup} for Android views to be bound to.
* @param startSurface An interface to talk to the Grid Tab Switcher. If it's NULL, VTS
* should be used, otherwise GTS should be used.
*/
public LayoutManagerChromePhone(LayoutManagerHost host, StartSurface startSurface) {
super(host, true, startSurface);
public LayoutManagerChromePhone(
LayoutManagerHost host, ViewGroup contentContainer, StartSurface startSurface) {
super(host, contentContainer, true, startSurface);
}
@Override
public void init(TabModelSelector selector, TabCreatorManager creator,
TabContentManager content, ViewGroup androidContentContainer,
ControlContainer controlContainer,
TabContentManager content, ControlContainer controlContainer,
ContextualSearchManagementDelegate contextualSearchDelegate,
DynamicResourceLoader dynamicResourceLoader) {
Context context = mHost.getContext();
......@@ -55,8 +55,8 @@ public class LayoutManagerChromePhone extends LayoutManagerChrome {
// Set up layout parameters
mStaticLayout.setLayoutHandlesTabLifecycles(false);
super.init(selector, creator, content, androidContentContainer, controlContainer,
contextualSearchDelegate, dynamicResourceLoader);
super.init(selector, creator, content, controlContainer, contextualSearchDelegate,
dynamicResourceLoader);
mToolbarSwipeLayout.setMovesToolbar(true);
......
......@@ -31,9 +31,10 @@ public class LayoutManagerChromeTablet extends LayoutManagerChrome {
/**
* Creates an instance of a {@link LayoutManagerChromePhone}.
* @param host A {@link LayoutManagerHost} instance.
* @param contentContainer A {@link ViewGroup} for Android views to be bound to.
*/
public LayoutManagerChromeTablet(LayoutManagerHost host) {
super(host, false, null);
public LayoutManagerChromeTablet(LayoutManagerHost host, ViewGroup contentContainer) {
super(host, contentContainer, false, null);
mTabStripLayoutHelperManager = new StripLayoutHelperManager(
host.getContext(), this, mHost.getLayoutRenderHost(), () -> mTitleCache);
......@@ -81,16 +82,15 @@ public class LayoutManagerChromeTablet extends LayoutManagerChrome {
@Override
public void init(TabModelSelector selector, TabCreatorManager creator,
TabContentManager content, ViewGroup androidContentContainer,
ControlContainer controlContainer,
TabContentManager content, ControlContainer controlContainer,
ContextualSearchManagementDelegate contextualSearchDelegate,
DynamicResourceLoader dynamicResourceLoader) {
if (mTabStripLayoutHelperManager != null) {
mTabStripLayoutHelperManager.setTabModelSelector(selector, creator);
}
super.init(selector, creator, content, androidContentContainer, controlContainer,
contextualSearchDelegate, dynamicResourceLoader);
super.init(selector, creator, content, controlContainer, contextualSearchDelegate,
dynamicResourceLoader);
// Make sure any tabs already restored get loaded into the title cache.
List<TabModel> models = selector.getModels();
......
......@@ -4,6 +4,8 @@
package org.chromium.chrome.browser.customtabs;
import android.view.ViewGroup;
import org.chromium.base.Callback;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.compositor.CompositorViewHolder;
......@@ -57,10 +59,11 @@ public class CustomTabCompositorContentInitializer implements NativeInitObserver
@Override
public void onFinishNativeInitialization() {
LayoutManager layoutDriver = new LayoutManager(mCompositorViewHolder.get());
ViewGroup contentContainer = mActivity.findViewById(android.R.id.content);
LayoutManager layoutDriver =
new LayoutManager(mCompositorViewHolder.get(), contentContainer);
mActivity.initializeCompositorContent(layoutDriver,
mActivity.findViewById(org.chromium.chrome.R.id.url_bar),
mActivity.findViewById(android.R.id.content),
mActivity.findViewById(org.chromium.chrome.R.id.url_bar), contentContainer,
mActivity.findViewById(org.chromium.chrome.R.id.control_container));
for (Callback<LayoutManager> listener : mListeners) {
......
......@@ -157,10 +157,10 @@ public class LayoutManagerTest implements MockTabModelDelegate {
FrameLayout container = new FrameLayout(context);
parentContainer.addView(container);
mManagerPhone = new LayoutManagerChromePhone(layoutManagerHost, null);
mManagerPhone = new LayoutManagerChromePhone(layoutManagerHost, container, null);
mManager = mManagerPhone;
CompositorAnimationHandler.setTestingMode(true);
mManager.init(mTabModelSelector, null, tabContentManager, container, null, null, null);
mManager.init(mTabModelSelector, null, tabContentManager, null, null, null);
initializeMotionEvent();
}
......
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