Commit 5e89be9f authored by Jinsuk Kim's avatar Jinsuk Kim Committed by Commit Bot

Toolbar: Remove some outbound dependencies

This CL removes some outbound dependencies of TopToolbarCoordinator:

1. IdentityDiscController
  - observer registration is now managed by ToolbarManager
  - Supplier is passed to StartSurface instead

2. compositor.Invalidator.Client
   compositor.layouts.LayoutUpdateHost
  - Uses a simple Runnable instead of the interface

3. HomepageManager
  - observer registration is now managed by ToolbarManager

Bug: 1127732

Change-Id: I52a2a714fa180637ce8418559956ec55e803da0c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2423144Reviewed-by: default avatarPatrick Noland <pnoland@chromium.org>
Reviewed-by: default avatarMatthew Jones <mdjones@chromium.org>
Commit-Queue: Jinsuk Kim <jinsukkim@chromium.org>
Cr-Commit-Position: refs/heads/master@{#810393}
parent f1829fc9
...@@ -46,7 +46,6 @@ import org.chromium.chrome.R; ...@@ -46,7 +46,6 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.ActivityTabProvider; 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.layouts.LayoutManager; import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
import org.chromium.chrome.browser.compositor.layouts.LayoutManagerHost; import org.chromium.chrome.browser.compositor.layouts.LayoutManagerHost;
import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost;
...@@ -137,8 +136,7 @@ public class CompositorViewHolder extends FrameLayout ...@@ -137,8 +136,7 @@ public class CompositorViewHolder extends FrameLayout
private int mPendingFrameCount; private int mPendingFrameCount;
private final ArrayList<Invalidator.Client> mPendingInvalidations = private final ArrayList<Runnable> mPendingInvalidations = new ArrayList<>();
new ArrayList<>();
private boolean mSkipInvalidation; private boolean mSkipInvalidation;
/** /**
...@@ -1402,11 +1400,11 @@ public class CompositorViewHolder extends FrameLayout ...@@ -1402,11 +1400,11 @@ public class CompositorViewHolder extends FrameLayout
} }
@Override @Override
public void deferInvalidate(Client client) { public void deferInvalidate(Runnable clientInvalidator) {
if (mPendingFrameCount <= 0) { if (mPendingFrameCount <= 0) {
client.doInvalidate(); clientInvalidator.run();
} else if (!mPendingInvalidations.contains(client)) { } else if (!mPendingInvalidations.contains(clientInvalidator)) {
mPendingInvalidations.add(client); mPendingInvalidations.add(clientInvalidator);
} }
} }
...@@ -1414,7 +1412,7 @@ public class CompositorViewHolder extends FrameLayout ...@@ -1414,7 +1412,7 @@ public class CompositorViewHolder extends FrameLayout
if (mPendingInvalidations.isEmpty()) return; if (mPendingInvalidations.isEmpty()) return;
TraceEvent.instant("CompositorViewHolder.flushInvalidation"); TraceEvent.instant("CompositorViewHolder.flushInvalidation");
for (int i = 0; i < mPendingInvalidations.size(); i++) { for (int i = 0; i < mPendingInvalidations.size(); i++) {
mPendingInvalidations.get(i).doInvalidate(); mPendingInvalidations.get(i).run();
} }
mPendingInvalidations.clear(); mPendingInvalidations.clear();
} }
......
...@@ -8,16 +8,6 @@ package org.chromium.chrome.browser.compositor; ...@@ -8,16 +8,6 @@ package org.chromium.chrome.browser.compositor;
* The {@link Invalidator} invalidates a client when it is the right time. * The {@link Invalidator} invalidates a client when it is the right time.
*/ */
public class Invalidator { public class Invalidator {
/**
* Interface for the client that gets invalidated.
*/
public interface Client {
/**
* Do the invalidation.
*/
void doInvalidate();
}
/** /**
* Interface for the host that drives the invalidations. * Interface for the host that drives the invalidations.
*/ */
...@@ -25,9 +15,9 @@ public class Invalidator { ...@@ -25,9 +15,9 @@ public class Invalidator {
/** /**
* Requests an invalidation of the view. * Requests an invalidation of the view.
* *
* @param view The {@link View} to invalidate. * @param invalidator {@link Runnable} that invalidates the view.
*/ */
void deferInvalidate(Client view); void deferInvalidate(Runnable invalidator);
} }
private Host mHost; private Host mHost;
...@@ -43,13 +33,13 @@ public class Invalidator { ...@@ -43,13 +33,13 @@ public class Invalidator {
* Invalidates either immediately (if no host is specified) or at time * Invalidates either immediately (if no host is specified) or at time
* triggered by the host. * triggered by the host.
* *
* @param client The {@link Client} to invalidate, most likely a view. * @param invalidator The {@link Runnable} performing invalidation.
*/ */
public void invalidate(Client client) { public void invalidate(Runnable invalidator) {
if (mHost != null) { if (mHost != null) {
mHost.deferInvalidate(client); mHost.deferInvalidate(invalidator);
} else { } else {
client.doInvalidate(); invalidator.run();
} }
} }
} }
...@@ -24,6 +24,7 @@ import org.chromium.base.Callback; ...@@ -24,6 +24,7 @@ import org.chromium.base.Callback;
import org.chromium.base.CallbackController; import org.chromium.base.CallbackController;
import org.chromium.base.TraceEvent; import org.chromium.base.TraceEvent;
import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.base.supplier.OneshotSupplier; import org.chromium.base.supplier.OneshotSupplier;
import org.chromium.base.supplier.Supplier; import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.R; import org.chromium.chrome.R;
...@@ -50,6 +51,7 @@ import org.chromium.chrome.browser.findinpage.FindToolbarManager; ...@@ -50,6 +51,7 @@ import org.chromium.chrome.browser.findinpage.FindToolbarManager;
import org.chromium.chrome.browser.findinpage.FindToolbarObserver; import org.chromium.chrome.browser.findinpage.FindToolbarObserver;
import org.chromium.chrome.browser.fullscreen.FullscreenManager; import org.chromium.chrome.browser.fullscreen.FullscreenManager;
import org.chromium.chrome.browser.fullscreen.FullscreenOptions; import org.chromium.chrome.browser.fullscreen.FullscreenOptions;
import org.chromium.chrome.browser.homepage.HomepageManager;
import org.chromium.chrome.browser.identity_disc.IdentityDiscController; import org.chromium.chrome.browser.identity_disc.IdentityDiscController;
import org.chromium.chrome.browser.ntp.FakeboxDelegate; import org.chromium.chrome.browser.ntp.FakeboxDelegate;
import org.chromium.chrome.browser.ntp.IncognitoNewTabPage; import org.chromium.chrome.browser.ntp.IncognitoNewTabPage;
...@@ -83,6 +85,7 @@ import org.chromium.chrome.browser.toolbar.top.Toolbar; ...@@ -83,6 +85,7 @@ import org.chromium.chrome.browser.toolbar.top.Toolbar;
import org.chromium.chrome.browser.toolbar.top.ToolbarActionModeCallback; import org.chromium.chrome.browser.toolbar.top.ToolbarActionModeCallback;
import org.chromium.chrome.browser.toolbar.top.ToolbarControlContainer; import org.chromium.chrome.browser.toolbar.top.ToolbarControlContainer;
import org.chromium.chrome.browser.toolbar.top.ToolbarLayout; import org.chromium.chrome.browser.toolbar.top.ToolbarLayout;
import org.chromium.chrome.browser.toolbar.top.ToolbarPhone;
import org.chromium.chrome.browser.toolbar.top.TopToolbarCoordinator; import org.chromium.chrome.browser.toolbar.top.TopToolbarCoordinator;
import org.chromium.chrome.browser.toolbar.top.ViewShiftingActionBarDelegate; import org.chromium.chrome.browser.toolbar.top.ViewShiftingActionBarDelegate;
import org.chromium.chrome.browser.ui.TabObscuringHandler; import org.chromium.chrome.browser.ui.TabObscuringHandler;
...@@ -121,6 +124,10 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve ...@@ -121,6 +124,10 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve
private final ToolbarControlContainer mControlContainer; private final ToolbarControlContainer mControlContainer;
private final BrowserControlsStateProvider.Observer mBrowserControlsObserver; private final BrowserControlsStateProvider.Observer mBrowserControlsObserver;
private final FullscreenManager.Observer mFullscreenObserver; private final FullscreenManager.Observer mFullscreenObserver;
private final ObservableSupplierImpl<Boolean> mHomeButtonVisibilitySupplier =
new ObservableSupplierImpl<>();
private final ObservableSupplierImpl<Boolean> mIdentityDiscStateSupplier =
new ObservableSupplierImpl<>();
private BottomControlsCoordinator mBottomControlsCoordinator; private BottomControlsCoordinator mBottomControlsCoordinator;
private TabModelSelector mTabModelSelector; private TabModelSelector mTabModelSelector;
...@@ -142,6 +149,7 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve ...@@ -142,6 +149,7 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve
private BookmarkBridge.BookmarkModelObserver mBookmarksObserver; private BookmarkBridge.BookmarkModelObserver mBookmarksObserver;
private FindToolbarObserver mFindToolbarObserver; private FindToolbarObserver mFindToolbarObserver;
private OverviewModeObserver mOverviewModeObserver; private OverviewModeObserver mOverviewModeObserver;
private @OverviewModeState int mOverviewModeState = OverviewModeState.NOT_SHOWN;
private OverviewModeBehavior mOverviewModeBehavior; private OverviewModeBehavior mOverviewModeBehavior;
private OneshotSupplier<OverviewModeBehavior> mOverviewModeBehaviorSupplier; private OneshotSupplier<OverviewModeBehavior> mOverviewModeBehaviorSupplier;
...@@ -160,6 +168,7 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve ...@@ -160,6 +168,7 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve
private final LoadProgressCoordinator mProgressBarCoordinator; private final LoadProgressCoordinator mProgressBarCoordinator;
private final ToolbarTabControllerImpl mToolbarTabController; private final ToolbarTabControllerImpl mToolbarTabController;
private MenuButtonCoordinator mMenuButtonCoordinator; private MenuButtonCoordinator mMenuButtonCoordinator;
private HomepageManager.HomepageStateListener mHomepageStateListener;
private BrowserStateBrowserControlsVisibilityDelegate mControlsVisibilityDelegate; private BrowserStateBrowserControlsVisibilityDelegate mControlsVisibilityDelegate;
private int mFullscreenFocusToken = TokenHolder.INVALID_TOKEN; private int mFullscreenFocusToken = TokenHolder.INVALID_TOKEN;
...@@ -309,17 +318,13 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve ...@@ -309,17 +318,13 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve
mActivity.getCompositorViewHolder()::requestFocus, shouldShowUpdateBadge, mActivity.getCompositorViewHolder()::requestFocus, shouldShowUpdateBadge,
mActivity::isInOverviewMode, overviewModeThemeColorProvider, R.id.none); mActivity::isInOverviewMode, overviewModeThemeColorProvider, R.id.none);
mToolbar = new TopToolbarCoordinator(controlContainer, toolbarLayout, mToolbar = createTopToolbarCoordinator(controlContainer, toolbarLayout, buttonDataProviders,
identityDiscController, mLocationBarModel, mToolbarTabController, browsingModeThemeColorProvider, startSurfaceMenuButtonCoordinator, invalidator,
new UserEducationHelper(mActivity, mHandler), buttonDataProviders, identityDiscController);
mOverviewModeBehaviorSupplier, browsingModeThemeColorProvider,
mAppThemeColorProvider, mMenuButtonCoordinator, startSurfaceMenuButtonCoordinator,
mMenuButtonCoordinator.getMenuButtonHelperSupplier(), mActivity,
mTabModelSelectorSupplier);
mActionModeController = mActionModeController =
new ActionModeController(mActivity, mActionBarDelegate, toolbarActionModeCallback); new ActionModeController(mActivity, mActionBarDelegate, toolbarActionModeCallback);
mToolbar.setPaintInvalidator(invalidator);
mActionModeController.setTabStripHeight(mToolbar.getTabStripHeight()); mActionModeController.setTabStripHeight(mToolbar.getTabStripHeight());
mLocationBar = mToolbar.getLocationBar(); mLocationBar = mToolbar.getLocationBar();
mLocationBar.setProfileSupplier(profileSupplier); mLocationBar.setProfileSupplier(profileSupplier);
...@@ -573,6 +578,7 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve ...@@ -573,6 +578,7 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve
public void onOverviewModeStateChanged( public void onOverviewModeStateChanged(
@OverviewModeState int overviewModeState, boolean showTabSwitcherToolbar) { @OverviewModeState int overviewModeState, boolean showTabSwitcherToolbar) {
assert StartSurfaceConfiguration.isStartSurfaceEnabled(); assert StartSurfaceConfiguration.isStartSurfaceEnabled();
mOverviewModeState = overviewModeState;
mToolbar.updateTabSwitcherToolbarState(showTabSwitcherToolbar); mToolbar.updateTabSwitcherToolbarState(showTabSwitcherToolbar);
} }
...@@ -618,6 +624,36 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve ...@@ -618,6 +624,36 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve
TraceEvent.end("ToolbarManager.ToolbarManager"); TraceEvent.end("ToolbarManager.ToolbarManager");
} }
private TopToolbarCoordinator createTopToolbarCoordinator(
ToolbarControlContainer controlContainer, ToolbarLayout toolbarLayout,
List<ButtonDataProvider> buttonDataProviders,
ThemeColorProvider browsingModeThemeColorProvider,
MenuButtonCoordinator startSurfaceMenuButtonCoordinator, Invalidator invalidator,
IdentityDiscController identityDiscController) {
TopToolbarCoordinator toolbar = new TopToolbarCoordinator(controlContainer, toolbarLayout,
mLocationBarModel, mToolbarTabController,
new UserEducationHelper(mActivity, mHandler), buttonDataProviders,
mOverviewModeBehaviorSupplier, browsingModeThemeColorProvider,
mAppThemeColorProvider, mMenuButtonCoordinator, startSurfaceMenuButtonCoordinator,
mMenuButtonCoordinator.getMenuButtonHelperSupplier(), mTabModelSelectorSupplier,
mHomeButtonVisibilitySupplier, mIdentityDiscStateSupplier, (client) -> {
if (invalidator != null) {
invalidator.invalidate(client);
} else {
client.run();
}
}, () -> identityDiscController.getForStartSurface(mOverviewModeState));
mHomepageStateListener =
() -> mHomeButtonVisibilitySupplier.set(HomepageManager.isHomepageEnabled());
HomepageManager.getInstance().addListener(mHomepageStateListener);
if (toolbarLayout instanceof ToolbarPhone
&& StartSurfaceConfiguration.isStartSurfaceEnabled()) {
identityDiscController.addObserver(
(canShowHint) -> mIdentityDiscStateSupplier.set(canShowHint));
}
return toolbar;
}
/** /**
* Called when the contextual action bar's visibility has changed (i.e. the widget shown * Called when the contextual action bar's visibility has changed (i.e. the widget shown
* when you can copy/paste text after long press). * when you can copy/paste text after long press).
...@@ -693,7 +729,7 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve ...@@ -693,7 +729,7 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve
TabSwitcherActionMenuCoordinator.createOnLongClickListener( TabSwitcherActionMenuCoordinator.createOnLongClickListener(
(id) -> mActivity.onOptionsItemSelected(id, null)); (id) -> mActivity.onOptionsItemSelected(id, null));
mToolbar.initializeWithNative(layoutManager, tabSwitcherClickHandler, mToolbar.initializeWithNative(layoutManager::requestUpdate, tabSwitcherClickHandler,
tabSwitcherLongClickHandler, newTabClickHandler, bookmarkClickHandler, tabSwitcherLongClickHandler, newTabClickHandler, bookmarkClickHandler,
customTabsBackClickHandler); customTabsBackClickHandler);
...@@ -843,6 +879,8 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve ...@@ -843,6 +879,8 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve
mLayoutManager = null; mLayoutManager = null;
} }
HomepageManager.getInstance().removeListener(mHomepageStateListener);
if (mBottomControlsCoordinator != null) { if (mBottomControlsCoordinator != null) {
mBottomControlsCoordinator.destroy(); mBottomControlsCoordinator.destroy();
mBottomControlsCoordinator = null; mBottomControlsCoordinator = null;
......
...@@ -13,13 +13,15 @@ import androidx.annotation.VisibleForTesting; ...@@ -13,13 +13,15 @@ import androidx.annotation.VisibleForTesting;
import org.chromium.base.CallbackController; import org.chromium.base.CallbackController;
import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.OneshotSupplier; import org.chromium.base.supplier.OneshotSupplier;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ThemeColorProvider; import org.chromium.chrome.browser.ThemeColorProvider;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
import org.chromium.chrome.browser.identity_disc.IdentityDiscController;
import org.chromium.chrome.browser.incognito.IncognitoUtils; import org.chromium.chrome.browser.incognito.IncognitoUtils;
import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.toolbar.ButtonData;
import org.chromium.chrome.browser.toolbar.IncognitoStateProvider; import org.chromium.chrome.browser.toolbar.IncognitoStateProvider;
import org.chromium.chrome.browser.toolbar.TabCountProvider; import org.chromium.chrome.browser.toolbar.TabCountProvider;
import org.chromium.chrome.browser.toolbar.TabSwitcherButtonCoordinator; import org.chromium.chrome.browser.toolbar.TabSwitcherButtonCoordinator;
...@@ -53,9 +55,11 @@ public class StartSurfaceToolbarCoordinator { ...@@ -53,9 +55,11 @@ public class StartSurfaceToolbarCoordinator {
private CallbackController mCallbackController = new CallbackController(); private CallbackController mCallbackController = new CallbackController();
StartSurfaceToolbarCoordinator(ViewStub startSurfaceToolbarStub, StartSurfaceToolbarCoordinator(ViewStub startSurfaceToolbarStub,
IdentityDiscController identityDiscController, UserEducationHelper userEducationHelper, UserEducationHelper userEducationHelper,
OneshotSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier, OneshotSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier,
ThemeColorProvider provider, MenuButtonCoordinator menuButtonCoordinator) { ObservableSupplier<Boolean> identityDiscStateSupplier, ThemeColorProvider provider,
MenuButtonCoordinator menuButtonCoordinator,
Supplier<ButtonData> identityDiscButtonSupplier) {
mStub = startSurfaceToolbarStub; mStub = startSurfaceToolbarStub;
overviewModeBehaviorSupplier.onAvailable( overviewModeBehaviorSupplier.onAvailable(
...@@ -78,7 +82,7 @@ public class StartSurfaceToolbarCoordinator { ...@@ -78,7 +82,7 @@ public class StartSurfaceToolbarCoordinator {
// should not be both true. // should not be both true.
assert !(StartSurfaceConfiguration.START_SURFACE_HIDE_INCOGNITO_SWITCH_NO_TAB.getValue() assert !(StartSurfaceConfiguration.START_SURFACE_HIDE_INCOGNITO_SWITCH_NO_TAB.getValue()
&& StartSurfaceConfiguration.START_SURFACE_SHOW_STACK_TAB_SWITCHER.getValue()); && StartSurfaceConfiguration.START_SURFACE_SHOW_STACK_TAB_SWITCHER.getValue());
mToolbarMediator = new StartSurfaceToolbarMediator(mPropertyModel, identityDiscController, mToolbarMediator = new StartSurfaceToolbarMediator(mPropertyModel,
(iphCommandBuilder) (iphCommandBuilder)
-> { -> {
// TODO(crbug.com/865801): Replace the null check with an assert after fixing or // TODO(crbug.com/865801): Replace the null check with an assert after fixing or
...@@ -90,7 +94,7 @@ public class StartSurfaceToolbarCoordinator { ...@@ -90,7 +94,7 @@ public class StartSurfaceToolbarCoordinator {
StartSurfaceConfiguration.START_SURFACE_HIDE_INCOGNITO_SWITCH_NO_TAB.getValue(), StartSurfaceConfiguration.START_SURFACE_HIDE_INCOGNITO_SWITCH_NO_TAB.getValue(),
StartSurfaceConfiguration.START_SURFACE_HIDE_INCOGNITO_SWITCH.getValue(), StartSurfaceConfiguration.START_SURFACE_HIDE_INCOGNITO_SWITCH.getValue(),
StartSurfaceConfiguration.START_SURFACE_SHOW_STACK_TAB_SWITCHER.getValue(), StartSurfaceConfiguration.START_SURFACE_SHOW_STACK_TAB_SWITCHER.getValue(),
menuButtonCoordinator); menuButtonCoordinator, identityDiscStateSupplier, identityDiscButtonSupplier);
mThemeColorProvider = provider; mThemeColorProvider = provider;
mMenuButtonCoordinator = menuButtonCoordinator; mMenuButtonCoordinator = menuButtonCoordinator;
......
...@@ -26,11 +26,12 @@ import android.view.View; ...@@ -26,11 +26,12 @@ import android.view.View;
import androidx.annotation.VisibleForTesting; 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.Supplier;
import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver; import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeState; import org.chromium.chrome.browser.compositor.layouts.OverviewModeState;
import org.chromium.chrome.browser.identity_disc.IdentityDiscController;
import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver; import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModel;
...@@ -47,11 +48,11 @@ import org.chromium.ui.modelutil.PropertyModel; ...@@ -47,11 +48,11 @@ import org.chromium.ui.modelutil.PropertyModel;
/** The mediator implements interacts between the views and the caller. */ /** The mediator implements interacts between the views and the caller. */
class StartSurfaceToolbarMediator { class StartSurfaceToolbarMediator {
private final PropertyModel mPropertyModel; private final PropertyModel mPropertyModel;
private final IdentityDiscController mIdentityDiscController;
private final Callback<IPHCommandBuilder> mShowIPHCallback; private final Callback<IPHCommandBuilder> mShowIPHCallback;
private final boolean mHideIncognitoSwitchWhenNoTabs; private final boolean mHideIncognitoSwitchWhenNoTabs;
private final boolean mHideIncognitoSwitchOnHomePage; private final boolean mHideIncognitoSwitchOnHomePage;
private final boolean mShowNewTabAndIdentityDiscAtStart; private final boolean mShowNewTabAndIdentityDiscAtStart;
private final Supplier<ButtonData> mIdentityDiscButtonSupplier;
private TabModelSelector mTabModelSelector; private TabModelSelector mTabModelSelector;
private TemplateUrlServiceObserver mTemplateUrlObserver; private TemplateUrlServiceObserver mTemplateUrlObserver;
...@@ -63,19 +64,24 @@ class StartSurfaceToolbarMediator { ...@@ -63,19 +64,24 @@ class StartSurfaceToolbarMediator {
private int mOverviewModeState; private int mOverviewModeState;
private boolean mIsGoogleSearchEngine; private boolean mIsGoogleSearchEngine;
StartSurfaceToolbarMediator(PropertyModel model, IdentityDiscController identityDiscController, StartSurfaceToolbarMediator(PropertyModel model, Callback<IPHCommandBuilder> showIPHCallback,
Callback<IPHCommandBuilder> showIPHCallback, boolean hideIncognitoSwitchWhenNoTabs, boolean hideIncognitoSwitchWhenNoTabs, boolean hideIncognitoSwitchOnHomePage,
boolean hideIncognitoSwitchOnHomePage, boolean showNewTabAndIdentityDiscAtStart, boolean showNewTabAndIdentityDiscAtStart, MenuButtonCoordinator menuButtonCoordinator,
MenuButtonCoordinator menuButtonCoordinator) { ObservableSupplier<Boolean> identityDiscStateSupplier,
Supplier<ButtonData> identityDiscButtonSupplier) {
mPropertyModel = model; mPropertyModel = model;
mOverviewModeState = OverviewModeState.NOT_SHOWN; mOverviewModeState = OverviewModeState.NOT_SHOWN;
mIdentityDiscController = identityDiscController;
mIdentityDiscController.addObserver(this::identityDiscStateChanged);
mShowIPHCallback = showIPHCallback; mShowIPHCallback = showIPHCallback;
mHideIncognitoSwitchWhenNoTabs = hideIncognitoSwitchWhenNoTabs; mHideIncognitoSwitchWhenNoTabs = hideIncognitoSwitchWhenNoTabs;
mHideIncognitoSwitchOnHomePage = hideIncognitoSwitchOnHomePage; mHideIncognitoSwitchOnHomePage = hideIncognitoSwitchOnHomePage;
mShowNewTabAndIdentityDiscAtStart = showNewTabAndIdentityDiscAtStart; mShowNewTabAndIdentityDiscAtStart = showNewTabAndIdentityDiscAtStart;
mMenuButtonCoordinator = menuButtonCoordinator; mMenuButtonCoordinator = menuButtonCoordinator;
mIdentityDiscButtonSupplier = identityDiscButtonSupplier;
identityDiscStateSupplier.addObserver((canShowHint) -> {
// If the identity disc wants to be hidden and is hidden, there's nothing we need to do.
if (!canShowHint && !mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)) return;
updateIdentityDisc(mIdentityDiscButtonSupplier.get());
});
} }
void onNativeLibraryReady() { void onNativeLibraryReady() {
...@@ -117,14 +123,13 @@ class StartSurfaceToolbarMediator { ...@@ -117,14 +123,13 @@ class StartSurfaceToolbarMediator {
@Override @Override
public void onTabModelSelected(TabModel newModel, TabModel oldModel) { public void onTabModelSelected(TabModel newModel, TabModel oldModel) {
mPropertyModel.set(IS_INCOGNITO, mTabModelSelector.isIncognitoSelected()); mPropertyModel.set(IS_INCOGNITO, mTabModelSelector.isIncognitoSelected());
updateIdentityDisc( updateIdentityDisc(mIdentityDiscButtonSupplier.get());
mIdentityDiscController.getForStartSurface(mOverviewModeState));
updateIncognitoSwitchVisibility(); updateIncognitoSwitchVisibility();
} }
}; };
} }
mPropertyModel.set(IS_INCOGNITO, mTabModelSelector.isIncognitoSelected()); mPropertyModel.set(IS_INCOGNITO, mTabModelSelector.isIncognitoSelected());
updateIdentityDisc(mIdentityDiscController.getForStartSurface(mOverviewModeState)); updateIdentityDisc(mIdentityDiscButtonSupplier.get());
mTabModelSelector.addObserver(mTabModelSelectorObserver); mTabModelSelector.addObserver(mTabModelSelectorObserver);
} }
...@@ -186,7 +191,7 @@ class StartSurfaceToolbarMediator { ...@@ -186,7 +191,7 @@ class StartSurfaceToolbarMediator {
updateIncognitoSwitchVisibility(); updateIncognitoSwitchVisibility();
updateNewTabButtonVisibility(); updateNewTabButtonVisibility();
updateLogoVisibility(mIsGoogleSearchEngine); updateLogoVisibility(mIsGoogleSearchEngine);
updateIdentityDisc(mIdentityDiscController.getForStartSurface(mOverviewModeState)); updateIdentityDisc(mIdentityDiscButtonSupplier.get());
} }
@Override @Override
public void onOverviewModeStartedShowing(boolean showToolbar) { public void onOverviewModeStartedShowing(boolean showToolbar) {
...@@ -225,14 +230,7 @@ class StartSurfaceToolbarMediator { ...@@ -225,14 +230,7 @@ class StartSurfaceToolbarMediator {
mPropertyModel.set(LOGO_IS_VISIBLE, shouldShowLogo); mPropertyModel.set(LOGO_IS_VISIBLE, shouldShowLogo);
} }
@VisibleForTesting @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
void identityDiscStateChanged(boolean canShowHint) {
// If the identity disc wants to be hidden and is hidden, there's nothing we need to do.
if (!canShowHint && !mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE)) return;
updateIdentityDisc(mIdentityDiscController.getForStartSurface(mOverviewModeState));
}
@VisibleForTesting
void updateIdentityDisc(ButtonData buttonData) { void updateIdentityDisc(ButtonData buttonData) {
boolean shouldShow = buttonData.canShow && !mTabModelSelector.isIncognitoSelected(); boolean shouldShow = buttonData.canShow && !mTabModelSelector.isIncognitoSelected();
if (shouldShow) { if (shouldShow) {
...@@ -259,4 +257,10 @@ class StartSurfaceToolbarMediator { ...@@ -259,4 +257,10 @@ class StartSurfaceToolbarMediator {
|| ChromeAccessibilityUtil.get().isAccessibilityEnabled(); || ChromeAccessibilityUtil.get().isAccessibilityEnabled();
mPropertyModel.set(NEW_TAB_BUTTON_IS_VISIBLE, isShownTabswitcherState); mPropertyModel.set(NEW_TAB_BUTTON_IS_VISIBLE, isShownTabswitcherState);
} }
@VisibleForTesting
@OverviewModeState
int getOverviewModeStateForTesting() {
return mOverviewModeState;
}
} }
...@@ -17,20 +17,20 @@ import android.view.View; ...@@ -17,20 +17,20 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import androidx.annotation.CallSuper; import androidx.annotation.CallSuper;
import androidx.annotation.ColorRes; import androidx.annotation.ColorRes;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import org.chromium.base.Callback;
import org.chromium.base.ObserverList; import org.chromium.base.ObserverList;
import org.chromium.base.TraceEvent; import org.chromium.base.TraceEvent;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ThemeColorProvider; import org.chromium.chrome.browser.ThemeColorProvider;
import org.chromium.chrome.browser.ThemeColorProvider.ThemeColorObserver; import org.chromium.chrome.browser.ThemeColorProvider.ThemeColorObserver;
import org.chromium.chrome.browser.ThemeColorProvider.TintObserver; import org.chromium.chrome.browser.ThemeColorProvider.TintObserver;
import org.chromium.chrome.browser.compositor.Invalidator;
import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
import org.chromium.chrome.browser.findinpage.FindToolbar;
import org.chromium.chrome.browser.ntp.NewTabPage; import org.chromium.chrome.browser.ntp.NewTabPage;
import org.chromium.chrome.browser.omnibox.LocationBar; import org.chromium.chrome.browser.omnibox.LocationBar;
import org.chromium.chrome.browser.omnibox.UrlBarData; import org.chromium.chrome.browser.omnibox.UrlBarData;
...@@ -58,7 +58,7 @@ import org.chromium.ui.base.ViewUtils; ...@@ -58,7 +58,7 @@ import org.chromium.ui.base.ViewUtils;
*/ */
public abstract class ToolbarLayout public abstract class ToolbarLayout
extends FrameLayout implements TintObserver, ThemeColorObserver { extends FrameLayout implements TintObserver, ThemeColorObserver {
private Invalidator mInvalidator; private Callback<Runnable> mInvalidator;
protected final ObserverList<UrlExpansionObserver> mUrlExpansionObservers = protected final ObserverList<UrlExpansionObserver> mUrlExpansionObservers =
new ObserverList<>(); new ObserverList<>();
...@@ -411,7 +411,7 @@ public abstract class ToolbarLayout ...@@ -411,7 +411,7 @@ public abstract class ToolbarLayout
* {@link Invalidator} a chance to defer the actual invalidate to sync drawing. * {@link Invalidator} a chance to defer the actual invalidate to sync drawing.
* @param invalidator An {@link Invalidator} instance. * @param invalidator An {@link Invalidator} instance.
*/ */
void setPaintInvalidator(Invalidator invalidator) { void setInvalidatorCallback(Callback<Runnable> invalidator) {
mInvalidator = invalidator; mInvalidator = invalidator;
} }
...@@ -420,12 +420,8 @@ public abstract class ToolbarLayout ...@@ -420,12 +420,8 @@ public abstract class ToolbarLayout
* {@link #setPaintInvalidator(Invalidator)} to decide when to actually invalidate. * {@link #setPaintInvalidator(Invalidator)} to decide when to actually invalidate.
* @param client A {@link Invalidator.Client} instance that wants to be invalidated. * @param client A {@link Invalidator.Client} instance that wants to be invalidated.
*/ */
void triggerPaintInvalidate(Invalidator.Client client) { protected void triggerPaintInvalidate(Runnable clientInvalidator) {
if (mInvalidator == null) { mInvalidator.onResult(clientInvalidator);
client.doInvalidate();
} else {
mInvalidator.invalidate(client);
}
} }
/** /**
...@@ -603,7 +599,7 @@ public abstract class ToolbarLayout ...@@ -603,7 +599,7 @@ public abstract class ToolbarLayout
return false; return false;
} }
void setLayoutUpdateHost(LayoutUpdateHost layoutUpdateHost) {} void setLayoutUpdater(Runnable layoutUpdater) {}
void setOverviewModeBehavior(OverviewModeBehavior overviewModeBehavior) {} void setOverviewModeBehavior(OverviewModeBehavior overviewModeBehavior) {}
......
...@@ -49,8 +49,6 @@ import org.chromium.base.ApiCompatibilityUtils; ...@@ -49,8 +49,6 @@ import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.MathUtils; import org.chromium.base.MathUtils;
import org.chromium.base.TraceEvent; import org.chromium.base.TraceEvent;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.compositor.Invalidator;
import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.device.DeviceClassManager;
import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
...@@ -90,9 +88,8 @@ import java.util.List; ...@@ -90,9 +88,8 @@ import java.util.List;
/** /**
* Phone specific toolbar implementation. * Phone specific toolbar implementation.
*/ */
public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, OnClickListener, public class ToolbarPhone extends ToolbarLayout
NewTabPage.OnSearchBoxScrollListener, implements OnClickListener, NewTabPage.OnSearchBoxScrollListener, TabCountObserver {
TabCountObserver {
/** The amount of time transitioning from one theme color to another should take in ms. */ /** The amount of time transitioning from one theme color to another should take in ms. */
public static final long THEME_COLOR_TRANSITION_DURATION = 250; public static final long THEME_COLOR_TRANSITION_DURATION = 250;
...@@ -240,7 +237,7 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O ...@@ -240,7 +237,7 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O
private boolean mIsHomeButtonEnabled; private boolean mIsHomeButtonEnabled;
private LayoutUpdateHost mLayoutUpdateHost; private Runnable mLayoutUpdater;
/** The vertical inset of the location bar background. */ /** The vertical inset of the location bar background. */
private int mLocationBarBackgroundVerticalInset; private int mLocationBarBackgroundVerticalInset;
...@@ -311,7 +308,7 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O ...@@ -311,7 +308,7 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O
@Override @Override
public void set(ToolbarPhone object, Float value) { public void set(ToolbarPhone object, Float value) {
object.mTabSwitcherModePercent = value; object.mTabSwitcherModePercent = value;
triggerPaintInvalidate(ToolbarPhone.this); triggerPaintInvalidate(ToolbarPhone.this::postInvalidateOnAnimation);
} }
}; };
...@@ -1322,11 +1319,6 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O ...@@ -1322,11 +1319,6 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O
canvas.restore(); canvas.restore();
} }
@Override
public void doInvalidate() {
postInvalidateOnAnimation();
}
/** /**
* Translates the canvas to ensure the specified view's coordinates are at 0, 0. * Translates the canvas to ensure the specified view's coordinates are at 0, 0.
* *
...@@ -1576,8 +1568,8 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O ...@@ -1576,8 +1568,8 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O
} }
@Override @Override
public void setLayoutUpdateHost(LayoutUpdateHost layoutUpdateHost) { public void setLayoutUpdater(Runnable layoutUpdater) {
mLayoutUpdateHost = layoutUpdateHost; mLayoutUpdater = layoutUpdater;
} }
@Override @Override
...@@ -1654,7 +1646,7 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O ...@@ -1654,7 +1646,7 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O
// TODO(amaralp): Have the LocationBar listen to tint changes. // TODO(amaralp): Have the LocationBar listen to tint changes.
if (mLocationBar != null) mLocationBar.updateVisualsForState(); if (mLocationBar != null) mLocationBar.updateVisualsForState();
if (mLayoutUpdateHost != null) mLayoutUpdateHost.requestUpdate(); if (mLayoutUpdater != null) mLayoutUpdater.run();
} }
@Override @Override
...@@ -1730,7 +1722,7 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O ...@@ -1730,7 +1722,7 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O
// Request a texture update to ensure a texture is captured before the user // Request a texture update to ensure a texture is captured before the user
// re-enters the tab switcher. // re-enters the tab switcher.
postInvalidate(); postInvalidate();
mLayoutUpdateHost.requestUpdate(); mLayoutUpdater.run();
} }
@Override @Override
...@@ -2294,7 +2286,7 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O ...@@ -2294,7 +2286,7 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O
}); });
mBrandColorTransitionAnimation.start(); mBrandColorTransitionAnimation.start();
mBrandColorTransitionActive = true; mBrandColorTransitionActive = true;
if (mLayoutUpdateHost != null) mLayoutUpdateHost.requestUpdate(); if (mLayoutUpdater != null) mLayoutUpdater.run();
} }
private void updateNtpAnimationState() { private void updateNtpAnimationState() {
...@@ -2462,8 +2454,8 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O ...@@ -2462,8 +2454,8 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O
// Refresh the toolbar texture. // Refresh the toolbar texture.
if ((mVisualState == VisualState.BRAND_COLOR || visualStateChanged) if ((mVisualState == VisualState.BRAND_COLOR || visualStateChanged)
&& mLayoutUpdateHost != null) { && mLayoutUpdater != null) {
mLayoutUpdateHost.requestUpdate(); mLayoutUpdater.run();
} }
updateShadowVisibility(); updateShadowVisibility();
updateUrlExpansionAnimation(); updateUrlExpansionAnimation();
...@@ -2602,7 +2594,7 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O ...@@ -2602,7 +2594,7 @@ public class ToolbarPhone extends ToolbarLayout implements Invalidator.Client, O
} }
private void requestLayoutHostUpdateForOptionalButton() { private void requestLayoutHostUpdateForOptionalButton() {
if (mLayoutUpdateHost != null) mLayoutUpdateHost.requestUpdate(); if (mLayoutUpdater != null) mLayoutUpdater.run();
getViewTreeObserver().removeOnGlobalLayoutListener(mOptionalButtonLayoutListener); getViewTreeObserver().removeOnGlobalLayoutListener(mOptionalButtonLayoutListener);
} }
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
package org.chromium.chrome.browser.toolbar.top; package org.chromium.chrome.browser.toolbar.top;
import android.content.Context;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.view.View; import android.view.View;
...@@ -14,20 +13,18 @@ import android.view.View.OnLongClickListener; ...@@ -14,20 +13,18 @@ import android.view.View.OnLongClickListener;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import org.chromium.base.Callback;
import org.chromium.base.CallbackController; import org.chromium.base.CallbackController;
import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.base.supplier.OneShotCallback; import org.chromium.base.supplier.OneShotCallback;
import org.chromium.base.supplier.OneshotSupplier; import org.chromium.base.supplier.OneshotSupplier;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ThemeColorProvider; import org.chromium.chrome.browser.ThemeColorProvider;
import org.chromium.chrome.browser.compositor.Invalidator;
import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
import org.chromium.chrome.browser.findinpage.FindToolbar;
import org.chromium.chrome.browser.homepage.HomepageManager;
import org.chromium.chrome.browser.identity_disc.IdentityDiscController;
import org.chromium.chrome.browser.omnibox.LocationBar; import org.chromium.chrome.browser.omnibox.LocationBar;
import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.toolbar.ButtonData;
import org.chromium.chrome.browser.toolbar.ButtonDataProvider; import org.chromium.chrome.browser.toolbar.ButtonDataProvider;
import org.chromium.chrome.browser.toolbar.IncognitoStateProvider; import org.chromium.chrome.browser.toolbar.IncognitoStateProvider;
import org.chromium.chrome.browser.toolbar.TabCountProvider; import org.chromium.chrome.browser.toolbar.TabCountProvider;
...@@ -75,7 +72,6 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -75,7 +72,6 @@ public class TopToolbarCoordinator implements Toolbar {
*/ */
private @Nullable StartSurfaceToolbarCoordinator mStartSurfaceToolbarCoordinator; private @Nullable StartSurfaceToolbarCoordinator mStartSurfaceToolbarCoordinator;
private final IdentityDiscController mIdentityDiscController;
private OptionalBrowsingModeButtonController mOptionalButtonController; private OptionalBrowsingModeButtonController mOptionalButtonController;
private MenuButtonCoordinator mMenuButtonCoordinator; private MenuButtonCoordinator mMenuButtonCoordinator;
...@@ -83,19 +79,10 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -83,19 +79,10 @@ public class TopToolbarCoordinator implements Toolbar {
private CallbackController mCallbackController = new CallbackController(); private CallbackController mCallbackController = new CallbackController();
private ObservableSupplier<TabModelSelector> mTabModelSelectorSupplier; private ObservableSupplier<TabModelSelector> mTabModelSelectorSupplier;
private HomepageManager.HomepageStateListener mHomepageStateListener =
new HomepageManager.HomepageStateListener() {
@Override
public void onHomepageStateUpdated() {
mToolbarLayout.onHomeButtonUpdate(HomepageManager.isHomepageEnabled());
}
};
/** /**
* Creates a new {@link TopToolbarCoordinator}. * Creates a new {@link TopToolbarCoordinator}.
* @param controlContainer The {@link ToolbarControlContainer} for the containing activity. * @param controlContainer The {@link ToolbarControlContainer} for the containing activity.
* @param toolbarLayout The {@link ToolbarLayout}. * @param toolbarLayout The {@link ToolbarLayout}.
* @param identityDiscController Class that controls the state of the identity disc.
* @param userEducationHelper Helper class for showing in-product help text bubbles. * @param userEducationHelper Helper class for showing in-product help text bubbles.
* @param buttonDataProviders List of classes that wish to display an optional button in the * @param buttonDataProviders List of classes that wish to display an optional button in the
* browsing mode toolbar. * browsing mode toolbar.
...@@ -104,20 +91,29 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -104,20 +91,29 @@ public class TopToolbarCoordinator implements Toolbar {
* @param normalThemeColorProvider The {@link ThemeColorProvider} for normal mode. * @param normalThemeColorProvider The {@link ThemeColorProvider} for normal mode.
* @param overviewThemeColorProvider The {@link ThemeColorProvider} for overview mode. * @param overviewThemeColorProvider The {@link ThemeColorProvider} for overview mode.
* @param tabModelSelectorSupplier Supplier of the {@link TabModelSelector}. * @param tabModelSelectorSupplier Supplier of the {@link TabModelSelector}.
* @param homeButtonVisibilitySupplier Supplier of the visibility change of Home button.
* @param identityDiscStateSupplier Supplier of the state change of identity disc button.
* @param invalidatorCallback Callback that will be invoked when the toolbar attempts to
* invalidate the drawing surface. This will give the object that registers as the host
* for the {@link Invalidator} a chance to defer the actual invalidate to sync drawing.
* @param identityDiscButtonSupplier Supplier of Identity Disc button.
*/ */
public TopToolbarCoordinator(ToolbarControlContainer controlContainer, public TopToolbarCoordinator(ToolbarControlContainer controlContainer,
ToolbarLayout toolbarLayout, IdentityDiscController identityDiscController, ToolbarLayout toolbarLayout, ToolbarDataProvider toolbarDataProvider,
ToolbarDataProvider toolbarDataProvider, ToolbarTabController tabController, ToolbarTabController tabController, UserEducationHelper userEducationHelper,
UserEducationHelper userEducationHelper, List<ButtonDataProvider> buttonDataProviders, List<ButtonDataProvider> buttonDataProviders,
OneshotSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier, OneshotSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier,
ThemeColorProvider normalThemeColorProvider, ThemeColorProvider normalThemeColorProvider,
ThemeColorProvider overviewThemeColorProvider, ThemeColorProvider overviewThemeColorProvider,
MenuButtonCoordinator browsingModeMenuButtonCoordinator, MenuButtonCoordinator browsingModeMenuButtonCoordinator,
MenuButtonCoordinator startSurfaceMenuButtonCoordinator, MenuButtonCoordinator startSurfaceMenuButtonCoordinator,
ObservableSupplier<AppMenuButtonHelper> appMenuButtonHelperSupplier, Context context, ObservableSupplier<AppMenuButtonHelper> appMenuButtonHelperSupplier,
ObservableSupplier<TabModelSelector> tabModelSelectorSupplier) { ObservableSupplier<TabModelSelector> tabModelSelectorSupplier,
ObservableSupplier<Boolean> homeButtonVisibilitySupplier,
ObservableSupplier<Boolean> identityDiscStateSupplier,
Callback<Runnable> invalidatorCallback,
Supplier<ButtonData> identityDiscButtonSupplier) {
mToolbarLayout = toolbarLayout; mToolbarLayout = toolbarLayout;
mIdentityDiscController = identityDiscController;
mMenuButtonCoordinator = browsingModeMenuButtonCoordinator; mMenuButtonCoordinator = browsingModeMenuButtonCoordinator;
mOptionalButtonController = new OptionalBrowsingModeButtonController(buttonDataProviders, mOptionalButtonController = new OptionalBrowsingModeButtonController(buttonDataProviders,
userEducationHelper, mToolbarLayout, () -> toolbarDataProvider.getTab()); userEducationHelper, mToolbarLayout, () -> toolbarDataProvider.getTab());
...@@ -131,8 +127,9 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -131,8 +127,9 @@ public class TopToolbarCoordinator implements Toolbar {
if (StartSurfaceConfiguration.isStartSurfaceEnabled()) { if (StartSurfaceConfiguration.isStartSurfaceEnabled()) {
mStartSurfaceToolbarCoordinator = new StartSurfaceToolbarCoordinator( mStartSurfaceToolbarCoordinator = new StartSurfaceToolbarCoordinator(
controlContainer.getRootView().findViewById(R.id.tab_switcher_toolbar_stub), controlContainer.getRootView().findViewById(R.id.tab_switcher_toolbar_stub),
mIdentityDiscController, userEducationHelper, overviewModeBehaviorSupplier, userEducationHelper, overviewModeBehaviorSupplier,
overviewThemeColorProvider, startSurfaceMenuButtonCoordinator); identityDiscStateSupplier, overviewThemeColorProvider,
startSurfaceMenuButtonCoordinator, identityDiscButtonSupplier);
} else { } else {
mTabSwitcherModeCoordinatorPhone = new TabSwitcherModeTTCoordinatorPhone( mTabSwitcherModeCoordinatorPhone = new TabSwitcherModeTTCoordinatorPhone(
controlContainer.getRootView().findViewById( controlContainer.getRootView().findViewById(
...@@ -140,12 +137,13 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -140,12 +137,13 @@ public class TopToolbarCoordinator implements Toolbar {
} }
} }
controlContainer.setToolbar(this); controlContainer.setToolbar(this);
HomepageManager.getInstance().addListener(mHomepageStateListener);
mToolbarLayout.initialize(toolbarDataProvider, tabController, mMenuButtonCoordinator); mToolbarLayout.initialize(toolbarDataProvider, tabController, mMenuButtonCoordinator);
mToolbarLayout.setThemeColorProvider(normalThemeColorProvider); mToolbarLayout.setThemeColorProvider(normalThemeColorProvider);
mAppMenuButtonHelperSupplier = appMenuButtonHelperSupplier; mAppMenuButtonHelperSupplier = appMenuButtonHelperSupplier;
new OneShotCallback<>(mAppMenuButtonHelperSupplier, this::setAppMenuButtonHelper); new OneShotCallback<>(mAppMenuButtonHelperSupplier, this::setAppMenuButtonHelper);
homeButtonVisibilitySupplier.addObserver((show) -> mToolbarLayout.onHomeButtonUpdate(show));
mToolbarLayout.setInvalidatorCallback(invalidatorCallback);
} }
/** /**
...@@ -163,14 +161,14 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -163,14 +161,14 @@ public class TopToolbarCoordinator implements Toolbar {
* <p> * <p>
* Calling this must occur after the native library have completely loaded. * Calling this must occur after the native library have completely loaded.
* *
* @param layoutManager A {@link LayoutManager} instance used to watch for scene changes. * @param layoutUpdater A {@link Runnable} used to request layout update upon scene change.
* @param tabSwitcherClickHandler The click handler for the tab switcher button. * @param tabSwitcherClickHandler The click handler for the tab switcher button.
* @param tabSwitcherLongClickHandler The long click handler for the tab switcher button. * @param tabSwitcherLongClickHandler The long click handler for the tab switcher button.
* @param newTabClickHandler The click handler for the new tab button. * @param newTabClickHandler The click handler for the new tab button.
* @param bookmarkClickHandler The click handler for the bookmarks button. * @param bookmarkClickHandler The click handler for the bookmarks button.
* @param customTabsBackClickHandler The click handler for the custom tabs back button. * @param customTabsBackClickHandler The click handler for the custom tabs back button.
*/ */
public void initializeWithNative(LayoutManager layoutManager, public void initializeWithNative(Runnable layoutUpdater,
OnClickListener tabSwitcherClickHandler, OnClickListener tabSwitcherClickHandler,
OnLongClickListener tabSwitcherLongClickHandler, OnClickListener newTabClickHandler, OnLongClickListener tabSwitcherLongClickHandler, OnClickListener newTabClickHandler,
OnClickListener bookmarkClickHandler, OnClickListener customTabsBackClickHandler) { OnClickListener bookmarkClickHandler, OnClickListener customTabsBackClickHandler) {
...@@ -195,7 +193,7 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -195,7 +193,7 @@ public class TopToolbarCoordinator implements Toolbar {
mToolbarLayout.setOnTabSwitcherLongClickHandler(tabSwitcherLongClickHandler); mToolbarLayout.setOnTabSwitcherLongClickHandler(tabSwitcherLongClickHandler);
mToolbarLayout.setBookmarkClickHandler(bookmarkClickHandler); mToolbarLayout.setBookmarkClickHandler(bookmarkClickHandler);
mToolbarLayout.setCustomTabCloseClickHandler(customTabsBackClickHandler); mToolbarLayout.setCustomTabCloseClickHandler(customTabsBackClickHandler);
mToolbarLayout.setLayoutUpdateHost(layoutManager); mToolbarLayout.setLayoutUpdater(layoutUpdater);
mToolbarLayout.onNativeLibraryReady(); mToolbarLayout.onNativeLibraryReady();
} }
...@@ -230,7 +228,6 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -230,7 +228,6 @@ public class TopToolbarCoordinator implements Toolbar {
* Cleans up any code as necessary. * Cleans up any code as necessary.
*/ */
public void destroy() { public void destroy() {
HomepageManager.getInstance().removeListener(mHomepageStateListener);
mToolbarLayout.destroy(); mToolbarLayout.destroy();
if (mTabSwitcherModeCoordinatorPhone != null) { if (mTabSwitcherModeCoordinatorPhone != null) {
mTabSwitcherModeCoordinatorPhone.destroy(); mTabSwitcherModeCoordinatorPhone.destroy();
...@@ -302,8 +299,8 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -302,8 +299,8 @@ public class TopToolbarCoordinator implements Toolbar {
* {@link Invalidator} a chance to defer the actual invalidate to sync drawing. * {@link Invalidator} a chance to defer the actual invalidate to sync drawing.
* @param invalidator An {@link Invalidator} instance. * @param invalidator An {@link Invalidator} instance.
*/ */
public void setPaintInvalidator(Invalidator invalidator) { public void setInvalidatorCallback(Callback<Runnable> callback) {
mToolbarLayout.setPaintInvalidator(invalidator); mToolbarLayout.setInvalidatorCallback(callback);
} }
/** /**
......
...@@ -41,6 +41,7 @@ import org.mockito.MockitoAnnotations; ...@@ -41,6 +41,7 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver;
...@@ -99,6 +100,7 @@ public class StartSurfaceToolbarMediatorUnitTest { ...@@ -99,6 +100,7 @@ public class StartSurfaceToolbarMediatorUnitTest {
private ButtonData mButtonData; private ButtonData mButtonData;
private ButtonData mDisabledButtonData; private ButtonData mDisabledButtonData;
private ObservableSupplierImpl<Boolean> mIdentityDiscStateSupplier;
@Before @Before
public void setUp() { public void setUp() {
...@@ -113,6 +115,7 @@ public class StartSurfaceToolbarMediatorUnitTest { ...@@ -113,6 +115,7 @@ public class StartSurfaceToolbarMediatorUnitTest {
.build(); .build();
mButtonData = new ButtonData(false, mDrawable, mOnClickListener, 0, false, null, true); mButtonData = new ButtonData(false, mDrawable, mOnClickListener, 0, false, null, true);
mDisabledButtonData = new ButtonData(false, null, null, 0, false, null, true); mDisabledButtonData = new ButtonData(false, null, null, 0, false, null, true);
mIdentityDiscStateSupplier = new ObservableSupplierImpl<>();
doReturn(mButtonData) doReturn(mButtonData)
.when(mIdentityDiscController) .when(mIdentityDiscController)
.getForStartSurface(OverviewModeState.SHOWN_HOMEPAGE); .getForStartSurface(OverviewModeState.SHOWN_HOMEPAGE);
...@@ -589,17 +592,17 @@ public class StartSurfaceToolbarMediatorUnitTest { ...@@ -589,17 +592,17 @@ public class StartSurfaceToolbarMediatorUnitTest {
assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false);
mButtonData.canShow = true; mButtonData.canShow = true;
mMediator.identityDiscStateChanged(true); mIdentityDiscStateSupplier.set(true);
assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), true); assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), true);
mButtonData.canShow = false; mButtonData.canShow = false;
mMediator.identityDiscStateChanged(false); mIdentityDiscStateSupplier.set(false);
assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false);
// updateIdentityDisc() should properly handle a hint that contradicts the true value of // updateIdentityDisc() should properly handle a hint that contradicts the true value of
// canShow. // canShow.
mButtonData.canShow = false; mButtonData.canShow = false;
mMediator.identityDiscStateChanged(true); mIdentityDiscStateSupplier.set(true);
assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false);
} }
...@@ -720,9 +723,12 @@ public class StartSurfaceToolbarMediatorUnitTest { ...@@ -720,9 +723,12 @@ public class StartSurfaceToolbarMediatorUnitTest {
private void createMediator(boolean hideIncognitoSwitchWhenNoTabs, private void createMediator(boolean hideIncognitoSwitchWhenNoTabs,
boolean hideIncognitoSwitchOnHomePage, boolean showNewTabAndIdentityDiscAtStart) { boolean hideIncognitoSwitchOnHomePage, boolean showNewTabAndIdentityDiscAtStart) {
mMediator = new StartSurfaceToolbarMediator(mPropertyModel, mIdentityDiscController, mMediator = new StartSurfaceToolbarMediator(mPropertyModel, mMockCallback,
mMockCallback, hideIncognitoSwitchWhenNoTabs, hideIncognitoSwitchOnHomePage, hideIncognitoSwitchWhenNoTabs, hideIncognitoSwitchOnHomePage,
showNewTabAndIdentityDiscAtStart, mMenuButtonCoordinator); showNewTabAndIdentityDiscAtStart, mMenuButtonCoordinator,
mIdentityDiscStateSupplier,
() -> mIdentityDiscController.getForStartSurface(
mMediator.getOverviewModeStateForTesting()));
mMediator.setOverviewModeBehavior(mOverviewModeBehavior); mMediator.setOverviewModeBehavior(mOverviewModeBehavior);
verify(mOverviewModeBehavior) verify(mOverviewModeBehavior)
.addOverviewModeObserver(mOverviewModeObserverCaptor.capture()); .addOverviewModeObserver(mOverviewModeObserverCaptor.capture());
......
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