Commit c9e84c85 authored by Jinsuk Kim's avatar Jinsuk Kim Committed by Chromium LUCI CQ

Reland "Toolbar: Apply modularized LayoutManager interface"

Relands the CL after fixing the build error. A new junit test
should have been a part of chrome_junit_tests suite, not a
separate binary.

This reverts commit 09d519a3.

TBR=yfriedman@chromium.org,fgorski@chromium.org,pnoland@chromium.org,mdjones@chromium.org

Bug: 1127732
Change-Id: I2a02771c30dc1b836263502ed64e44f5f1938b8b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2567077Reviewed-by: default avatarJinsuk Kim <jinsukkim@chromium.org>
Commit-Queue: Jinsuk Kim <jinsukkim@chromium.org>
Cr-Commit-Position: refs/heads/master@{#832229}
parent 0ae212b8
...@@ -828,6 +828,7 @@ junit_binary("chrome_junit_tests") { ...@@ -828,6 +828,7 @@ junit_binary("chrome_junit_tests") {
"//chrome/browser/signin/services/android:java", "//chrome/browser/signin/services/android:java",
"//chrome/browser/signin/services/android:junit", "//chrome/browser/signin/services/android:junit",
"//chrome/browser/tab:java", "//chrome/browser/tab:java",
"//chrome/browser/tab:junit",
"//chrome/browser/tabmodel:factory_java", "//chrome/browser/tabmodel:factory_java",
"//chrome/browser/tabmodel:java", "//chrome/browser/tabmodel:java",
"//chrome/browser/tabmodel/internal:java", "//chrome/browser/tabmodel/internal:java",
...@@ -3210,10 +3211,8 @@ generate_jni("chrome_jni_headers") { ...@@ -3210,10 +3211,8 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/compositor/LayerTitleCache.java", "java/src/org/chromium/chrome/browser/compositor/LayerTitleCache.java",
"java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java", "java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java",
"java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java", "java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java",
"java/src/org/chromium/chrome/browser/compositor/overlays/toolbar/TopToolbarSceneLayer.java",
"java/src/org/chromium/chrome/browser/compositor/resources/ResourceFactory.java", "java/src/org/chromium/chrome/browser/compositor/resources/ResourceFactory.java",
"java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java",
"java/src/org/chromium/chrome/browser/compositor/scene_layer/ScrollingBottomViewSceneLayer.java",
"java/src/org/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer.java",
"java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java",
"java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java",
...@@ -3393,6 +3392,8 @@ generate_jni("chrome_jni_headers") { ...@@ -3393,6 +3392,8 @@ generate_jni("chrome_jni_headers") {
"java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java", "java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java",
"java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java", "java/src/org/chromium/chrome/browser/tabmodel/TabModelObserverJniBridge.java",
"java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java", "java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java",
"java/src/org/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewSceneLayer.java",
"java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarSceneLayer.java",
"java/src/org/chromium/chrome/browser/translate/TranslateBridge.java", "java/src/org/chromium/chrome/browser/translate/TranslateBridge.java",
"java/src/org/chromium/chrome/browser/usage_stats/NotificationSuspender.java", "java/src/org/chromium/chrome/browser/usage_stats/NotificationSuspender.java",
"java/src/org/chromium/chrome/browser/usage_stats/UsageStatsBridge.java", "java/src/org/chromium/chrome/browser/usage_stats/UsageStatsBridge.java",
......
...@@ -336,14 +336,9 @@ chrome_java_sources = [ ...@@ -336,14 +336,9 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java", "java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java",
"java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripStacker.java", "java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripStacker.java",
"java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabLoadTracker.java", "java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabLoadTracker.java",
"java/src/org/chromium/chrome/browser/compositor/overlays/toolbar/TopToolbarOverlayCoordinator.java",
"java/src/org/chromium/chrome/browser/compositor/overlays/toolbar/TopToolbarOverlayMediator.java",
"java/src/org/chromium/chrome/browser/compositor/overlays/toolbar/TopToolbarOverlayProperties.java",
"java/src/org/chromium/chrome/browser/compositor/overlays/toolbar/TopToolbarSceneLayer.java",
"java/src/org/chromium/chrome/browser/compositor/resources/ResourceFactory.java", "java/src/org/chromium/chrome/browser/compositor/resources/ResourceFactory.java",
"java/src/org/chromium/chrome/browser/compositor/resources/StaticResourcePreloads.java", "java/src/org/chromium/chrome/browser/compositor/resources/StaticResourcePreloads.java",
"java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java",
"java/src/org/chromium/chrome/browser/compositor/scene_layer/ScrollingBottomViewSceneLayer.java",
"java/src/org/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer.java",
"java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java",
"java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java",
...@@ -1451,6 +1446,7 @@ chrome_java_sources = [ ...@@ -1451,6 +1446,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsProperties.java", "java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsProperties.java",
"java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsViewBinder.java", "java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsViewBinder.java",
"java/src/org/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewResourceFrameLayout.java", "java/src/org/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewResourceFrameLayout.java",
"java/src/org/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewSceneLayer.java",
"java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressCoordinator.java", "java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressCoordinator.java",
"java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java", "java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java",
"java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressProperties.java", "java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressProperties.java",
...@@ -1484,6 +1480,10 @@ chrome_java_sources = [ ...@@ -1484,6 +1480,10 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java", "java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java",
"java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java", "java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java",
"java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java", "java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java",
"java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java",
"java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java",
"java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayProperties.java",
"java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarSceneLayer.java",
"java/src/org/chromium/chrome/browser/toolbar/top/ViewShiftingActionBarDelegate.java", "java/src/org/chromium/chrome/browser/toolbar/top/ViewShiftingActionBarDelegate.java",
"java/src/org/chromium/chrome/browser/tracing/TracingController.java", "java/src/org/chromium/chrome/browser/tracing/TracingController.java",
"java/src/org/chromium/chrome/browser/tracing/TracingNotificationManager.java", "java/src/org/chromium/chrome/browser/tracing/TracingNotificationManager.java",
......
...@@ -46,7 +46,6 @@ chrome_junit_test_java_sources = [ ...@@ -46,7 +46,6 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/compositor/layouts/SceneOverlayTest.java", "junit/src/org/chromium/chrome/browser/compositor/layouts/SceneOverlayTest.java",
"junit/src/org/chromium/chrome/browser/compositor/layouts/StaticLayoutUnitTest.java", "junit/src/org/chromium/chrome/browser/compositor/layouts/StaticLayoutUnitTest.java",
"junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java", "junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java",
"junit/src/org/chromium/chrome/browser/compositor/overlays/toolbar/TopToolbarOverlayMediatorTest.java",
"junit/src/org/chromium/chrome/browser/content_capture/ContentCaptureHistoryDeletionObserverTest.java", "junit/src/org/chromium/chrome/browser/content_capture/ContentCaptureHistoryDeletionObserverTest.java",
"junit/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinatorTest.java", "junit/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinatorTest.java",
"junit/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediatorTest.java", "junit/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediatorTest.java",
...@@ -240,6 +239,7 @@ chrome_junit_test_java_sources = [ ...@@ -240,6 +239,7 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java", "junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java",
"junit/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java", "junit/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java",
"junit/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonTest.java", "junit/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonTest.java",
"junit/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java",
"junit/src/org/chromium/chrome/browser/usage_stats/EventTrackerTest.java", "junit/src/org/chromium/chrome/browser/usage_stats/EventTrackerTest.java",
"junit/src/org/chromium/chrome/browser/usage_stats/PageViewObserverTest.java", "junit/src/org/chromium/chrome/browser/usage_stats/PageViewObserverTest.java",
"junit/src/org/chromium/chrome/browser/webapps/MockWebappDataStorageClockRule.java", "junit/src/org/chromium/chrome/browser/webapps/MockWebappDataStorageClockRule.java",
......
...@@ -32,8 +32,6 @@ import org.chromium.chrome.browser.compositor.layouts.Layout.Orientation; ...@@ -32,8 +32,6 @@ import org.chromium.chrome.browser.compositor.layouts.Layout.Orientation;
import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab; import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab;
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.compositor.overlays.toolbar.TopToolbarOverlayCoordinator;
import org.chromium.chrome.browser.compositor.scene_layer.ScrollingBottomViewSceneLayer;
import org.chromium.chrome.browser.fullscreen.BrowserControlsManager; import org.chromium.chrome.browser.fullscreen.BrowserControlsManager;
import org.chromium.chrome.browser.gesturenav.HistoryNavigationCoordinator; import org.chromium.chrome.browser.gesturenav.HistoryNavigationCoordinator;
import org.chromium.chrome.browser.layouts.CompositorModelChangeProcessor; import org.chromium.chrome.browser.layouts.CompositorModelChangeProcessor;
...@@ -65,6 +63,8 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver; ...@@ -65,6 +63,8 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver;
import org.chromium.chrome.browser.tabmodel.TabModelUtils; import org.chromium.chrome.browser.tabmodel.TabModelUtils;
import org.chromium.chrome.browser.toolbar.ControlContainer; import org.chromium.chrome.browser.toolbar.ControlContainer;
import org.chromium.chrome.browser.toolbar.ToolbarColors; import org.chromium.chrome.browser.toolbar.ToolbarColors;
import org.chromium.chrome.browser.toolbar.bottom.ScrollingBottomViewSceneLayer;
import org.chromium.chrome.browser.toolbar.top.TopToolbarOverlayCoordinator;
import org.chromium.components.browser_ui.widget.gesture.SwipeGestureListener.SwipeHandler; import org.chromium.components.browser_ui.widget.gesture.SwipeGestureListener.SwipeHandler;
import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.embedder_support.util.UrlConstants;
import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.base.LocalizationUtils;
......
...@@ -55,7 +55,6 @@ import org.chromium.chrome.browser.signin.SigninPromoUtil; ...@@ -55,7 +55,6 @@ import org.chromium.chrome.browser.signin.SigninPromoUtil;
import org.chromium.chrome.browser.status_indicator.StatusIndicatorCoordinator; import org.chromium.chrome.browser.status_indicator.StatusIndicatorCoordinator;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities;
import org.chromium.chrome.browser.toolbar.ToolbarButtonInProductHelpController; import org.chromium.chrome.browser.toolbar.ToolbarButtonInProductHelpController;
import org.chromium.chrome.browser.ui.RootUiCoordinator; import org.chromium.chrome.browser.ui.RootUiCoordinator;
import org.chromium.chrome.browser.ui.appmenu.AppMenuHandler; import org.chromium.chrome.browser.ui.appmenu.AppMenuHandler;
...@@ -271,16 +270,6 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator { ...@@ -271,16 +270,6 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator {
mLayoutManager = layoutManager; mLayoutManager = layoutManager;
} }
@Override
protected void initializeToolbar() {
super.initializeToolbar();
if (!mActivity.isTablet()
&& (TabUiFeatureUtilities.isTabGroupsAndroidEnabled()
|| TabUiFeatureUtilities.isConditionalTabStripEnabled())) {
getToolbarManager().enableBottomControls();
}
}
@Override @Override
protected boolean shouldShowMenuUpdateBadge() { protected boolean shouldShowMenuUpdateBadge() {
return true; return true;
......
...@@ -7,28 +7,24 @@ package org.chromium.chrome.browser.toolbar.bottom; ...@@ -7,28 +7,24 @@ package org.chromium.chrome.browser.toolbar.bottom;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewStub; import android.view.ViewStub;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
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.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.browser_controls.BrowserControlsSizer; import org.chromium.chrome.browser.browser_controls.BrowserControlsSizer;
import org.chromium.chrome.browser.compositor.layouts.LayoutManagerImpl;
import org.chromium.chrome.browser.fullscreen.FullscreenManager; import org.chromium.chrome.browser.fullscreen.FullscreenManager;
import org.chromium.chrome.browser.layouts.LayoutManager;
import org.chromium.chrome.browser.layouts.LayoutStateProvider;
import org.chromium.chrome.browser.share.ShareDelegate; import org.chromium.chrome.browser.share.ShareDelegate;
import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider;
import org.chromium.chrome.browser.tasks.tab_management.TabGroupUi; import org.chromium.chrome.browser.tasks.tab_management.TabGroupUi;
import org.chromium.chrome.browser.tasks.tab_management.TabManagementModuleProvider; import org.chromium.chrome.browser.tasks.tab_management.TabManagementModuleProvider;
import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities;
import org.chromium.chrome.browser.toolbar.TabCountProvider;
import org.chromium.chrome.browser.toolbar.ThemeColorProvider; import org.chromium.chrome.browser.toolbar.ThemeColorProvider;
import org.chromium.chrome.browser.toolbar.bottom.BottomControlsViewBinder.ViewHolder; import org.chromium.chrome.browser.toolbar.bottom.BottomControlsViewBinder.ViewHolder;
import org.chromium.chrome.browser.ui.appmenu.AppMenuButtonHelper;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator; import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel;
...@@ -59,6 +55,8 @@ public class BottomControlsCoordinator { ...@@ -59,6 +55,8 @@ public class BottomControlsCoordinator {
/** /**
* Build the coordinator that manages the bottom controls. * Build the coordinator that manages the bottom controls.
* @param activity Activity instance to use.
* @param windowAndroid A {@link WindowAndroid} for watching keyboard visibility events.
* @param controlsSizer A {@link BrowserControlsSizer} to update the bottom controls * @param controlsSizer A {@link BrowserControlsSizer} to update the bottom controls
* height for the renderer. * height for the renderer.
* @param fullscreenManager A {@link FullscreenManager} to listen for fullscreen changes. * @param fullscreenManager A {@link FullscreenManager} to listen for fullscreen changes.
...@@ -66,36 +64,44 @@ public class BottomControlsCoordinator { ...@@ -66,36 +64,44 @@ public class BottomControlsCoordinator {
* @param themeColorProvider The {@link ThemeColorProvider} for the bottom toolbar. * @param themeColorProvider The {@link ThemeColorProvider} for the bottom toolbar.
* @param shareDelegateSupplier The supplier for the {@link ShareDelegate} the bottom controls * @param shareDelegateSupplier The supplier for the {@link ShareDelegate} the bottom controls
* should use to share content. * should use to share content.
* @param openHomepageAction The action that opens the homepage.
* @param setUrlBarFocusAction The function that sets Url bar focus. The first argument is
* whether the bar should be focused, and the second is the OmniboxFocusReason.
* @param scrimCoordinator The {@link ScrimCoordinator} to control scrim view. * @param scrimCoordinator The {@link ScrimCoordinator} to control scrim view.
* @param omniboxFocusStateSupplier Supplier to access the focus state of the omnibox. * @param omniboxFocusStateSupplier Supplier to access the focus state of the omnibox.
* @param overlayPanelVisibilitySupplier Notifies overlay panel visibility event.
* @param resourceManager A {@link ResourceManager} for loading textures into the compositor.
* @param layoutManager A {@link LayoutManagerImpl} to attach overlays to.
*/ */
@SuppressLint("CutPasteId") // Not actually cut and paste since it's View vs ViewGroup. @SuppressLint("CutPasteId") // Not actually cut and paste since it's View vs ViewGroup.
public BottomControlsCoordinator(BrowserControlsSizer controlsSizer, public BottomControlsCoordinator(Activity activity, WindowAndroid windowAndroid,
FullscreenManager fullscreenManager, ViewStub stub, LayoutManager layoutManager, ResourceManager resourceManager,
BrowserControlsSizer controlsSizer, FullscreenManager fullscreenManager, ViewStub stub,
ThemeColorProvider themeColorProvider, ThemeColorProvider themeColorProvider,
ObservableSupplier<ShareDelegate> shareDelegateSupplier, ObservableSupplier<ShareDelegate> shareDelegateSupplier,
ObservableSupplier<AppMenuButtonHelper> menuButtonHelperSupplier,
Runnable openHomepageAction, Callback<Integer> setUrlBarFocusAction,
ScrimCoordinator scrimCoordinator, ScrimCoordinator scrimCoordinator,
ObservableSupplier<Boolean> omniboxFocusStateSupplier) { ObservableSupplier<Boolean> omniboxFocusStateSupplier,
ObservableSupplier<Boolean> overlayPanelVisibilitySupplier) {
final ScrollingBottomViewResourceFrameLayout root = final ScrollingBottomViewResourceFrameLayout root =
(ScrollingBottomViewResourceFrameLayout) stub.inflate(); (ScrollingBottomViewResourceFrameLayout) stub.inflate();
PropertyModel model = new PropertyModel(BottomControlsProperties.ALL_KEYS); PropertyModel model = new PropertyModel(BottomControlsProperties.ALL_KEYS);
ScrollingBottomViewSceneLayer sceneLayer =
new ScrollingBottomViewSceneLayer(root, root.getTopShadowHeight());
PropertyModelChangeProcessor.create( PropertyModelChangeProcessor.create(
model, new ViewHolder(root), BottomControlsViewBinder::bind); model, new ViewHolder(root, sceneLayer), BottomControlsViewBinder::bind);
layoutManager.createCompositorMCP(
model, sceneLayer, BottomControlsViewBinder::bindCompositorMCP);
int bottomControlsHeightId = R.dimen.bottom_controls_height; int bottomControlsHeightId = R.dimen.bottom_controls_height;
View container = root.findViewById(R.id.bottom_container_slot); View container = root.findViewById(R.id.bottom_container_slot);
ViewGroup.LayoutParams params = container.getLayoutParams(); ViewGroup.LayoutParams params = container.getLayoutParams();
params.height = root.getResources().getDimensionPixelOffset(bottomControlsHeightId); params.height = root.getResources().getDimensionPixelOffset(bottomControlsHeightId);
mMediator = new BottomControlsMediator(model, controlsSizer, fullscreenManager, mMediator =
root.getResources().getDimensionPixelOffset(bottomControlsHeightId)); new BottomControlsMediator(windowAndroid, model, controlsSizer, fullscreenManager,
root.getResources().getDimensionPixelOffset(bottomControlsHeightId),
overlayPanelVisibilitySupplier);
resourceManager.getDynamicResourceLoader().registerResource(
root.getId(), root.getResourceAdapter());
if (TabUiFeatureUtilities.isTabGroupsAndroidEnabled() if (TabUiFeatureUtilities.isTabGroupsAndroidEnabled()
|| TabUiFeatureUtilities.isConditionalTabStripEnabled()) { || TabUiFeatureUtilities.isConditionalTabStripEnabled()) {
...@@ -108,42 +114,23 @@ public class BottomControlsCoordinator { ...@@ -108,42 +114,23 @@ public class BottomControlsCoordinator {
// Set the visibility of BottomControls to false by default. Components within // Set the visibility of BottomControls to false by default. Components within
// BottomControls should update the visibility explicitly if needed. // BottomControls should update the visibility explicitly if needed.
mMediator.setBottomControlsVisible(false); setBottomControlsVisible(false);
}
/** sceneLayer.setIsVisible(mMediator.isCompositedViewVisible());
* Initialize the bottom controls with the components that had native initialization layoutManager.addSceneOverlay(sceneLayer);
* dependencies.
* <p>
* Calling this must occur after the native library have completely loaded.
* @param activity Activity instance to use.
* @param resourceManager A {@link ResourceManager} for loading textures into the compositor.
* @param layoutManager A {@link LayoutManagerImpl} to attach overlays to.
* @param tabSwitcherListener An {@link OnClickListener} that is triggered when the
* bottom toolbar's tab switcher button is clicked.
* @param newTabClickListener An {@link OnClickListener} that is triggered when the
* bottom toolbar's new tab button is clicked.
* @param windowAndroid A {@link WindowAndroid} for watching keyboard visibility events.
* @param tabCountProvider Updates the tab count number in the tab switcher button and in the
* incognito toggle tab layout.
* @param incognitoStateProvider Notifies components when incognito mode is entered or exited.
* @param topToolbarRoot The root {@link ViewGroup} of the top toolbar.
* @param closeAllTabsAction The runnable that closes all tabs in the current tab model.
*/
public void initializeWithNative(Activity activity, ResourceManager resourceManager,
LayoutManagerImpl layoutManager, OnClickListener tabSwitcherListener,
OnClickListener newTabClickListener, WindowAndroid windowAndroid,
TabCountProvider tabCountProvider, IncognitoStateProvider incognitoStateProvider,
ViewGroup topToolbarRoot, Runnable closeAllTabsAction) {
mMediator.setLayoutManager(layoutManager);
mMediator.setResourceManager(resourceManager);
mMediator.setWindowAndroid(windowAndroid);
if (mTabGroupUi != null) { if (mTabGroupUi != null) {
mTabGroupUi.initializeWithNative(activity, mMediator::setBottomControlsVisible); mTabGroupUi.initializeWithNative(activity, mMediator::setBottomControlsVisible);
} }
} }
/**
* @param layoutStateProvider {@link LayoutStateProvider} object.
*/
public void setLayoutStateProvider(LayoutStateProvider layoutStateProvider) {
mMediator.setLayoutStateProvider(layoutStateProvider);
}
/** /**
* @param isVisible Whether the bottom control is visible. * @param isVisible Whether the bottom control is visible.
*/ */
......
...@@ -4,18 +4,17 @@ ...@@ -4,18 +4,17 @@
package org.chromium.chrome.browser.toolbar.bottom; package org.chromium.chrome.browser.toolbar.bottom;
import org.chromium.base.CallbackController;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.chrome.browser.browser_controls.BrowserControlsSizer; import org.chromium.chrome.browser.browser_controls.BrowserControlsSizer;
import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelManager;
import org.chromium.chrome.browser.compositor.layouts.Layout;
import org.chromium.chrome.browser.compositor.layouts.LayoutManagerImpl;
import org.chromium.chrome.browser.compositor.layouts.SceneChangeObserver;
import org.chromium.chrome.browser.compositor.layouts.ToolbarSwipeLayout;
import org.chromium.chrome.browser.fullscreen.FullscreenManager; import org.chromium.chrome.browser.fullscreen.FullscreenManager;
import org.chromium.chrome.browser.layouts.LayoutStateProvider;
import org.chromium.chrome.browser.layouts.LayoutStateProvider.LayoutStateObserver;
import org.chromium.chrome.browser.layouts.LayoutType;
import org.chromium.ui.KeyboardVisibilityDelegate; import org.chromium.ui.KeyboardVisibilityDelegate;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.resources.ResourceManager;
/** /**
* This class is responsible for reacting to events from the outside world, interacting with other * This class is responsible for reacting to events from the outside world, interacting with other
...@@ -24,8 +23,7 @@ import org.chromium.ui.resources.ResourceManager; ...@@ -24,8 +23,7 @@ import org.chromium.ui.resources.ResourceManager;
*/ */
class BottomControlsMediator implements BrowserControlsStateProvider.Observer, class BottomControlsMediator implements BrowserControlsStateProvider.Observer,
KeyboardVisibilityDelegate.KeyboardVisibilityListener, KeyboardVisibilityDelegate.KeyboardVisibilityListener,
SceneChangeObserver, LayoutStateObserver {
OverlayPanelManager.OverlayPanelManagerObserver {
/** The model for the bottom controls component that holds all of its view state. */ /** The model for the bottom controls component that holds all of its view state. */
private final PropertyModel mModel; private final PropertyModel mModel;
...@@ -35,13 +33,15 @@ class BottomControlsMediator implements BrowserControlsStateProvider.Observer, ...@@ -35,13 +33,15 @@ class BottomControlsMediator implements BrowserControlsStateProvider.Observer,
/** The browser controls sizer/manager to observe browser controls events. */ /** The browser controls sizer/manager to observe browser controls events. */
private final BrowserControlsSizer mBrowserControlsSizer; private final BrowserControlsSizer mBrowserControlsSizer;
private final CallbackController mCallbackController;
/** /**
* The height of the bottom bar in pixels, not including the top shadow. * The height of the bottom bar in pixels, not including the top shadow.
*/ */
private int mBottomControlsHeight; private int mBottomControlsHeight;
/** A {@link WindowAndroid} for watching keyboard visibility events. */ /** A {@link WindowAndroid} for watching keyboard visibility events. */
private WindowAndroid mWindowAndroid; private final WindowAndroid mWindowAndroid;
/** The bottom controls visibility. */ /** The bottom controls visibility. */
private boolean mIsBottomControlsVisible; private boolean mIsBottomControlsVisible;
...@@ -55,17 +55,22 @@ class BottomControlsMediator implements BrowserControlsStateProvider.Observer, ...@@ -55,17 +55,22 @@ class BottomControlsMediator implements BrowserControlsStateProvider.Observer,
/** Whether the soft keyboard is visible. */ /** Whether the soft keyboard is visible. */
private boolean mIsKeyboardVisible; private boolean mIsKeyboardVisible;
private LayoutStateProvider mLayoutStateProvider;
/** /**
* Build a new mediator that handles events from outside the bottom controls component. * Build a new mediator that handles events from outside the bottom controls component.
* @param windowAndroid A {@link WindowAndroid} for watching keyboard visibility events.
* @param model The {@link BottomControlsProperties} that holds all the view state for the * @param model The {@link BottomControlsProperties} that holds all the view state for the
* bottom controls component. * bottom controls component.
@param controlsSizer The {@link BrowserControlsSizer} to manipulate browser controls. * @param controlsSizer The {@link BrowserControlsSizer} to manipulate browser controls.
* @param fullscreenManager A {@link FullscreenManager} for events related to the browser * @param fullscreenManager A {@link FullscreenManager} for events related to the browser
* controls. * controls.
* @param bottomControlsHeight The height of the bottom bar in pixels. * @param bottomControlsHeight The height of the bottom bar in pixels.
* @param overlayPanelVisibilitySupplier Notifies overlay panel visibility event.
*/ */
BottomControlsMediator(PropertyModel model, BrowserControlsSizer controlsSizer, BottomControlsMediator(WindowAndroid windowAndroid, PropertyModel model,
FullscreenManager fullscreenManager, int bottomControlsHeight) { BrowserControlsSizer controlsSizer, FullscreenManager fullscreenManager,
int bottomControlsHeight, ObservableSupplier<Boolean> overlayPanelVisibilitySupplier) {
mModel = model; mModel = model;
mFullscreenManager = fullscreenManager; mFullscreenManager = fullscreenManager;
...@@ -73,23 +78,20 @@ class BottomControlsMediator implements BrowserControlsStateProvider.Observer, ...@@ -73,23 +78,20 @@ class BottomControlsMediator implements BrowserControlsStateProvider.Observer,
mBrowserControlsSizer.addObserver(this); mBrowserControlsSizer.addObserver(this);
mBottomControlsHeight = bottomControlsHeight; mBottomControlsHeight = bottomControlsHeight;
} mCallbackController = new CallbackController();
overlayPanelVisibilitySupplier.addObserver(mCallbackController.makeCancelable((showing) -> {
void setResourceManager(ResourceManager resourceManager) { mIsOverlayPanelShowing = showing;
mModel.set(BottomControlsProperties.RESOURCE_MANAGER, resourceManager); updateAndroidViewVisibility();
} }));
void setWindowAndroid(WindowAndroid windowAndroid) {
assert mWindowAndroid == null : "#setWindowAndroid should only be called once per toolbar.";
// Watch for keyboard events so we can hide the bottom toolbar when the keyboard is showing. // Watch for keyboard events so we can hide the bottom toolbar when the keyboard is showing.
mWindowAndroid = windowAndroid; mWindowAndroid = windowAndroid;
mWindowAndroid.getKeyboardDelegate().addKeyboardVisibilityListener(this); mWindowAndroid.getKeyboardDelegate().addKeyboardVisibilityListener(this);
} }
void setLayoutManager(LayoutManagerImpl layoutManager) { void setLayoutStateProvider(LayoutStateProvider layoutStateProvider) {
mModel.set(BottomControlsProperties.LAYOUT_MANAGER, layoutManager); mLayoutStateProvider = layoutStateProvider;
layoutManager.addSceneChangeObserver(this); layoutStateProvider.addObserver(this);
layoutManager.getOverlayPanelManager().addObserver(this);
} }
void setBottomControlsVisible(boolean visible) { void setBottomControlsVisible(boolean visible) {
...@@ -102,15 +104,12 @@ class BottomControlsMediator implements BrowserControlsStateProvider.Observer, ...@@ -102,15 +104,12 @@ class BottomControlsMediator implements BrowserControlsStateProvider.Observer,
* Clean up anything that needs to be when the bottom controls component is destroyed. * Clean up anything that needs to be when the bottom controls component is destroyed.
*/ */
void destroy() { void destroy() {
mCallbackController.destroy();
mBrowserControlsSizer.removeObserver(this); mBrowserControlsSizer.removeObserver(this);
if (mWindowAndroid != null) { mWindowAndroid.getKeyboardDelegate().removeKeyboardVisibilityListener(this);
mWindowAndroid.getKeyboardDelegate().removeKeyboardVisibilityListener(this); if (mLayoutStateProvider != null) {
mWindowAndroid = null; mLayoutStateProvider.removeObserver(this);
} mLayoutStateProvider = null;
if (mModel.get(BottomControlsProperties.LAYOUT_MANAGER) != null) {
LayoutManagerImpl manager = mModel.get(BottomControlsProperties.LAYOUT_MANAGER);
manager.getOverlayPanelManager().removeObserver(this);
manager.removeSceneChangeObserver(this);
} }
} }
...@@ -121,18 +120,6 @@ class BottomControlsMediator implements BrowserControlsStateProvider.Observer, ...@@ -121,18 +120,6 @@ class BottomControlsMediator implements BrowserControlsStateProvider.Observer,
updateAndroidViewVisibility(); updateAndroidViewVisibility();
} }
@Override
public void onOverlayPanelShown() {
mIsOverlayPanelShowing = true;
updateAndroidViewVisibility();
}
@Override
public void onOverlayPanelHidden() {
mIsOverlayPanelShowing = false;
updateAndroidViewVisibility();
}
@Override @Override
public void keyboardVisibilityChanged(boolean isShowing) { public void keyboardVisibilityChanged(boolean isShowing) {
mIsKeyboardVisible = isShowing; mIsKeyboardVisible = isShowing;
...@@ -140,12 +127,11 @@ class BottomControlsMediator implements BrowserControlsStateProvider.Observer, ...@@ -140,12 +127,11 @@ class BottomControlsMediator implements BrowserControlsStateProvider.Observer,
updateAndroidViewVisibility(); updateAndroidViewVisibility();
} }
@Override // LayoutStateObserver
public void onTabSelectionHinted(int tabId) {}
@Override @Override
public void onSceneChange(Layout layout) { public void onStartedShowing(@LayoutType int layoutType, boolean showToolbar) {
mIsInSwipeLayout = layout instanceof ToolbarSwipeLayout; mIsInSwipeLayout = layoutType == LayoutType.TOOLBAR_SWIPE;
updateAndroidViewVisibility(); updateAndroidViewVisibility();
} }
...@@ -164,14 +150,17 @@ class BottomControlsMediator implements BrowserControlsStateProvider.Observer, ...@@ -164,14 +150,17 @@ class BottomControlsMediator implements BrowserControlsStateProvider.Observer,
* visibility changes. * visibility changes.
*/ */
private void updateCompositedViewVisibility() { private void updateCompositedViewVisibility() {
final boolean isCompositedViewVisible = final boolean isCompositedViewVisible = isCompositedViewVisible();
mIsBottomControlsVisible && !mIsKeyboardVisible && !isInFullscreenMode();
mModel.set(BottomControlsProperties.COMPOSITED_VIEW_VISIBLE, isCompositedViewVisible); mModel.set(BottomControlsProperties.COMPOSITED_VIEW_VISIBLE, isCompositedViewVisible);
mBrowserControlsSizer.setBottomControlsHeight( mBrowserControlsSizer.setBottomControlsHeight(
isCompositedViewVisible ? mBottomControlsHeight : 0, isCompositedViewVisible ? mBottomControlsHeight : 0,
mBrowserControlsSizer.getBottomControlsMinHeight()); mBrowserControlsSizer.getBottomControlsMinHeight());
} }
boolean isCompositedViewVisible() {
return mIsBottomControlsVisible && !mIsKeyboardVisible && !isInFullscreenMode();
}
/** /**
* The Android View is the interactive view. The composited view should always be behind the * The Android View is the interactive view. The composited view should always be behind the
* Android view which means we hide the Android view whenever the composited view is hidden. * Android view which means we hide the Android view whenever the composited view is hidden.
...@@ -181,8 +170,7 @@ class BottomControlsMediator implements BrowserControlsStateProvider.Observer, ...@@ -181,8 +170,7 @@ class BottomControlsMediator implements BrowserControlsStateProvider.Observer,
*/ */
private void updateAndroidViewVisibility() { private void updateAndroidViewVisibility() {
mModel.set(BottomControlsProperties.ANDROID_VIEW_VISIBLE, mModel.set(BottomControlsProperties.ANDROID_VIEW_VISIBLE,
mIsBottomControlsVisible && !mIsKeyboardVisible && !mIsOverlayPanelShowing isCompositedViewVisible() && !mIsOverlayPanelShowing && !mIsInSwipeLayout
&& !mIsInSwipeLayout && mBrowserControlsSizer.getBottomControlOffset() == 0 && mBrowserControlsSizer.getBottomControlOffset() == 0);
&& !isInFullscreenMode());
} }
} }
...@@ -4,12 +4,9 @@ ...@@ -4,12 +4,9 @@
package org.chromium.chrome.browser.toolbar.bottom; package org.chromium.chrome.browser.toolbar.bottom;
import org.chromium.chrome.browser.compositor.layouts.LayoutManagerImpl;
import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyKey;
import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey; import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey;
import org.chromium.ui.modelutil.PropertyModel.WritableIntPropertyKey; import org.chromium.ui.modelutil.PropertyModel.WritableIntPropertyKey;
import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey;
import org.chromium.ui.resources.ResourceManager;
class BottomControlsProperties { class BottomControlsProperties {
/** The height of the bottom control container (view which includes the top shadow) in px. */ /** The height of the bottom control container (view which includes the top shadow) in px. */
...@@ -26,15 +23,6 @@ class BottomControlsProperties { ...@@ -26,15 +23,6 @@ class BottomControlsProperties {
static final WritableBooleanPropertyKey COMPOSITED_VIEW_VISIBLE = static final WritableBooleanPropertyKey COMPOSITED_VIEW_VISIBLE =
new WritableBooleanPropertyKey(); new WritableBooleanPropertyKey();
/** A {@link LayoutManagerImpl} to attach overlays to. */ static final PropertyKey[] ALL_KEYS = new PropertyKey[] {BOTTOM_CONTROLS_CONTAINER_HEIGHT_PX,
static final WritableObjectPropertyKey<LayoutManagerImpl> LAYOUT_MANAGER = Y_OFFSET, ANDROID_VIEW_VISIBLE, COMPOSITED_VIEW_VISIBLE};
new WritableObjectPropertyKey<>();
/** A {@link ResourceManager} for loading textures into the compositor. */
static final WritableObjectPropertyKey<ResourceManager> RESOURCE_MANAGER =
new WritableObjectPropertyKey<>();
static final PropertyKey[] ALL_KEYS =
new PropertyKey[] {BOTTOM_CONTROLS_CONTAINER_HEIGHT_PX, Y_OFFSET, ANDROID_VIEW_VISIBLE,
COMPOSITED_VIEW_VISIBLE, LAYOUT_MANAGER, RESOURCE_MANAGER};
} }
...@@ -7,7 +7,6 @@ package org.chromium.chrome.browser.toolbar.bottom; ...@@ -7,7 +7,6 @@ package org.chromium.chrome.browser.toolbar.bottom;
import android.view.View; import android.view.View;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.compositor.scene_layer.ScrollingBottomViewSceneLayer;
import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyKey;
import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel;
...@@ -26,8 +25,10 @@ class BottomControlsViewBinder { ...@@ -26,8 +25,10 @@ class BottomControlsViewBinder {
/** /**
* @param bottomControlsRootView The Android View based bottom controls. * @param bottomControlsRootView The Android View based bottom controls.
*/ */
public ViewHolder(ScrollingBottomViewResourceFrameLayout bottomControlsRootView) { public ViewHolder(ScrollingBottomViewResourceFrameLayout bottomControlsRootView,
ScrollingBottomViewSceneLayer layer) {
root = bottomControlsRootView; root = bottomControlsRootView;
sceneLayer = layer;
} }
} }
...@@ -37,32 +38,22 @@ class BottomControlsViewBinder { ...@@ -37,32 +38,22 @@ class BottomControlsViewBinder {
bottomControlsWrapper.getLayoutParams().height = bottomControlsWrapper.getLayoutParams().height =
model.get(BottomControlsProperties.BOTTOM_CONTROLS_CONTAINER_HEIGHT_PX); model.get(BottomControlsProperties.BOTTOM_CONTROLS_CONTAINER_HEIGHT_PX);
} else if (BottomControlsProperties.Y_OFFSET == propertyKey) { } else if (BottomControlsProperties.Y_OFFSET == propertyKey) {
// Native may not have completely initialized by the time this is set.
if (view.sceneLayer == null) return;
view.sceneLayer.setYOffset(model.get(BottomControlsProperties.Y_OFFSET)); view.sceneLayer.setYOffset(model.get(BottomControlsProperties.Y_OFFSET));
} else if (BottomControlsProperties.ANDROID_VIEW_VISIBLE == propertyKey) { } else if (BottomControlsProperties.ANDROID_VIEW_VISIBLE == propertyKey) {
view.root.setVisibility(model.get(BottomControlsProperties.ANDROID_VIEW_VISIBLE) view.root.setVisibility(model.get(BottomControlsProperties.ANDROID_VIEW_VISIBLE)
? View.VISIBLE ? View.VISIBLE
: View.INVISIBLE); : View.INVISIBLE);
} else if (BottomControlsProperties.COMPOSITED_VIEW_VISIBLE == propertyKey) { } else if (BottomControlsProperties.COMPOSITED_VIEW_VISIBLE == propertyKey) {
if (view.sceneLayer == null) return;
final boolean showCompositedView = final boolean showCompositedView =
model.get(BottomControlsProperties.COMPOSITED_VIEW_VISIBLE); model.get(BottomControlsProperties.COMPOSITED_VIEW_VISIBLE);
view.sceneLayer.setIsVisible(showCompositedView); view.sceneLayer.setIsVisible(showCompositedView);
model.get(BottomControlsProperties.LAYOUT_MANAGER).requestUpdate();
} else if (BottomControlsProperties.LAYOUT_MANAGER == propertyKey) {
assert view.sceneLayer == null;
view.sceneLayer =
new ScrollingBottomViewSceneLayer(view.root, view.root.getTopShadowHeight());
view.sceneLayer.setIsVisible(
model.get(BottomControlsProperties.COMPOSITED_VIEW_VISIBLE));
model.get(BottomControlsProperties.LAYOUT_MANAGER).addSceneOverlay(view.sceneLayer);
} else if (BottomControlsProperties.RESOURCE_MANAGER == propertyKey) {
model.get(BottomControlsProperties.RESOURCE_MANAGER)
.getDynamicResourceLoader()
.registerResource(view.root.getId(), view.root.getResourceAdapter());
} else { } else {
assert false : "Unhandled property detected in BottomControlsViewBinder!"; assert false : "Unhandled property detected in BottomControlsViewBinder!";
} }
} }
static void bindCompositorMCP(PropertyModel model, ScrollingBottomViewSceneLayer sceneLayer,
PropertyKey propertyKey) {
assert propertyKey == null;
}
} }
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
package org.chromium.chrome.browser.compositor.scene_layer; package org.chromium.chrome.browser.toolbar.bottom;
import android.graphics.RectF; import android.graphics.RectF;
import android.view.View; import android.view.View;
......
...@@ -83,7 +83,7 @@ public abstract class ToolbarLayout ...@@ -83,7 +83,7 @@ public abstract class ToolbarLayout
private MenuButtonCoordinator mMenuButtonCoordinator; private MenuButtonCoordinator mMenuButtonCoordinator;
private AppMenuButtonHelper mAppMenuButtonHelper; private AppMenuButtonHelper mAppMenuButtonHelper;
private Callback<Boolean> mOverlayVisibilityCallback; private TopToolbarOverlayCoordinator mOverlayCoordinator;
/** /**
* Basic constructor for {@link ToolbarLayout}. * Basic constructor for {@link ToolbarLayout}.
...@@ -121,20 +121,17 @@ public abstract class ToolbarLayout ...@@ -121,20 +121,17 @@ public abstract class ToolbarLayout
mMenuButtonCoordinator = menuButtonCoordinator; mMenuButtonCoordinator = menuButtonCoordinator;
} }
/** /** @param overlay The coordinator for the texture version of the top toolbar. */
* @param callback Callback to invoke on visibility change of the texture version void setOverlayCoordinator(TopToolbarOverlayCoordinator overlay) {
* of the top toolbar. mOverlayCoordinator = overlay;
*/ mOverlayCoordinator.setIsAndroidViewVisible(getVisibility() == View.VISIBLE);
public void setOverlayVisibilityCallback(Callback<Boolean> callback) {
mOverlayVisibilityCallback = callback;
mOverlayVisibilityCallback.onResult(getVisibility() == View.VISIBLE);
} }
@Override @Override
public void setVisibility(int visibility) { public void setVisibility(int visibility) {
super.setVisibility(visibility); super.setVisibility(visibility);
if (mOverlayVisibilityCallback != null) { if (mOverlayCoordinator != null) {
mOverlayVisibilityCallback.onResult(visibility == View.VISIBLE); mOverlayCoordinator.setIsAndroidViewVisible(visibility == View.VISIBLE);
} }
} }
......
...@@ -20,8 +20,11 @@ import org.chromium.base.supplier.OneshotSupplier; ...@@ -20,8 +20,11 @@ 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;
import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
import org.chromium.chrome.browser.device.DeviceClassManager;
import org.chromium.chrome.browser.layouts.LayoutManager;
import org.chromium.chrome.browser.layouts.LayoutStateProvider; import org.chromium.chrome.browser.layouts.LayoutStateProvider;
import org.chromium.chrome.browser.omnibox.LocationBar; import org.chromium.chrome.browser.omnibox.LocationBar;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider; import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider;
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.ButtonData;
...@@ -38,7 +41,6 @@ import org.chromium.chrome.browser.user_education.UserEducationHelper; ...@@ -38,7 +41,6 @@ import org.chromium.chrome.browser.user_education.UserEducationHelper;
import org.chromium.chrome.features.start_surface.StartSurface; import org.chromium.chrome.features.start_surface.StartSurface;
import org.chromium.chrome.features.start_surface.StartSurfaceConfiguration; import org.chromium.chrome.features.start_surface.StartSurfaceConfiguration;
import org.chromium.chrome.features.start_surface.StartSurfaceState; import org.chromium.chrome.features.start_surface.StartSurfaceState;
import org.chromium.components.browser_ui.widget.ClipDrawableProgressBar;
import org.chromium.ui.resources.ResourceManager; import org.chromium.ui.resources.ResourceManager;
import java.util.List; import java.util.List;
...@@ -83,9 +85,9 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -83,9 +85,9 @@ public class TopToolbarCoordinator implements Toolbar {
private ObservableSupplier<AppMenuButtonHelper> mAppMenuButtonHelperSupplier; private ObservableSupplier<AppMenuButtonHelper> mAppMenuButtonHelperSupplier;
private ObservableSupplier<TabModelSelector> mTabModelSelectorSupplier; private ObservableSupplier<TabModelSelector> mTabModelSelectorSupplier;
private Callback<ClipDrawableProgressBar.DrawingInfo> mProgressDrawInfoCallback;
private ToolbarControlContainer mControlContainer; private ToolbarControlContainer mControlContainer;
private Supplier<ResourceManager> mResourceManagerSupplier; private Supplier<ResourceManager> mResourceManagerSupplier;
private TopToolbarOverlayCoordinator mOverlayCoordinator;
/** /**
* Creates a new {@link TopToolbarCoordinator}. * Creates a new {@link TopToolbarCoordinator}.
...@@ -129,10 +131,6 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -129,10 +131,6 @@ public class TopToolbarCoordinator implements Toolbar {
mOptionalButtonController = new OptionalBrowsingModeButtonController(buttonDataProviders, mOptionalButtonController = new OptionalBrowsingModeButtonController(buttonDataProviders,
userEducationHelper, mToolbarLayout, () -> toolbarDataProvider.getTab()); userEducationHelper, mToolbarLayout, () -> toolbarDataProvider.getTab());
mResourceManagerSupplier = resourceManagerSupplier; mResourceManagerSupplier = resourceManagerSupplier;
mProgressDrawInfoCallback = (info) -> {
if (controlContainer == null) return;
controlContainer.getProgressBarDrawingInfo(info);
};
mTabModelSelectorSupplier = tabModelSelectorSupplier; mTabModelSelectorSupplier = tabModelSelectorSupplier;
...@@ -177,12 +175,16 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -177,12 +175,16 @@ public class TopToolbarCoordinator implements Toolbar {
* @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.
* @param browserControlsStateProvider Access to the state of the browser controls. * @param layoutManager A {@link LayoutManager} used to watch for scene changes.
* @param tabSupplier Supplier of the activity tab.
* @param browserControlsStateProvider {@link BrowserControlsStateProvider} to access browser
* controls offsets.
*/ */
public void initializeWithNative(Runnable layoutUpdater, 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,
LayoutManager layoutManager, ObservableSupplier<Tab> tabSupplier,
BrowserControlsStateProvider browserControlsStateProvider) { BrowserControlsStateProvider browserControlsStateProvider) {
assert mTabModelSelectorSupplier.get() != null; assert mTabModelSelectorSupplier.get() != null;
if (mTabSwitcherModeCoordinatorPhone != null) { if (mTabSwitcherModeCoordinatorPhone != null) {
...@@ -207,6 +209,16 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -207,6 +209,16 @@ public class TopToolbarCoordinator implements Toolbar {
mToolbarLayout.setLayoutUpdater(layoutUpdater); mToolbarLayout.setLayoutUpdater(layoutUpdater);
mToolbarLayout.onNativeLibraryReady(); mToolbarLayout.onNativeLibraryReady();
// If fullscreen is disabled, don't bother creating this overlay; only the android view will
// ever be shown.
if (DeviceClassManager.enableFullscreen()) {
mOverlayCoordinator = new TopToolbarOverlayCoordinator(mToolbarLayout.getContext(),
layoutManager, mControlContainer::getProgressBarDrawingInfo, tabSupplier,
browserControlsStateProvider, mResourceManagerSupplier);
layoutManager.addSceneOverlay(mOverlayCoordinator);
mToolbarLayout.setOverlayCoordinator(mOverlayCoordinator);
}
} }
/** /**
...@@ -234,6 +246,10 @@ public class TopToolbarCoordinator implements Toolbar { ...@@ -234,6 +246,10 @@ public class TopToolbarCoordinator implements Toolbar {
* Cleans up any code as necessary. * Cleans up any code as necessary.
*/ */
public void destroy() { public void destroy() {
if (mOverlayCoordinator != null) {
mOverlayCoordinator.destroy();
mOverlayCoordinator = null;
}
mToolbarLayout.destroy(); mToolbarLayout.destroy();
if (mTabSwitcherModeCoordinatorPhone != null) { if (mTabSwitcherModeCoordinatorPhone != null) {
mTabSwitcherModeCoordinatorPhone.destroy(); mTabSwitcherModeCoordinatorPhone.destroy();
......
...@@ -2,15 +2,15 @@ ...@@ -2,15 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
package org.chromium.chrome.browser.compositor.overlays.toolbar; package org.chromium.chrome.browser.toolbar.top;
import android.content.Context; import android.content.Context;
import android.graphics.RectF; import android.graphics.RectF;
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.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.layouts.CompositorModelChangeProcessor; import org.chromium.chrome.browser.layouts.CompositorModelChangeProcessor;
import org.chromium.chrome.browser.layouts.EventFilter; import org.chromium.chrome.browser.layouts.EventFilter;
...@@ -18,6 +18,7 @@ import org.chromium.chrome.browser.layouts.LayoutManager; ...@@ -18,6 +18,7 @@ import org.chromium.chrome.browser.layouts.LayoutManager;
import org.chromium.chrome.browser.layouts.SceneOverlay; import org.chromium.chrome.browser.layouts.SceneOverlay;
import org.chromium.chrome.browser.layouts.components.VirtualView; import org.chromium.chrome.browser.layouts.components.VirtualView;
import org.chromium.chrome.browser.layouts.scene_layer.SceneOverlayLayer; import org.chromium.chrome.browser.layouts.scene_layer.SceneOverlayLayer;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.components.browser_ui.widget.ClipDrawableProgressBar; import org.chromium.components.browser_ui.widget.ClipDrawableProgressBar;
import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.resources.ResourceManager; import org.chromium.ui.resources.ResourceManager;
...@@ -40,7 +41,7 @@ public class TopToolbarOverlayCoordinator implements SceneOverlay { ...@@ -40,7 +41,7 @@ public class TopToolbarOverlayCoordinator implements SceneOverlay {
public TopToolbarOverlayCoordinator(Context context, LayoutManager layoutManager, public TopToolbarOverlayCoordinator(Context context, LayoutManager layoutManager,
Callback<ClipDrawableProgressBar.DrawingInfo> progressInfoCallback, Callback<ClipDrawableProgressBar.DrawingInfo> progressInfoCallback,
ActivityTabProvider tabSupplier, ObservableSupplier<Tab> tabSupplier,
BrowserControlsStateProvider browserControlsStateProvider, BrowserControlsStateProvider browserControlsStateProvider,
Supplier<ResourceManager> resourceManagerSupplier) { Supplier<ResourceManager> resourceManagerSupplier) {
mModel = new PropertyModel.Builder(TopToolbarOverlayProperties.ALL_KEYS) mModel = new PropertyModel.Builder(TopToolbarOverlayProperties.ALL_KEYS)
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
package org.chromium.chrome.browser.compositor.overlays.toolbar; package org.chromium.chrome.browser.toolbar.top;
import android.content.Context; import android.content.Context;
...@@ -10,15 +10,16 @@ import androidx.annotation.ColorInt; ...@@ -10,15 +10,16 @@ import androidx.annotation.ColorInt;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.chrome.browser.ActivityTabProvider; import org.chromium.base.CallbackController;
import org.chromium.base.supplier.ObservableSupplier;
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.layouts.LayoutStateProvider; import org.chromium.chrome.browser.layouts.LayoutStateProvider;
import org.chromium.chrome.browser.layouts.LayoutStateProvider.LayoutStateObserver; import org.chromium.chrome.browser.layouts.LayoutStateProvider.LayoutStateObserver;
import org.chromium.chrome.browser.layouts.LayoutType; import org.chromium.chrome.browser.layouts.LayoutType;
import org.chromium.chrome.browser.tab.CurrentTabObserver;
import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.EmptyTabObserver;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabObserver;
import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities;
import org.chromium.chrome.browser.toolbar.ToolbarColors; import org.chromium.chrome.browser.toolbar.ToolbarColors;
import org.chromium.components.browser_ui.widget.ClipDrawableProgressBar; import org.chromium.components.browser_ui.widget.ClipDrawableProgressBar;
...@@ -45,10 +46,13 @@ public class TopToolbarOverlayMediator { ...@@ -45,10 +46,13 @@ public class TopToolbarOverlayMediator {
private final Callback<ClipDrawableProgressBar.DrawingInfo> mProgressInfoCallback; private final Callback<ClipDrawableProgressBar.DrawingInfo> mProgressInfoCallback;
/** Provides current tab. */ /** Provides current tab. */
private final ActivityTabProvider mTabSupplier; private final ObservableSupplier<Tab> mTabSupplier;
/** An observer that watches for changes in the active tab. */ /** An observer that watches for changes in the active tab. */
private final ActivityTabProvider.ActivityTabObserver mTabSupplierObserver; private final CurrentTabObserver mTabObserver;
/** A callback to invoke upon activity tab switching. */
private final Callback<Tab> mActivityTabCallback;
/** 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;
...@@ -59,8 +63,8 @@ public class TopToolbarOverlayMediator { ...@@ -59,8 +63,8 @@ public class TopToolbarOverlayMediator {
/** The view state for this overlay. */ /** The view state for this overlay. */
private final PropertyModel mModel; private final PropertyModel mModel;
/** The last non-null tab. */ /** Callback controller for cancelable callbacks. */
private Tab mLastActiveTab; private final CallbackController mCallbackController;
/** Whether the active layout has its own toolbar to display instead of this one. */ /** Whether the active layout has its own toolbar to display instead of this one. */
private boolean mLayoutHasOwnToolbar; private boolean mLayoutHasOwnToolbar;
...@@ -71,7 +75,7 @@ public class TopToolbarOverlayMediator { ...@@ -71,7 +75,7 @@ public class TopToolbarOverlayMediator {
TopToolbarOverlayMediator(PropertyModel model, Context context, TopToolbarOverlayMediator(PropertyModel model, Context context,
LayoutStateProvider layoutStateProvider, LayoutStateProvider layoutStateProvider,
Callback<ClipDrawableProgressBar.DrawingInfo> progressInfoCallback, Callback<ClipDrawableProgressBar.DrawingInfo> progressInfoCallback,
ActivityTabProvider tabSupplier, ObservableSupplier<Tab> tabSupplier,
BrowserControlsStateProvider browserControlsStateProvider) { BrowserControlsStateProvider browserControlsStateProvider) {
mContext = context; mContext = context;
mLayoutStateProvider = layoutStateProvider; mLayoutStateProvider = layoutStateProvider;
...@@ -79,6 +83,7 @@ public class TopToolbarOverlayMediator { ...@@ -79,6 +83,7 @@ public class TopToolbarOverlayMediator {
mTabSupplier = tabSupplier; mTabSupplier = tabSupplier;
mBrowserControlsStateProvider = browserControlsStateProvider; mBrowserControlsStateProvider = browserControlsStateProvider;
mModel = model; mModel = model;
mCallbackController = new CallbackController();
mSceneChangeObserver = new LayoutStateObserver() { mSceneChangeObserver = new LayoutStateObserver() {
@Override @Override
...@@ -93,7 +98,7 @@ public class TopToolbarOverlayMediator { ...@@ -93,7 +98,7 @@ public class TopToolbarOverlayMediator {
}; };
mLayoutStateProvider.addObserver(mSceneChangeObserver); mLayoutStateProvider.addObserver(mSceneChangeObserver);
final TabObserver currentTabObserver = new EmptyTabObserver() { mTabObserver = new CurrentTabObserver(mTabSupplier, new EmptyTabObserver() {
@Override @Override
public void onDidChangeThemeColor(Tab tab, int color) { public void onDidChangeThemeColor(Tab tab, int color) {
updateThemeColor(tab); updateThemeColor(tab);
...@@ -109,21 +114,20 @@ public class TopToolbarOverlayMediator { ...@@ -109,21 +114,20 @@ public class TopToolbarOverlayMediator {
updateVisibility(); updateVisibility();
updateThemeColor(tab); updateThemeColor(tab);
} }
}; });
// 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, hint) -> { mActivityTabCallback = mCallbackController.makeCancelable(tab -> {
if (mLastActiveTab != null) mLastActiveTab.removeObserver(currentTabObserver);
if (tab == null) return; if (tab == null) return;
mLastActiveTab = tab;
mLastActiveTab.addObserver(currentTabObserver);
updateVisibility(); updateVisibility();
updateThemeColor(mLastActiveTab); updateThemeColor(tab);
updateProgress(); updateProgress();
}; });
mTabSupplier.addObserverAndTrigger(mTabSupplierObserver);
mTabSupplier.addObserver(mActivityTabCallback);
mActivityTabCallback.onResult(mTabSupplier.get());
mTabObserver.triggerWithCurrentTab();
mBrowserControlsObserver = new BrowserControlsStateProvider.Observer() { mBrowserControlsObserver = new BrowserControlsStateProvider.Observer() {
@Override @Override
...@@ -223,9 +227,10 @@ public class TopToolbarOverlayMediator { ...@@ -223,9 +227,10 @@ public class TopToolbarOverlayMediator {
/** Clean up any state and observers. */ /** Clean up any state and observers. */
void destroy() { void destroy() {
mTabSupplier.removeObserver(mTabSupplierObserver); mCallbackController.destroy();
mTabSupplierObserver.onActivityTabChanged(null, false); mTabObserver.destroy();
mLastActiveTab = null; mActivityTabCallback.onResult(null);
mTabSupplier.removeObserver(mActivityTabCallback);
mLayoutStateProvider.removeObserver(mSceneChangeObserver); mLayoutStateProvider.removeObserver(mSceneChangeObserver);
mBrowserControlsStateProvider.removeObserver(mBrowserControlsObserver); mBrowserControlsStateProvider.removeObserver(mBrowserControlsObserver);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
package org.chromium.chrome.browser.compositor.overlays.toolbar; package org.chromium.chrome.browser.toolbar.top;
import org.chromium.components.browser_ui.widget.ClipDrawableProgressBar.DrawingInfo; import org.chromium.components.browser_ui.widget.ClipDrawableProgressBar.DrawingInfo;
import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyKey;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
package org.chromium.chrome.browser.compositor.overlays.toolbar; package org.chromium.chrome.browser.toolbar.top;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods; import org.chromium.base.annotations.NativeMethods;
......
...@@ -27,10 +27,10 @@ import org.chromium.base.supplier.OneshotSupplierImpl; ...@@ -27,10 +27,10 @@ import org.chromium.base.supplier.OneshotSupplierImpl;
import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel; import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel;
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.toolbar.TopToolbarOverlayCoordinator;
import org.chromium.chrome.browser.compositor.scene_layer.ScrollingBottomViewSceneLayer;
import org.chromium.chrome.browser.layouts.LayoutStateProvider; import org.chromium.chrome.browser.layouts.LayoutStateProvider;
import org.chromium.chrome.browser.layouts.SceneOverlay; import org.chromium.chrome.browser.layouts.SceneOverlay;
import org.chromium.chrome.browser.toolbar.bottom.ScrollingBottomViewSceneLayer;
import org.chromium.chrome.browser.toolbar.top.TopToolbarOverlayCoordinator;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
......
...@@ -2,8 +2,9 @@ ...@@ -2,8 +2,9 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
package org.chromium.chrome.browser.compositor.overlays.toolbar; package org.chromium.chrome.browser.toolbar.top;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
...@@ -20,8 +21,9 @@ import org.mockito.Captor; ...@@ -20,8 +21,9 @@ import org.mockito.Captor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.chromium.base.Callback;
import org.chromium.base.supplier.ObservableSupplier;
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.LayoutManagerImpl; import org.chromium.chrome.browser.compositor.layouts.LayoutManagerImpl;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
...@@ -57,10 +59,10 @@ public class TopToolbarOverlayMediatorTest { ...@@ -57,10 +59,10 @@ public class TopToolbarOverlayMediatorTest {
private ArgumentCaptor<BrowserControlsStateProvider.Observer> mBrowserControlsObserverCaptor; private ArgumentCaptor<BrowserControlsStateProvider.Observer> mBrowserControlsObserverCaptor;
@Mock @Mock
private ActivityTabProvider mTabSupplier; private ObservableSupplier<Tab> mTabSupplier;
@Captor @Captor
private ArgumentCaptor<ActivityTabProvider.ActivityTabObserver> mActivityTabObserverCaptor; private ArgumentCaptor<Callback<Tab>> mActivityTabObserverCaptor;
@Before @Before
public void beforeTest() { public void beforeTest() {
...@@ -81,12 +83,14 @@ public class TopToolbarOverlayMediatorTest { ...@@ -81,12 +83,14 @@ public class TopToolbarOverlayMediatorTest {
.with(TopToolbarOverlayProperties.PROGRESS_BAR_INFO, null) .with(TopToolbarOverlayProperties.PROGRESS_BAR_INFO, null)
.build(); .build();
when(mTabSupplier.get()).thenReturn(mTab);
mMediator = new TopToolbarOverlayMediator(mModel, mContext, mLayoutManager, mMediator = new TopToolbarOverlayMediator(mModel, mContext, mLayoutManager,
(info) -> {}, mTabSupplier, mBrowserControlsProvider); (info) -> {}, mTabSupplier, mBrowserControlsProvider);
mMediator.setIsAndroidViewVisible(true); mMediator.setIsAndroidViewVisible(true);
// Ensure the observer is added to the initial tab. // Ensure the observer is added to the initial tab. We have 2 observers added -
verify(mTabSupplier).addObserverAndTrigger(mActivityTabObserverCaptor.capture()); // one for various tab observer events, the other for tab switching itself.
verify(mTabSupplier, times(2)).addObserver(mActivityTabObserverCaptor.capture());
setTabSupplierTab(mTab); setTabSupplierTab(mTab);
verify(mTab).addObserver(mTabObserverCaptor.capture()); verify(mTab).addObserver(mTabObserverCaptor.capture());
...@@ -97,7 +101,7 @@ public class TopToolbarOverlayMediatorTest { ...@@ -97,7 +101,7 @@ public class TopToolbarOverlayMediatorTest {
/** Set the tab that will be returned by the supplier and trigger the observer event. */ /** Set the tab that will be returned by the supplier and trigger the observer event. */
private void setTabSupplierTab(Tab tab) { private void setTabSupplierTab(Tab tab) {
when(mTabSupplier.get()).thenReturn(tab); when(mTabSupplier.get()).thenReturn(tab);
mActivityTabObserverCaptor.getValue().onActivityTabChanged(tab, false); mActivityTabObserverCaptor.getValue().onResult(tab);
} }
@After @After
...@@ -106,15 +110,6 @@ public class TopToolbarOverlayMediatorTest { ...@@ -106,15 +110,6 @@ public class TopToolbarOverlayMediatorTest {
TopToolbarOverlayMediator.setIsTabletForTesting(null); TopToolbarOverlayMediator.setIsTabletForTesting(null);
} }
@Test
public void testTabObserverAfterTabSwitch() {
setTabSupplierTab(mTab2);
// Make sure the tab observer for this overlay is only observing the "current" tab.
verify(mTab).removeObserver(mTabObserverCaptor.getValue());
verify(mTab2).addObserver(mTabObserverCaptor.getValue());
}
@Test @Test
public void testShadowVisibility_browserControlsOffsets() { public void testShadowVisibility_browserControlsOffsets() {
when(mBrowserControlsProvider.getBrowserControlHiddenRatio()).thenReturn(0.0f); when(mBrowserControlsProvider.getBrowserControlHiddenRatio()).thenReturn(0.0f);
......
...@@ -88,3 +88,20 @@ proto_java_library("critical_persisted_tab_data_proto_java") { ...@@ -88,3 +88,20 @@ proto_java_library("critical_persisted_tab_data_proto_java") {
"$proto_path/shopping_persisted_tab_data.proto", "$proto_path/shopping_persisted_tab_data.proto",
] ]
} }
android_library("junit") {
bypass_platform_checks = true
testonly = true
sources =
[ "java/src/org/chromium/chrome/browser/tab/CurrentTabObserverTest.java" ]
deps = [
":java",
"//base:base_java",
"//base:base_java_test_support",
"//base:base_junit_test_support",
"//third_party/android_deps:robolectric_all_java",
"//third_party/junit",
"//third_party/mockito:mockito_java",
]
}
...@@ -36,6 +36,7 @@ public class CurrentTabObserver { ...@@ -36,6 +36,7 @@ public class CurrentTabObserver {
mTabObserver = tabObserver; mTabObserver = tabObserver;
mCallbackController = new CallbackController(); mCallbackController = new CallbackController();
mTabSupplierCallback = mCallbackController.makeCancelable((tab) -> { mTabSupplierCallback = mCallbackController.makeCancelable((tab) -> {
if (mTab == tab) return;
if (mTab != null) mTab.removeObserver(mTabObserver); if (mTab != null) mTab.removeObserver(mTabObserver);
mTab = tab; mTab = tab;
if (mTab != null) mTab.addObserver(mTabObserver); if (mTab != null) mTab.addObserver(mTabObserver);
...@@ -43,6 +44,11 @@ public class CurrentTabObserver { ...@@ -43,6 +44,11 @@ public class CurrentTabObserver {
mTabSupplier.addObserver(mTabSupplierCallback); mTabSupplier.addObserver(mTabSupplierCallback);
} }
/** Trigger the event callback for this observer with the current tab. */
public void triggerWithCurrentTab() {
mTabSupplierCallback.onResult(mTabSupplier.get());
}
/** Destroy the current tab observer. This should be called after use. */ /** Destroy the current tab observer. This should be called after use. */
public void destroy() { public void destroy() {
if (mTab != null) mTab.removeObserver(mTabObserver); if (mTab != null) mTab.removeObserver(mTabObserver);
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.tab;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.chromium.base.supplier.ObservableSupplierImpl;
import org.chromium.base.test.BaseRobolectricTestRunner;
/** Tests for CurrentTabObserver. */
@RunWith(BaseRobolectricTestRunner.class)
public class CurrentTabObserverTest {
private CurrentTabObserver mCurrentTabObserver;
private ObservableSupplierImpl<Tab> mTabSupplier;
@Mock
private Tab mTab;
@Mock
private Tab mTab2;
@Mock
private TabObserver mTabObserver;
@Before
public void beforeTest() {
MockitoAnnotations.initMocks(this);
mTabSupplier = new ObservableSupplierImpl<>();
mCurrentTabObserver = new CurrentTabObserver(mTabSupplier, mTabObserver);
}
@Test
public void testTriggerWithCurrentTab() {
mCurrentTabObserver.triggerWithCurrentTab();
verify(mTab, times(0)).addObserver(mTabObserver);
// Set the current tab to |mTab|. This adds the observer.
// The following |triggerWithCurrentTab| invokes the event callback as well
// but the observer is not added again as the current tab hasn't changed.
mTabSupplier.set(mTab);
mCurrentTabObserver.triggerWithCurrentTab();
verify(mTab, times(1)).addObserver(mTabObserver);
}
@Test
public void testTabObserverAfterTabSwitch() {
// Make sure the tab observer for this overlay is only observing the "current" tab.
mTabSupplier.set(mTab);
verify(mTab).addObserver(mTabObserver);
mTabSupplier.set(mTab2);
verify(mTab).removeObserver(mTabObserver);
verify(mTab2).addObserver(mTabObserver);
mTabSupplier.set(null);
verify(mTab2).removeObserver(mTabObserver);
}
}
...@@ -25,4 +25,8 @@ specific_include_rules = { ...@@ -25,4 +25,8 @@ specific_include_rules = {
"-components", "-components",
"+components/embedder_support/android/java/src/org/chromium/components/embedder_support/view", "+components/embedder_support/android/java/src/org/chromium/components/embedder_support/view",
], ],
'CurrentTabObserverTest.java': [
"+base/test/android/junit",
]
} }
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