Commit d8f07bc4 authored by Matt Jones's avatar Matt Jones Committed by Commit Bot

Use ActivityTabProvider for TopToolbarOverlay

This patch replaces the custom tab supplier used in the LayoutManager
with the standard ActivityTabProvider. The fact that the top toolbar
overlay now uses a 'push' model to update instead of a passive 'pull'
means the tab sends the correct information immediately when ready
instead of the guessing that needed to happen before. This simplifies
the logic and reduces the number of tab sources.

Bug: 1100332
Change-Id: I49667aebed4de36fd34be957a5fbf421e510713d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2354996Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarJinsuk Kim <jinsukkim@chromium.org>
Commit-Queue: Matthew Jones <mdjones@chromium.org>
Cr-Commit-Position: refs/heads/master@{#805082}
parent e0be430f
...@@ -1692,8 +1692,8 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1692,8 +1692,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( mCompositorViewHolder.onFinishNativeInitialization(getTabModelSelector(), this,
getTabModelSelector(), this, getTabContentManager(), mContextualSearchManager); getTabContentManager(), mContextualSearchManager, mActivityTabProvider);
if (controlContainer != null && DeviceClassManager.enableToolbarSwipe() if (controlContainer != null && DeviceClassManager.enableToolbarSwipe()
&& getCompositorViewHolder().getLayoutManager().getToolbarSwipeHandler() != null) { && getCompositorViewHolder().getLayoutManager().getToolbarSwipeHandler() != null) {
......
...@@ -43,6 +43,7 @@ import org.chromium.base.compat.ApiHelperForO; ...@@ -43,6 +43,7 @@ import org.chromium.base.compat.ApiHelperForO;
import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.ObservableSupplierImpl; import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
import org.chromium.chrome.browser.browser_controls.BrowserControlsUtils; import org.chromium.chrome.browser.browser_controls.BrowserControlsUtils;
import org.chromium.chrome.browser.compositor.Invalidator.Client; import org.chromium.chrome.browser.compositor.Invalidator.Client;
...@@ -1222,14 +1223,16 @@ public class CompositorViewHolder extends FrameLayout ...@@ -1222,14 +1223,16 @@ public class CompositorViewHolder extends FrameLayout
* @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 contextualSearchManager A {@link ContextualSearchManagementDelegate} instance. * @param contextualSearchManager A {@link ContextualSearchManagementDelegate} instance.
* @param tabProvider A means of acquiring the active tab.
*/ */
public void onFinishNativeInitialization(TabModelSelector tabModelSelector, public void onFinishNativeInitialization(TabModelSelector tabModelSelector,
TabCreatorManager tabCreatorManager, TabContentManager tabContentManager, TabCreatorManager tabCreatorManager, TabContentManager tabContentManager,
ContextualSearchManagementDelegate contextualSearchManager) { ContextualSearchManagementDelegate contextualSearchManager,
ActivityTabProvider tabProvider) {
assert mLayoutManager != null && mControlContainer != null; assert mLayoutManager != null && mControlContainer != null;
mLayoutManager.init(tabModelSelector, tabCreatorManager, tabContentManager, mLayoutManager.init(tabModelSelector, tabCreatorManager, tabContentManager,
mControlContainer, contextualSearchManager, mControlContainer, contextualSearchManager,
mCompositorView.getResourceManager().getDynamicResourceLoader()); mCompositorView.getResourceManager().getDynamicResourceLoader(), tabProvider);
mTabModelSelector = tabModelSelector; mTabModelSelector = tabModelSelector;
tabModelSelector.addObserver(new EmptyTabModelSelectorObserver() { tabModelSelector.addObserver(new EmptyTabModelSelectorObserver() {
......
...@@ -19,6 +19,7 @@ import org.chromium.base.ObserverList; ...@@ -19,6 +19,7 @@ import org.chromium.base.ObserverList;
import org.chromium.base.TraceEvent; import org.chromium.base.TraceEvent;
import org.chromium.base.supplier.ObservableSupplierImpl; import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.base.supplier.Supplier; import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
import org.chromium.chrome.browser.browser_controls.BrowserControlsUtils; import org.chromium.chrome.browser.browser_controls.BrowserControlsUtils;
import org.chromium.chrome.browser.browser_controls.BrowserControlsVisibilityManager; import org.chromium.chrome.browser.browser_controls.BrowserControlsVisibilityManager;
...@@ -152,14 +153,8 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider, ...@@ -152,14 +153,8 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider,
/** The animation handler responsible for updating all the browser compositor's animations. */ /** The animation handler responsible for updating all the browser compositor's animations. */
private final CompositorAnimationHandler mAnimationHandler; private final CompositorAnimationHandler mAnimationHandler;
/** private final ObservableSupplierImpl<TabModelSelector> mTabModelSelectorSupplier =
* Current tab to provide Toolbar overlay with. Unlike TabModelSelector#getCurrentTab new ObservableSupplierImpl<>();
* which returns null right after a tab is closed, this keeps the reference until
* TabModelObserver#didCloseTab is triggered for Toolbar overlay to have a chance
* to retrieve the right textbox color from it.
*/
private ObservableSupplierImpl<Tab> mCurrentTabSupplier;
private final ObservableSupplierImpl<TabContentManager> mTabContentManagerSupplier = private final ObservableSupplierImpl<TabContentManager> mTabContentManagerSupplier =
new ObservableSupplierImpl<>(); new ObservableSupplierImpl<>();
private final ObservableSupplierImpl<BrowserControlsStateProvider> private final ObservableSupplierImpl<BrowserControlsStateProvider>
...@@ -177,7 +172,6 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider, ...@@ -177,7 +172,6 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider,
} else if (tab.getId() != lastId) { } else if (tab.getId() != lastId) {
tabSelected(tab.getId(), lastId, tab.isIncognito()); tabSelected(tab.getId(), lastId, tab.isIncognito());
} }
mCurrentTabSupplier.set(tab);
} }
@Override @Override
...@@ -220,8 +214,6 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider, ...@@ -220,8 +214,6 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider,
@Override @Override
public void didCloseTab(int tabId, boolean incognito) { public void didCloseTab(int tabId, boolean incognito) {
tabClosed(tabId, incognito, false); tabClosed(tabId, incognito, false);
mCurrentTabSupplier.set(
getTabModelSelector() != null ? getTabModelSelector().getCurrentTab() : null);
} }
@Override @Override
...@@ -250,7 +242,6 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider, ...@@ -250,7 +242,6 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider,
mPxToDp = 1.f / mHost.getContext().getResources().getDisplayMetrics().density; mPxToDp = 1.f / mHost.getContext().getResources().getDisplayMetrics().density;
mAndroidViewShownSupplier = new ObservableSupplierImpl<>(); mAndroidViewShownSupplier = new ObservableSupplierImpl<>();
mAndroidViewShownSupplier.set(true); mAndroidViewShownSupplier.set(true);
mCurrentTabSupplier = new ObservableSupplierImpl<>();
mContext = host.getContext(); mContext = host.getContext();
LayoutRenderHost renderHost = host.getLayoutRenderHost(); LayoutRenderHost renderHost = host.getLayoutRenderHost();
...@@ -410,9 +401,8 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider, ...@@ -410,9 +401,8 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider,
public void init(TabModelSelector selector, TabCreatorManager creator, public void init(TabModelSelector selector, TabCreatorManager creator,
TabContentManager content, ControlContainer controlContainer, TabContentManager content, ControlContainer controlContainer,
ContextualSearchManagementDelegate contextualSearchDelegate, ContextualSearchManagementDelegate contextualSearchDelegate,
DynamicResourceLoader dynamicResourceLoader) { DynamicResourceLoader dynamicResourceLoader, ActivityTabProvider tabProvider) {
LayoutRenderHost renderHost = mHost.getLayoutRenderHost(); LayoutRenderHost renderHost = mHost.getLayoutRenderHost();
mCurrentTabSupplier.set(selector.getCurrentTab());
// Build Layouts // Build Layouts
mStaticLayout = new StaticLayout(mContext, this, renderHost, mHost, mFrameRequestSupplier, mStaticLayout = new StaticLayout(mContext, this, renderHost, mHost, mFrameRequestSupplier,
...@@ -430,7 +420,7 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider, ...@@ -430,7 +420,7 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider,
-> getActiveLayout() != null ? getActiveLayout().getViewportMode() -> getActiveLayout() != null ? getActiveLayout().getViewportMode()
: Layout.ViewportMode.ALWAYS_FULLSCREEN; : Layout.ViewportMode.ALWAYS_FULLSCREEN;
mToolbarOverlay = new TopToolbarOverlayCoordinator(mContext, mFrameRequestSupplier, mToolbarOverlay = new TopToolbarOverlayCoordinator(mContext, mFrameRequestSupplier,
this, controlContainer, mCurrentTabSupplier, getBrowserControlsManager(), this, controlContainer, tabProvider, getBrowserControlsManager(),
viewportModeSupplier, mAndroidViewShownSupplier, viewportModeSupplier, mAndroidViewShownSupplier,
() -> renderHost.getResourceManager()); () -> renderHost.getResourceManager());
} }
...@@ -473,7 +463,7 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider, ...@@ -473,7 +463,7 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider,
// mTabModelSelector should only be set once. // mTabModelSelector should only be set once.
public void setTabModelSelector(TabModelSelector selector) { public void setTabModelSelector(TabModelSelector selector) {
mTabModelSelector = selector; mTabModelSelector = selector;
mCurrentTabSupplier.set(selector.getCurrentTab()); mTabModelSelectorSupplier.set(selector);
mTabModelSelectorTabObserver = new TabModelSelectorTabObserver(mTabModelSelector) { mTabModelSelectorTabObserver = new TabModelSelectorTabObserver(mTabModelSelector) {
@Override @Override
public void onShown(Tab tab, @TabSelectionType int type) { public void onShown(Tab tab, @TabSelectionType int type) {
...@@ -534,7 +524,6 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider, ...@@ -534,7 +524,6 @@ public class LayoutManager implements LayoutUpdateHost, LayoutProvider,
getTabModelSelector().getTabModelFilterProvider().removeTabModelFilterObserver( getTabModelSelector().getTabModelFilterProvider().removeTabModelFilterObserver(
mTabModelFilterObserver); mTabModelFilterObserver);
} }
mCurrentTabSupplier.set(null);
} }
/** /**
......
...@@ -13,6 +13,7 @@ import androidx.annotation.VisibleForTesting; ...@@ -13,6 +13,7 @@ import androidx.annotation.VisibleForTesting;
import org.chromium.base.ObserverList; import org.chromium.base.ObserverList;
import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.metrics.RecordUserAction;
import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout; import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout;
import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
import org.chromium.chrome.browser.compositor.TitleCache; import org.chromium.chrome.browser.compositor.TitleCache;
...@@ -147,7 +148,7 @@ public class LayoutManagerChrome ...@@ -147,7 +148,7 @@ public class LayoutManagerChrome
public void init(TabModelSelector selector, TabCreatorManager creator, public void init(TabModelSelector selector, TabCreatorManager creator,
TabContentManager content, ControlContainer controlContainer, TabContentManager content, ControlContainer controlContainer,
ContextualSearchManagementDelegate contextualSearchDelegate, ContextualSearchManagementDelegate contextualSearchDelegate,
DynamicResourceLoader dynamicResourceLoader) { DynamicResourceLoader dynamicResourceLoader, ActivityTabProvider tabProvider) {
Context context = mHost.getContext(); Context context = mHost.getContext();
LayoutRenderHost renderHost = mHost.getLayoutRenderHost(); LayoutRenderHost renderHost = mHost.getLayoutRenderHost();
BrowserControlsStateProvider browserControlsStateProvider = BrowserControlsStateProvider browserControlsStateProvider =
...@@ -166,7 +167,7 @@ public class LayoutManagerChrome ...@@ -166,7 +167,7 @@ public class LayoutManagerChrome
} }
super.init(selector, creator, content, controlContainer, contextualSearchDelegate, super.init(selector, creator, content, controlContainer, contextualSearchDelegate,
dynamicResourceLoader); dynamicResourceLoader, tabProvider);
// TODO: TitleCache should be a part of the ResourceManager. // TODO: TitleCache should be a part of the ResourceManager.
mTitleCache = mHost.getTitleCache(); mTitleCache = mHost.getTitleCache();
......
...@@ -7,6 +7,7 @@ package org.chromium.chrome.browser.compositor.layouts; ...@@ -7,6 +7,7 @@ package org.chromium.chrome.browser.compositor.layouts;
import android.content.Context; import android.content.Context;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.compositor.layouts.phone.SimpleAnimationLayout; import org.chromium.chrome.browser.compositor.layouts.phone.SimpleAnimationLayout;
import org.chromium.chrome.browser.compositor.overlays.SceneOverlay; import org.chromium.chrome.browser.compositor.overlays.SceneOverlay;
...@@ -45,7 +46,7 @@ public class LayoutManagerChromePhone extends LayoutManagerChrome { ...@@ -45,7 +46,7 @@ public class LayoutManagerChromePhone extends LayoutManagerChrome {
public void init(TabModelSelector selector, TabCreatorManager creator, public void init(TabModelSelector selector, TabCreatorManager creator,
TabContentManager content, ControlContainer controlContainer, TabContentManager content, ControlContainer controlContainer,
ContextualSearchManagementDelegate contextualSearchDelegate, ContextualSearchManagementDelegate contextualSearchDelegate,
DynamicResourceLoader dynamicResourceLoader) { DynamicResourceLoader dynamicResourceLoader, ActivityTabProvider tabProvider) {
Context context = mHost.getContext(); Context context = mHost.getContext();
LayoutRenderHost renderHost = mHost.getLayoutRenderHost(); LayoutRenderHost renderHost = mHost.getLayoutRenderHost();
...@@ -53,7 +54,7 @@ public class LayoutManagerChromePhone extends LayoutManagerChrome { ...@@ -53,7 +54,7 @@ public class LayoutManagerChromePhone extends LayoutManagerChrome {
mSimpleAnimationLayout = new SimpleAnimationLayout(context, this, renderHost); mSimpleAnimationLayout = new SimpleAnimationLayout(context, this, renderHost);
super.init(selector, creator, content, controlContainer, contextualSearchDelegate, super.init(selector, creator, content, controlContainer, contextualSearchDelegate,
dynamicResourceLoader); dynamicResourceLoader, tabProvider);
// Set up layout parameters // Set up layout parameters
mStaticLayout.setLayoutHandlesTabLifecycles(false); mStaticLayout.setLayoutHandlesTabLifecycles(false);
......
...@@ -7,6 +7,7 @@ package org.chromium.chrome.browser.compositor.layouts; ...@@ -7,6 +7,7 @@ package org.chromium.chrome.browser.compositor.layouts;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelperManager; import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelperManager;
import org.chromium.chrome.browser.contextualsearch.ContextualSearchManagementDelegate; import org.chromium.chrome.browser.contextualsearch.ContextualSearchManagementDelegate;
...@@ -84,13 +85,13 @@ public class LayoutManagerChromeTablet extends LayoutManagerChrome { ...@@ -84,13 +85,13 @@ public class LayoutManagerChromeTablet extends LayoutManagerChrome {
public void init(TabModelSelector selector, TabCreatorManager creator, public void init(TabModelSelector selector, TabCreatorManager creator,
TabContentManager content, ControlContainer controlContainer, TabContentManager content, ControlContainer controlContainer,
ContextualSearchManagementDelegate contextualSearchDelegate, ContextualSearchManagementDelegate contextualSearchDelegate,
DynamicResourceLoader dynamicResourceLoader) { DynamicResourceLoader dynamicResourceLoader, ActivityTabProvider tabProvider) {
if (mTabStripLayoutHelperManager != null) { if (mTabStripLayoutHelperManager != null) {
mTabStripLayoutHelperManager.setTabModelSelector(selector, creator); mTabStripLayoutHelperManager.setTabModelSelector(selector, creator);
} }
super.init(selector, creator, content, controlContainer, contextualSearchDelegate, super.init(selector, creator, content, controlContainer, contextualSearchDelegate,
dynamicResourceLoader); dynamicResourceLoader, tabProvider);
// 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();
......
...@@ -10,6 +10,7 @@ import android.graphics.RectF; ...@@ -10,6 +10,7 @@ import android.graphics.RectF;
import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.Supplier; import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
import org.chromium.chrome.browser.compositor.LayerTitleCache; import org.chromium.chrome.browser.compositor.LayerTitleCache;
import org.chromium.chrome.browser.compositor.layouts.CompositorModelChangeProcessor; import org.chromium.chrome.browser.compositor.layouts.CompositorModelChangeProcessor;
...@@ -18,7 +19,6 @@ import org.chromium.chrome.browser.compositor.layouts.components.VirtualView; ...@@ -18,7 +19,6 @@ import org.chromium.chrome.browser.compositor.layouts.components.VirtualView;
import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter; import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter;
import org.chromium.chrome.browser.compositor.overlays.SceneOverlay; import org.chromium.chrome.browser.compositor.overlays.SceneOverlay;
import org.chromium.chrome.browser.compositor.scene_layer.SceneOverlayLayer; import org.chromium.chrome.browser.compositor.scene_layer.SceneOverlayLayer;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.toolbar.ControlContainer; import org.chromium.chrome.browser.toolbar.ControlContainer;
import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.resources.ResourceManager; import org.chromium.ui.resources.ResourceManager;
...@@ -42,7 +42,7 @@ public class TopToolbarOverlayCoordinator implements SceneOverlay { ...@@ -42,7 +42,7 @@ public class TopToolbarOverlayCoordinator implements SceneOverlay {
public TopToolbarOverlayCoordinator(Context context, public TopToolbarOverlayCoordinator(Context context,
CompositorModelChangeProcessor.FrameRequestSupplier frameRequestSupplier, CompositorModelChangeProcessor.FrameRequestSupplier frameRequestSupplier,
LayoutManager layoutManager, ControlContainer controlContainer, LayoutManager layoutManager, ControlContainer controlContainer,
ObservableSupplier<Tab> tabSupplier, ActivityTabProvider tabSupplier,
BrowserControlsStateProvider browserControlsStateProvider, BrowserControlsStateProvider browserControlsStateProvider,
Supplier<Integer> viewportModeSupplier, Supplier<Integer> viewportModeSupplier,
ObservableSupplier<Boolean> androidViewShownSupplier, ObservableSupplier<Boolean> androidViewShownSupplier,
......
...@@ -12,6 +12,7 @@ import androidx.annotation.VisibleForTesting; ...@@ -12,6 +12,7 @@ import androidx.annotation.VisibleForTesting;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.Supplier; import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
import org.chromium.chrome.browser.browser_controls.BrowserControlsUtils; import org.chromium.chrome.browser.browser_controls.BrowserControlsUtils;
import org.chromium.chrome.browser.compositor.layouts.Layout; import org.chromium.chrome.browser.compositor.layouts.Layout;
...@@ -46,10 +47,10 @@ public class TopToolbarOverlayMediator { ...@@ -46,10 +47,10 @@ public class TopToolbarOverlayMediator {
private final ControlContainer mToolbarContainer; private final ControlContainer mToolbarContainer;
/** Provides current tab. */ /** Provides current tab. */
private final ObservableSupplier<Tab> mTabSupplier; private final ActivityTabProvider mTabSupplier;
/** An observer that watches for changes in the active tab. */ /** An observer that watches for changes in the active tab. */
private final Callback<Tab> mTabSupplierObserver; private final ActivityTabProvider.ActivityTabObserver mTabSupplierObserver;
/** Access to the current state of the browser controls. */ /** Access to the current state of the browser controls. */
private final BrowserControlsStateProvider mBrowserControlsStateProvider; private final BrowserControlsStateProvider mBrowserControlsStateProvider;
...@@ -73,7 +74,7 @@ public class TopToolbarOverlayMediator { ...@@ -73,7 +74,7 @@ public class TopToolbarOverlayMediator {
private Tab mLastActiveTab; private Tab mLastActiveTab;
TopToolbarOverlayMediator(PropertyModel model, Context context, LayoutManager layoutManager, TopToolbarOverlayMediator(PropertyModel model, Context context, LayoutManager layoutManager,
ControlContainer controlContainer, ObservableSupplier<Tab> tabSupplier, ControlContainer controlContainer, ActivityTabProvider tabSupplier,
BrowserControlsStateProvider browserControlsStateProvider, BrowserControlsStateProvider browserControlsStateProvider,
Supplier<Integer> viewportModeSupplier, Supplier<Integer> viewportModeSupplier,
ObservableSupplier<Boolean> androidViewShownSupplier) { ObservableSupplier<Boolean> androidViewShownSupplier) {
...@@ -117,7 +118,7 @@ public class TopToolbarOverlayMediator { ...@@ -117,7 +118,7 @@ public class TopToolbarOverlayMediator {
// Keep an observer attached to the visible tab (and only the visible tab) to update // Keep an observer attached to the visible tab (and only the visible tab) to update
// properties including theme color. // properties including theme color.
mTabSupplierObserver = (tab) -> { mTabSupplierObserver = (tab, hint) -> {
if (mLastActiveTab != null) mLastActiveTab.removeObserver(currentTabObserver); if (mLastActiveTab != null) mLastActiveTab.removeObserver(currentTabObserver);
if (tab == null) return; if (tab == null) return;
...@@ -127,7 +128,7 @@ public class TopToolbarOverlayMediator { ...@@ -127,7 +128,7 @@ public class TopToolbarOverlayMediator {
updateThemeColor(mLastActiveTab); updateThemeColor(mLastActiveTab);
updateProgress(); updateProgress();
}; };
mTabSupplier.addObserver(mTabSupplierObserver); mTabSupplier.addObserverAndTrigger(mTabSupplierObserver);
mAndroidViewShownObserver = (shown) -> updateShadowState(); mAndroidViewShownObserver = (shown) -> updateShadowState();
mAndroidViewShownSupplier.addObserver(mAndroidViewShownObserver); mAndroidViewShownSupplier.addObserver(mAndroidViewShownObserver);
...@@ -225,7 +226,7 @@ public class TopToolbarOverlayMediator { ...@@ -225,7 +226,7 @@ public class TopToolbarOverlayMediator {
/** Clean up any state and observers. */ /** Clean up any state and observers. */
void destroy() { void destroy() {
mTabSupplier.removeObserver(mTabSupplierObserver); mTabSupplier.removeObserver(mTabSupplierObserver);
mTabSupplierObserver.onResult(null); mTabSupplierObserver.onActivityTabChanged(null, false);
mLastActiveTab = null; mLastActiveTab = null;
mLayoutManager.removeSceneChangeObserver(mSceneChangeObserver); mLayoutManager.removeSceneChangeObserver(mSceneChangeObserver);
......
...@@ -25,6 +25,8 @@ import org.junit.Before; ...@@ -25,6 +25,8 @@ import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.chromium.base.MathUtils; import org.chromium.base.MathUtils;
import org.chromium.base.test.UiThreadTest; import org.chromium.base.test.UiThreadTest;
...@@ -32,6 +34,7 @@ import org.chromium.base.test.util.CommandLineFlags; ...@@ -32,6 +34,7 @@ import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.DisabledTest;
import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.Restriction; import org.chromium.base.test.util.Restriction;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout; import org.chromium.chrome.browser.accessibility_tab_switcher.OverviewListLayout;
import org.chromium.chrome.browser.compositor.animation.CompositorAnimationHandler; import org.chromium.chrome.browser.compositor.animation.CompositorAnimationHandler;
import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab; import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab;
...@@ -73,6 +76,9 @@ public class LayoutManagerTest implements MockTabModelDelegate { ...@@ -73,6 +76,9 @@ public class LayoutManagerTest implements MockTabModelDelegate {
@Rule @Rule
public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
@Mock
private ActivityTabProvider mTabSupplier;
private long mLastDownTime; private long mLastDownTime;
private TabModelSelector mTabModelSelector; private TabModelSelector mTabModelSelector;
...@@ -160,7 +166,7 @@ public class LayoutManagerTest implements MockTabModelDelegate { ...@@ -160,7 +166,7 @@ public class LayoutManagerTest implements MockTabModelDelegate {
mManagerPhone = new LayoutManagerChromePhone(layoutManagerHost, container, null); mManagerPhone = new LayoutManagerChromePhone(layoutManagerHost, container, null);
mManager = mManagerPhone; mManager = mManagerPhone;
CompositorAnimationHandler.setTestingMode(true); CompositorAnimationHandler.setTestingMode(true);
mManager.init(mTabModelSelector, null, tabContentManager, null, null, null); mManager.init(mTabModelSelector, null, tabContentManager, null, null, null, mTabSupplier);
initializeMotionEvent(); initializeMotionEvent();
} }
...@@ -626,6 +632,8 @@ public class LayoutManagerTest implements MockTabModelDelegate { ...@@ -626,6 +632,8 @@ public class LayoutManagerTest implements MockTabModelDelegate {
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this);
// Load the browser process. // Load the browser process.
TestThreadUtils.runOnUiThreadBlocking( TestThreadUtils.runOnUiThreadBlocking(
() -> { ChromeBrowserInitializer.getInstance().handleSynchronousStartup(); }); () -> { ChromeBrowserInitializer.getInstance().handleSynchronousStartup(); });
......
...@@ -23,6 +23,7 @@ import org.mockito.MockitoAnnotations; ...@@ -23,6 +23,7 @@ import org.mockito.MockitoAnnotations;
import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.ObservableSupplierImpl; import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
import org.chromium.chrome.browser.compositor.layouts.Layout.ViewportMode; import org.chromium.chrome.browser.compositor.layouts.Layout.ViewportMode;
import org.chromium.chrome.browser.compositor.layouts.LayoutManager; import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
...@@ -65,16 +66,18 @@ public class TopToolbarOverlayMediatorTest { ...@@ -65,16 +66,18 @@ public class TopToolbarOverlayMediatorTest {
@Captor @Captor
private ArgumentCaptor<BrowserControlsStateProvider.Observer> mBrowserControlsObserverCaptor; private ArgumentCaptor<BrowserControlsStateProvider.Observer> mBrowserControlsObserverCaptor;
private ObservableSupplierImpl<Tab> mTabSupplier; @Mock
private ActivityTabProvider mTabSupplier;
@Captor
private ArgumentCaptor<ActivityTabProvider.ActivityTabObserver> mActivityTabObserverCaptor;
private ObservableSupplierImpl<Boolean> mAndroidViewShownSupplier; private ObservableSupplierImpl<Boolean> mAndroidViewShownSupplier;
@Before @Before
public void beforeTest() { public void beforeTest() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mTabSupplier = new ObservableSupplierImpl<>();
mTabSupplier.set(mTab);
mAndroidViewShownSupplier = new ObservableSupplierImpl<>(); mAndroidViewShownSupplier = new ObservableSupplierImpl<>();
mAndroidViewShownSupplier.set(true); mAndroidViewShownSupplier.set(true);
...@@ -100,11 +103,20 @@ public class TopToolbarOverlayMediatorTest { ...@@ -100,11 +103,20 @@ public class TopToolbarOverlayMediatorTest {
mAndroidViewShownSupplier); mAndroidViewShownSupplier);
// Ensure the observer is added to the initial tab. // Ensure the observer is added to the initial tab.
verify(mTabSupplier).addObserverAndTrigger(mActivityTabObserverCaptor.capture());
setTabSupplierTab(mTab);
verify(mTab).addObserver(mTabObserverCaptor.capture()); verify(mTab).addObserver(mTabObserverCaptor.capture());
verify(mBrowserControlsProvider).addObserver(mBrowserControlsObserverCaptor.capture()); verify(mBrowserControlsProvider).addObserver(mBrowserControlsObserverCaptor.capture());
} }
/** Set the tab that will be returned by the supplier and trigger the observer event. */
private void setTabSupplierTab(Tab tab) {
when(mTabSupplier.get()).thenReturn(tab);
mActivityTabObserverCaptor.getValue().onActivityTabChanged(tab, false);
}
@After @After
public void afterTest() { public void afterTest() {
// Unset any testing state the tests may have set. // Unset any testing state the tests may have set.
...@@ -113,7 +125,7 @@ public class TopToolbarOverlayMediatorTest { ...@@ -113,7 +125,7 @@ public class TopToolbarOverlayMediatorTest {
@Test @Test
public void testTabObserverAfterTabSwitch() { public void testTabObserverAfterTabSwitch() {
mTabSupplier.set(mTab2); setTabSupplierTab(mTab2);
// Make sure the tab observer for this overlay is only observing the "current" tab. // Make sure the tab observer for this overlay is only observing the "current" tab.
verify(mTab).removeObserver(mTabObserverCaptor.getValue()); verify(mTab).removeObserver(mTabObserverCaptor.getValue());
...@@ -159,7 +171,7 @@ public class TopToolbarOverlayMediatorTest { ...@@ -159,7 +171,7 @@ public class TopToolbarOverlayMediatorTest {
// Ensure the progress is correct on tab switch. // Ensure the progress is correct on tab switch.
mTabObserverCaptor.getValue().onLoadProgressChanged(mTab, 0.f); mTabObserverCaptor.getValue().onLoadProgressChanged(mTab, 0.f);
mTabSupplier.set(mTab2); setTabSupplierTab(mTab2);
} }
@Test @Test
......
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