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