Commit 5aa3c4c0 authored by Yue Zhang's avatar Yue Zhang Committed by Commit Bot

Convert TabGridDialog to use new ScrimCoordinator

Now that http://crrev.com/c/2119188 has made TabGridDialog use the
ScrimView from RootUiCoordinator, this CL migrates the component to use
the new ScrimCoordinator to control the scrim view. To achieve that, we
expose a getter of ScrimCoordinator in RootUiCoordinator and pass it
down through constructor.

Bug: 1064140
Change-Id: I8f629fd2cab6f3fa8a6236fe58f982e637a994a6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2223458
Commit-Queue: Yue Zhang <yuezhanggg@chromium.org>
Reviewed-by: default avatarYusuf Ozuysal <yusufo@chromium.org>
Reviewed-by: default avatarMatthew Jones <mdjones@chromium.org>
Reviewed-by: default avatarWei-Yin Chen (陳威尹) <wychen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#777908}
parent ead89960
......@@ -21,6 +21,7 @@ import org.chromium.chrome.browser.toolbar.bottom.BottomToolbarConfiguration;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
import org.chromium.chrome.features.start_surface.StartSurfaceMediator.SurfaceMode;
import org.chromium.chrome.start_surface.R;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
import org.chromium.ui.modelutil.PropertyKey;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
......@@ -34,6 +35,7 @@ import java.util.Arrays;
*/
public class StartSurfaceCoordinator implements StartSurface {
private final ChromeActivity mActivity;
private final ScrimCoordinator mScrimCoordinator;
private final StartSurfaceMediator mStartSurfaceMediator;
private final @SurfaceMode int mSurfaceMode;
private final BottomSheetController mBottomSheetController;
......@@ -86,8 +88,9 @@ public class StartSurfaceCoordinator implements StartSurface {
private boolean mIsSecondaryTaskInitPending;
// TODO(http://crbug.com/1093421): Remove dependency on ChromeActivity.
public StartSurfaceCoordinator(ChromeActivity activity) {
public StartSurfaceCoordinator(ChromeActivity activity, ScrimCoordinator scrimCoordinator) {
mActivity = activity;
mScrimCoordinator = scrimCoordinator;
mSurfaceMode = computeSurfaceMode();
mBottomSheetController = mActivity.getBottomSheetController();
......@@ -97,7 +100,7 @@ public class StartSurfaceCoordinator implements StartSurface {
if (mSurfaceMode == SurfaceMode.NO_START_SURFACE) {
// Create Tab switcher directly to save one layer in the view hierarchy.
mTabSwitcher = TabManagementModuleProvider.getDelegate().createGridTabSwitcher(
mActivity, mActivity.getCompositorViewHolder());
mActivity, mActivity.getCompositorViewHolder(), scrimCoordinator);
} else {
createAndSetStartSurface(excludeMVTiles);
}
......@@ -288,7 +291,7 @@ public class StartSurfaceCoordinator implements StartSurface {
tabSwitcherType = TabSwitcherType.SINGLE;
}
mTasksSurface = TabManagementModuleProvider.getDelegate().createTasksSurface(
mActivity, mPropertyModel, tabSwitcherType, !excludeMVTiles);
mActivity, mScrimCoordinator, mPropertyModel, tabSwitcherType, !excludeMVTiles);
mTasksSurface.getView().setId(R.id.primary_tasks_surface_view);
mTasksSurfacePropertyModelChangeProcessor =
......@@ -315,7 +318,7 @@ public class StartSurfaceCoordinator implements StartSurface {
PropertyModel propertyModel = new PropertyModel(TasksSurfaceProperties.ALL_KEYS);
mStartSurfaceMediator.setSecondaryTasksSurfacePropertyModel(propertyModel);
mSecondaryTasksSurface = TabManagementModuleProvider.getDelegate().createTasksSurface(
mActivity, propertyModel,
mActivity, mScrimCoordinator, propertyModel,
StartSurfaceConfiguration.isStartSurfaceStackTabSwitcherEnabled()
? TabSwitcherType.NONE
: TabSwitcherType.GRID,
......
......@@ -10,6 +10,7 @@ import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.compositor.layouts.Layout;
import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost;
import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
/** StartSurfaceDelegate. */
public class StartSurfaceDelegate {
......@@ -21,7 +22,8 @@ public class StartSurfaceDelegate {
return new StartSurfaceLayout(context, updateHost, renderHost, startSurface);
}
public static StartSurface createStartSurface(ChromeActivity activity) {
return new StartSurfaceCoordinator(activity);
public static StartSurface createStartSurface(
ChromeActivity activity, ScrimCoordinator scrimCoordinator) {
return new StartSurfaceCoordinator(activity, scrimCoordinator);
}
}
\ No newline at end of file
......@@ -22,6 +22,7 @@ import org.chromium.chrome.browser.tasks.tab_management.TabManagementDelegate.Ta
import org.chromium.chrome.browser.tasks.tab_management.TabManagementModuleProvider;
import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher;
import org.chromium.chrome.tab_ui.R;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
......@@ -37,8 +38,8 @@ public class TasksSurfaceCoordinator implements TasksSurface {
private MostVisitedListCoordinator mMostVisitedList;
private final PropertyModel mPropertyModel;
public TasksSurfaceCoordinator(ChromeActivity activity, PropertyModel propertyModel,
@TabSwitcherType int tabSwitcherType, boolean hasMVTiles) {
public TasksSurfaceCoordinator(ChromeActivity activity, ScrimCoordinator scrimCoordinator,
PropertyModel propertyModel, @TabSwitcherType int tabSwitcherType, boolean hasMVTiles) {
mView = (TasksView) LayoutInflater.from(activity).inflate(R.layout.tasks_view_layout, null);
mView.initialize(activity.getLifecycleDispatcher());
mPropertyModelChangeProcessor =
......@@ -46,10 +47,10 @@ public class TasksSurfaceCoordinator implements TasksSurface {
mPropertyModel = propertyModel;
if (tabSwitcherType == TabSwitcherType.CAROUSEL) {
mTabSwitcher = TabManagementModuleProvider.getDelegate().createCarouselTabSwitcher(
activity, mView.getCarouselTabSwitcherContainer());
activity, mView.getCarouselTabSwitcherContainer(), scrimCoordinator);
} else if (tabSwitcherType == TabSwitcherType.GRID) {
mTabSwitcher = TabManagementModuleProvider.getDelegate().createGridTabSwitcher(
activity, mView.getBodyViewContainer());
activity, mView.getBodyViewContainer(), scrimCoordinator);
} else if (tabSwitcherType == TabSwitcherType.SINGLE) {
mTabSwitcher = new SingleTabSwitcherCoordinator(
activity, mView.getCarouselTabSwitcherContainer());
......
......@@ -15,13 +15,13 @@ import androidx.annotation.Nullable;
import org.chromium.base.SysUtils;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.base.supplier.ObservableSupplier;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.share.ShareDelegate;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.tab_ui.R;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
......@@ -48,7 +48,8 @@ public class TabGridDialogCoordinator implements TabGridDialogMediator.DialogCon
ViewGroup containerView, TabSwitcherMediator.ResetHandler resetHandler,
TabListMediator.GridCardOnClickListenerProvider gridCardOnClickListenerProvider,
TabGridDialogMediator.AnimationSourceViewProvider animationSourceViewProvider,
ObservableSupplier<ShareDelegate> shareDelegateSupplier) {
ObservableSupplier<ShareDelegate> shareDelegateSupplier,
ScrimCoordinator scrimCoordinator) {
mComponentName = animationSourceViewProvider == null ? "TabGridDialogFromStrip"
: "TabGridDialogInSwitcher";
......@@ -60,7 +61,7 @@ public class TabGridDialogCoordinator implements TabGridDialogMediator.DialogCon
LayoutInflater.from(context).inflate(
R.layout.tab_grid_dialog_layout, containerView, true);
mDialogView = containerView.findViewById(R.id.dialog_parent_view);
mDialogView.setupScrimView(((ChromeActivity) context).getScrim());
mDialogView.setupScrimCoordinator(scrimCoordinator);
}
mMediator = new TabGridDialogMediator(context, this, mModel, tabModelSelector,
......
......@@ -35,7 +35,6 @@ import org.chromium.chrome.browser.tabmodel.TabModelObserver;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter;
import org.chromium.chrome.browser.widget.ScrimView;
import org.chromium.chrome.tab_ui.R;
import org.chromium.components.browser_ui.share.ShareParams;
import org.chromium.components.embedder_support.util.UrlConstants;
......@@ -100,7 +99,7 @@ public class TabGridDialogMediator {
private final AnimationSourceViewProvider mAnimationSourceViewProvider;
private final DialogHandler mTabGridDialogHandler;
private final ObservableSupplier<ShareDelegate> mShareDelegateSupplier;
private final ScrimView.ScrimObserver mScrimObserver;
private final Runnable mScrimClickRunnable;
private final String mComponentName;
private TabGroupTitleEditor mTabGroupTitleEditor;
......@@ -209,17 +208,12 @@ public class TabGridDialogMediator {
};
mTabModelSelector.addObserver(mTabModelSelectorObserver);
// Setup ScrimView observer.
mScrimObserver = new ScrimView.ScrimObserver() {
@Override
public void onScrimClick() {
mModel.set(TabGridPanelProperties.IS_KEYBOARD_VISIBLE, false);
mModel.set(TabGridPanelProperties.IS_TITLE_TEXT_FOCUSED, false);
hideDialog(true);
RecordUserAction.record("TabGridDialog.Exit");
}
@Override
public void onScrimVisibilityChanged(boolean visible) {}
// Setup ScrimView click Runnable.
mScrimClickRunnable = () -> {
mModel.set(TabGridPanelProperties.IS_KEYBOARD_VISIBLE, false);
mModel.set(TabGridPanelProperties.IS_TITLE_TEXT_FOCUSED, false);
hideDialog(true);
RecordUserAction.record("TabGridDialog.Exit");
};
}
......@@ -277,6 +271,7 @@ public class TabGridDialogMediator {
}
void hideDialog(boolean showAnimation) {
if (!mModel.get(TabGridPanelProperties.IS_DIALOG_VISIBLE)) return;
if (!showAnimation) {
mModel.set(TabGridPanelProperties.ANIMATION_SOURCE_VIEW, null);
} else {
......@@ -310,7 +305,7 @@ public class TabGridDialogMediator {
}
updateDialog();
updateDialogScrollPosition();
mModel.set(TabGridPanelProperties.SCRIMVIEW_OBSERVER, mScrimObserver);
mModel.set(TabGridPanelProperties.SCRIMVIEW_CLICK_RUNNABLE, mScrimClickRunnable);
mModel.set(TabGridPanelProperties.IS_DIALOG_VISIBLE, true);
} else {
mModel.set(TabGridPanelProperties.IS_DIALOG_VISIBLE, false);
......@@ -569,7 +564,7 @@ public class TabGridDialogMediator {
}
@VisibleForTesting
ScrimView.ScrimObserver getScrimObserverForTesting() {
return mScrimObserver;
Runnable getScrimClickRunnableForTesting() {
return mScrimClickRunnable;
}
}
......@@ -34,11 +34,13 @@ import androidx.core.widget.ImageViewCompat;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.Callback;
import org.chromium.chrome.browser.widget.ScrimView;
import org.chromium.chrome.tab_ui.R;
import org.chromium.components.browser_ui.widget.animation.Interpolators;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
import org.chromium.components.browser_ui.widget.scrim.ScrimProperties;
import org.chromium.ui.KeyboardVisibilityDelegate;
import org.chromium.ui.interpolators.BakedBezierInterpolator;
import org.chromium.ui.modelutil.PropertyModel;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
......@@ -72,8 +74,8 @@ public class TabGridDialogView extends FrameLayout
private ViewGroup mParent;
private TextView mUngroupBarTextView;
private RelativeLayout mDialogContainerView;
private ScrimView.ScrimParams mScrimParams;
private ScrimView mScrimView;
private PropertyModel mScrimPropertyModel;
private ScrimCoordinator mScrimCoordinator;
private FrameLayout.LayoutParams mContainerParams;
private ViewTreeObserver.OnGlobalLayoutListener mParentGlobalLayoutListener;
private Animator mCurrentDialogAnimator;
......@@ -593,17 +595,22 @@ public class TabGridDialogView extends FrameLayout
}
/**
* Setup mScrimParams with the {@code scrimViewObserver}.
* Setup the {@link PropertyModel} used to show scrim view.
*
* @param scrimViewObserver The ScrimObserver to be used to setup mScrimParams.
* @param scrimClickRunnable The {@link Runnable} that runs when scrim view is clicked.
*/
void setScrimViewObserver(ScrimView.ScrimObserver scrimViewObserver) {
mScrimParams =
new ScrimView.ScrimParams(mDialogContainerView, false, true, 0, scrimViewObserver);
void setScrimClickRunnable(Runnable scrimClickRunnable) {
mScrimPropertyModel = new PropertyModel.Builder(ScrimProperties.REQUIRED_KEYS)
.with(ScrimProperties.ANCHOR_VIEW, mDialogContainerView)
.with(ScrimProperties.SHOW_IN_FRONT_OF_ANCHOR_VIEW, false)
.with(ScrimProperties.AFFECTS_STATUS_BAR, true)
.with(ScrimProperties.TOP_MARGIN, 0)
.with(ScrimProperties.CLICK_DELEGATE, scrimClickRunnable)
.build();
}
void setupScrimView(ScrimView scrimView) {
mScrimView = scrimView;
void setupScrimCoordinator(ScrimCoordinator scrimCoordinator) {
mScrimCoordinator = scrimCoordinator;
}
/**
......@@ -631,9 +638,8 @@ public class TabGridDialogView extends FrameLayout
mCurrentDialogAnimator.end();
}
mCurrentDialogAnimator = mShowDialogAnimation;
if (mScrimParams != null) {
mScrimView.showScrim(mScrimParams);
}
assert mScrimCoordinator != null && mScrimPropertyModel != null;
mScrimCoordinator.showScrim(mScrimPropertyModel);
setVisibility(View.VISIBLE);
mShowDialogAnimation.start();
}
......@@ -646,7 +652,8 @@ public class TabGridDialogView extends FrameLayout
mCurrentDialogAnimator.end();
}
mCurrentDialogAnimator = mHideDialogAnimation;
mScrimView.hideScrim(true);
assert mScrimCoordinator != null && mScrimPropertyModel != null;
mScrimCoordinator.hideScrim(true);
mHideDialogAnimation.start();
}
......
......@@ -9,7 +9,6 @@ import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import org.chromium.chrome.browser.widget.ScrimView;
import org.chromium.ui.modelutil.PropertyKey;
import org.chromium.ui.modelutil.PropertyModel;
......@@ -33,8 +32,7 @@ class TabGridPanelProperties {
new PropertyModel.WritableObjectPropertyKey<>();
public static final PropertyModel.WritableBooleanPropertyKey IS_DIALOG_VISIBLE =
new PropertyModel.WritableBooleanPropertyKey();
public static final PropertyModel
.WritableObjectPropertyKey<ScrimView.ScrimObserver> SCRIMVIEW_OBSERVER =
public static final PropertyModel.WritableObjectPropertyKey<Runnable> SCRIMVIEW_CLICK_RUNNABLE =
new PropertyModel.WritableObjectPropertyKey<>(true);
public static final PropertyModel.WritableObjectPropertyKey<View> ANIMATION_SOURCE_VIEW =
new PropertyModel.WritableObjectPropertyKey<>(true);
......@@ -74,7 +72,7 @@ class TabGridPanelProperties {
new PropertyModel.WritableBooleanPropertyKey();
public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {COLLAPSE_CLICK_LISTENER,
ADD_CLICK_LISTENER, HEADER_TITLE, CONTENT_TOP_MARGIN, PRIMARY_COLOR, TINT,
IS_DIALOG_VISIBLE, SCRIMVIEW_OBSERVER, ANIMATION_SOURCE_VIEW, UNGROUP_BAR_STATUS,
IS_DIALOG_VISIBLE, SCRIMVIEW_CLICK_RUNNABLE, ANIMATION_SOURCE_VIEW, UNGROUP_BAR_STATUS,
DIALOG_BACKGROUND_RESOUCE_ID, DIALOG_UNGROUP_BAR_BACKGROUND_COLOR_ID,
DIALOG_UNGROUP_BAR_HOVERED_BACKGROUND_COLOR_ID, DIALOG_UNGROUP_BAR_TEXT_APPEARANCE,
INITIAL_SCROLL_INDEX, IS_MAIN_CONTENT_VISIBLE, MENU_CLICK_LISTENER, TITLE_TEXT_WATCHER,
......
......@@ -20,7 +20,7 @@ import static org.chromium.chrome.browser.tasks.tab_management.TabGridPanelPrope
import static org.chromium.chrome.browser.tasks.tab_management.TabGridPanelProperties.IS_TITLE_TEXT_FOCUSED;
import static org.chromium.chrome.browser.tasks.tab_management.TabGridPanelProperties.MENU_CLICK_LISTENER;
import static org.chromium.chrome.browser.tasks.tab_management.TabGridPanelProperties.PRIMARY_COLOR;
import static org.chromium.chrome.browser.tasks.tab_management.TabGridPanelProperties.SCRIMVIEW_OBSERVER;
import static org.chromium.chrome.browser.tasks.tab_management.TabGridPanelProperties.SCRIMVIEW_CLICK_RUNNABLE;
import static org.chromium.chrome.browser.tasks.tab_management.TabGridPanelProperties.TINT;
import static org.chromium.chrome.browser.tasks.tab_management.TabGridPanelProperties.TITLE_CURSOR_VISIBILITY;
import static org.chromium.chrome.browser.tasks.tab_management.TabGridPanelProperties.TITLE_TEXT_ON_FOCUS_LISTENER;
......@@ -80,8 +80,8 @@ class TabGridPanelViewBinder {
viewHolder.contentView.setBackgroundColor(model.get(PRIMARY_COLOR));
} else if (TINT == propertyKey) {
viewHolder.toolbarView.setTint(model.get(TINT));
} else if (SCRIMVIEW_OBSERVER == propertyKey) {
viewHolder.dialogView.setScrimViewObserver(model.get(SCRIMVIEW_OBSERVER));
} else if (SCRIMVIEW_CLICK_RUNNABLE == propertyKey) {
viewHolder.dialogView.setScrimClickRunnable(model.get(SCRIMVIEW_CLICK_RUNNABLE));
} else if (IS_DIALOG_VISIBLE == propertyKey) {
if (model.get(IS_DIALOG_VISIBLE)) {
viewHolder.dialogView.resetDialog(viewHolder.toolbarView, viewHolder.contentView);
......
......@@ -45,7 +45,7 @@ public class TabGroupPopupUiCoordinator
PropertyModel model = new PropertyModel(TabGroupPopupUiProperties.ALL_KEYS);
mTabGroupPopupUiParent = new TabGroupPopupUiParent(activity, mAnchorView);
mTabGroupUiCoordinator = new TabGroupUiCoordinator(
mTabGroupPopupUiParent.getCurrentContainerView(), mThemeColorProvider);
mTabGroupPopupUiParent.getCurrentContainerView(), mThemeColorProvider, null);
mTabGroupUiCoordinator.initializeWithNative(activity, null);
mModelChangeProcessor = PropertyModelChangeProcessor.create(
model, mTabGroupPopupUiParent, TabGroupPopupUiViewBinder::bind);
......
......@@ -29,6 +29,7 @@ import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter;
import org.chromium.chrome.browser.tasks.tab_groups.TabGroupUtils;
import org.chromium.chrome.browser.toolbar.bottom.BottomControlsCoordinator;
import org.chromium.chrome.tab_ui.R;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
......@@ -48,6 +49,7 @@ public class TabGroupUiCoordinator implements TabGroupUiMediator.ResetHandler, T
private final ThemeColorProvider mThemeColorProvider;
private final TabGroupUiToolbarView mToolbarView;
private final ViewGroup mTabListContainerView;
private final ScrimCoordinator mScrimCoordinator;
private PropertyModelChangeProcessor mModelChangeProcessor;
private TabGridDialogCoordinator mTabGridDialogCoordinator;
private TabListCoordinator mTabStripCoordinator;
......@@ -58,9 +60,11 @@ public class TabGroupUiCoordinator implements TabGroupUiMediator.ResetHandler, T
/**
* Creates a new {@link TabGroupUiCoordinator}
*/
public TabGroupUiCoordinator(ViewGroup parentView, ThemeColorProvider themeColorProvider) {
public TabGroupUiCoordinator(ViewGroup parentView, ThemeColorProvider themeColorProvider,
ScrimCoordinator scrimCoordinator) {
mContext = parentView.getContext();
mThemeColorProvider = themeColorProvider;
mScrimCoordinator = scrimCoordinator;
mModel = new PropertyModel(TabGroupUiProperties.ALL_KEYS);
mToolbarView = (TabGroupUiToolbarView) LayoutInflater.from(mContext).inflate(
R.layout.bottom_tab_strip_toolbar, parentView, false);
......@@ -99,10 +103,10 @@ public class TabGroupUiCoordinator implements TabGroupUiMediator.ResetHandler, T
// TODO(crbug.com/972217): find a way to enable interactions between grid tab switcher
// and the dialog here.
TabGridDialogMediator.DialogController dialogController = null;
if (TabUiFeatureUtilities.isTabGroupsAndroidEnabled()) {
if (TabUiFeatureUtilities.isTabGroupsAndroidEnabled() && mScrimCoordinator != null) {
mTabGridDialogCoordinator = new TabGridDialogCoordinator(mContext, tabModelSelector,
tabContentManager, activity, activity.findViewById(R.id.coordinator), null,
null, null, mActivity.getShareDelegateSupplier());
null, null, mActivity.getShareDelegateSupplier(), mScrimCoordinator);
mTabGridDialogCoordinator.initWithNative(mContext, tabModelSelector, tabContentManager,
mTabStripCoordinator.getTabGroupTitleEditor());
dialogController = mTabGridDialogCoordinator.getDialogController();
......
......@@ -22,6 +22,7 @@ import org.chromium.chrome.browser.tasks.TasksSurfaceProperties;
import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter;
import org.chromium.chrome.browser.tasks.tab_management.suggestions.TabSuggestions;
import org.chromium.chrome.features.start_surface.StartSurface;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
import org.chromium.components.module_installer.builder.ModuleInterface;
import org.chromium.ui.modelutil.PropertyModel;
......@@ -47,38 +48,45 @@ public interface TabManagementDelegate {
/**
* Create the {@link TasksSurface}
* @param activity The {@link ChromeActivity} that creates this surface.
* @param scrimCoordinator The {@link ScrimCoordinator} that controls scrim view.
* @param propertyModel The {@link PropertyModel} contains the {@link TasksSurfaceProperties} to
* communicate with this surface.
* @param tabSwitcherType The type of the tab switcher to show.
* @param hasMVTiles whether has MV tiles on the surface.
* @return The {@link TasksSurface}.
*/
TasksSurface createTasksSurface(ChromeActivity activity, PropertyModel propertyModel,
@TabSwitcherType int tabSwitcherType, boolean hasMVTiles);
TasksSurface createTasksSurface(ChromeActivity activity, ScrimCoordinator scrimCoordinator,
PropertyModel propertyModel, @TabSwitcherType int tabSwitcherType, boolean hasMVTiles);
/**
* Create the {@link TabSwitcher} to display Tabs in grid.
* @param context The {@link Context} of this switcher.
* @param containerView The {@link ViewGroup} to add the switcher to.
* @param scrimCoordinator The {@link ScrimCoordinator} to control the scrim view.
* @return The {@link TabSwitcher}.
*/
TabSwitcher createGridTabSwitcher(ChromeActivity context, ViewGroup containerView);
TabSwitcher createGridTabSwitcher(
ChromeActivity context, ViewGroup containerView, ScrimCoordinator scrimCoordinator);
/**
* Create the {@link TabSwitcher} to display Tabs in carousel.
* @param context The {@link Context} of this switcher.
* @param containerView The {@link ViewGroup} to add the switcher to.
* @param scrimCoordinator The {@link ScrimCoordinator} to control the scrim view.
* @return The {@link TabSwitcher}.
*/
TabSwitcher createCarouselTabSwitcher(ChromeActivity context, ViewGroup containerView);
TabSwitcher createCarouselTabSwitcher(
ChromeActivity context, ViewGroup containerView, ScrimCoordinator scrimCoordinator);
/**
* Create the {@link TabGroupUi}.
* @param parentView The parent view of this UI.
* @param themeColorProvider The {@link ThemeColorProvider} for this UI.
* @param scrimCoordinator The {@link ScrimCoordinator} to control scrim view.
* @return The {@link TabGroupUi}.
*/
TabGroupUi createTabGroupUi(ViewGroup parentView, ThemeColorProvider themeColorProvider);
TabGroupUi createTabGroupUi(ViewGroup parentView, ThemeColorProvider themeColorProvider,
ScrimCoordinator scrimCoordinator);
/**
* Create the {@link StartSurfaceLayout}.
......@@ -94,9 +102,10 @@ public interface TabManagementDelegate {
/**
* Create the {@link StartSurface}
* @param activity The {@link ChromeActivity} creates this {@link StartSurface}.
* @param scrimCoordinator The {@link ScrimCoordinator} to control the scrim view.
* @return the {@link StartSurface}
*/
StartSurface createStartSurface(ChromeActivity activity);
StartSurface createStartSurface(ChromeActivity activity, ScrimCoordinator scrimCoordinator);
/**
* Create a {@link TabGroupModelFilter} for the given {@link TabModel}.
......
......@@ -28,6 +28,7 @@ import org.chromium.chrome.browser.tasks.tab_management.suggestions.TabSuggestio
import org.chromium.chrome.browser.tasks.tab_management.suggestions.TabSuggestionsOrchestrator;
import org.chromium.chrome.features.start_surface.StartSurface;
import org.chromium.chrome.features.start_surface.StartSurfaceDelegate;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
import org.chromium.ui.modelutil.PropertyModel;
/**
......@@ -36,13 +37,16 @@ import org.chromium.ui.modelutil.PropertyModel;
@UsedByReflection("TabManagementModule")
public class TabManagementDelegateImpl implements TabManagementDelegate {
@Override
public TasksSurface createTasksSurface(ChromeActivity activity, PropertyModel propertyModel,
public TasksSurface createTasksSurface(ChromeActivity activity,
ScrimCoordinator scrimCoordinator, PropertyModel propertyModel,
@TabSwitcherType int tabSwitcherType, boolean hasMVTiles) {
return new TasksSurfaceCoordinator(activity, propertyModel, tabSwitcherType, hasMVTiles);
return new TasksSurfaceCoordinator(
activity, scrimCoordinator, propertyModel, tabSwitcherType, hasMVTiles);
}
@Override
public TabSwitcher createGridTabSwitcher(ChromeActivity activity, ViewGroup containerView) {
public TabSwitcher createGridTabSwitcher(
ChromeActivity activity, ViewGroup containerView, ScrimCoordinator scrimCoordinator) {
if (UmaSessionStats.isMetricsServiceAvailable()) {
UmaSessionStats.registerSyntheticFieldTrial(
ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID + SYNTHETIC_TRIAL_POSTFIX,
......@@ -54,6 +58,7 @@ public class TabManagementDelegateImpl implements TabManagementDelegate {
activity.getFullscreenManager(), activity,
activity.getMenuOrKeyboardActionController(), containerView,
activity.getShareDelegateSupplier(), activity.getMultiWindowModeStateDispatcher(),
scrimCoordinator,
TabUiFeatureUtilities.isTabGroupsAndroidContinuationEnabled()
&& SysUtils.isLowEndDevice()
? TabListCoordinator.TabListMode.LIST
......@@ -61,19 +66,20 @@ public class TabManagementDelegateImpl implements TabManagementDelegate {
}
@Override
public TabSwitcher createCarouselTabSwitcher(ChromeActivity activity, ViewGroup containerView) {
public TabSwitcher createCarouselTabSwitcher(
ChromeActivity activity, ViewGroup containerView, ScrimCoordinator scrimCoordinator) {
return new TabSwitcherCoordinator(activity, activity.getLifecycleDispatcher(),
activity.getTabModelSelector(), activity.getTabContentManager(),
activity.getFullscreenManager(), activity,
activity.getMenuOrKeyboardActionController(), containerView,
activity.getShareDelegateSupplier(), activity.getMultiWindowModeStateDispatcher(),
TabListCoordinator.TabListMode.CAROUSEL);
scrimCoordinator, TabListCoordinator.TabListMode.CAROUSEL);
}
@Override
public TabGroupUi createTabGroupUi(
ViewGroup parentView, ThemeColorProvider themeColorProvider) {
return new TabGroupUiCoordinator(parentView, themeColorProvider);
public TabGroupUi createTabGroupUi(ViewGroup parentView, ThemeColorProvider themeColorProvider,
ScrimCoordinator scrimCoordinator) {
return new TabGroupUiCoordinator(parentView, themeColorProvider, scrimCoordinator);
}
@Override
......@@ -84,8 +90,9 @@ public class TabManagementDelegateImpl implements TabManagementDelegate {
}
@Override
public StartSurface createStartSurface(ChromeActivity activity) {
return StartSurfaceDelegate.createStartSurface(activity);
public StartSurface createStartSurface(
ChromeActivity activity, ScrimCoordinator scrimCoordinator) {
return StartSurfaceDelegate.createStartSurface(activity, scrimCoordinator);
}
@Override
......
......@@ -37,6 +37,7 @@ import org.chromium.chrome.browser.tasks.tab_management.suggestions.TabSuggestio
import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
import org.chromium.chrome.tab_ui.R;
import org.chromium.components.browser_ui.widget.MenuOrKeyboardActionController;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
import org.chromium.ui.modaldialog.ModalDialogManager;
import org.chromium.ui.modelutil.LayoutViewBuilder;
import org.chromium.ui.modelutil.PropertyModel;
......@@ -139,7 +140,7 @@ public class TabSwitcherCoordinator
MenuOrKeyboardActionController menuOrKeyboardActionController, ViewGroup container,
ObservableSupplier<ShareDelegate> shareDelegateSupplier,
MultiWindowModeStateDispatcher multiWindowModeStateDispatcher,
@TabListCoordinator.TabListMode int mode) {
ScrimCoordinator scrimCoordinator, @TabListCoordinator.TabListMode int mode) {
mMode = mode;
mTabModelSelector = tabModelSelector;
mContainer = container;
......@@ -179,7 +180,8 @@ public class TabSwitcherCoordinator
mTabGridDialogCoordinator = new TabGridDialogCoordinator(context, tabModelSelector,
tabContentManager, tabCreatorManager,
((ChromeTabbedActivity) context).findViewById(R.id.coordinator), this,
mMediator, this::getTabGridDialogAnimationSourceView, shareDelegateSupplier);
mMediator, this::getTabGridDialogAnimationSourceView, shareDelegateSupplier,
scrimCoordinator);
mMediator.setTabGridDialogController(mTabGridDialogCoordinator.getDialogController());
} else {
mTabGridDialogCoordinator = null;
......
......@@ -828,6 +828,10 @@ public class TabGridDialogTest {
private void clickScrimToExitDialog(ChromeTabbedActivity cta) throws ExecutionException {
CriteriaHelper.pollUiThread(() -> isDialogShowing(cta));
TestThreadUtils.runOnUiThreadBlocking(() -> cta.getScrim().performClick());
TestThreadUtils.runOnUiThreadBlocking(() -> {
View scrimView =
cta.getRootUiCoordinatorForTesting().getScrimCoordinator().getViewForTesting();
scrimView.performClick();
});
}
}
......@@ -8,6 +8,7 @@ import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.a
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.graphics.Color;
import android.support.test.annotation.UiThreadTest;
import android.support.test.filters.MediumTest;
import android.support.test.filters.SmallTest;
......@@ -24,9 +25,9 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.base.test.util.DisabledTest;
import org.chromium.chrome.browser.widget.ScrimView;
import org.chromium.chrome.tab_ui.R;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
import org.chromium.content_public.browser.test.util.Criteria;
import org.chromium.content_public.browser.test.util.CriteriaHelper;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
......@@ -57,19 +58,21 @@ public class TabGridDialogViewTest extends DummyUiActivityTestCase {
TestThreadUtils.runOnUiThreadBlocking(() -> {
mDummyParent = new FrameLayout(getActivity());
ScrimView scrimView = new ScrimView(getActivity(), null, mDummyParent);
getActivity().setContentView(mDummyParent);
LayoutInflater.from(getActivity())
.inflate(R.layout.tab_grid_dialog_layout, mDummyParent, true);
mTabGridDialogView = mDummyParent.findViewById(R.id.dialog_parent_view);
mTabGridDialogView.setupScrimView(scrimView);
mTabGridDialogContainer = mTabGridDialogView.findViewById(R.id.dialog_container_view);
mUngroupBar = mTabGridDialogContainer.findViewById(R.id.dialog_ungroup_bar);
mUngroupBarTextView = mUngroupBar.findViewById(R.id.dialog_ungroup_bar_text);
mContainerParams = (FrameLayout.LayoutParams) mTabGridDialogContainer.getLayoutParams();
mAnimationCardView = mTabGridDialogView.findViewById(R.id.dialog_animation_card_view);
mBackgroundFrameView = mTabGridDialogView.findViewById(R.id.dialog_frame);
ScrimCoordinator scrimCoordinator =
new ScrimCoordinator(getActivity(), null, mDummyParent, Color.RED);
mTabGridDialogView.setupScrimCoordinator(scrimCoordinator);
mTabGridDialogView.setScrimClickRunnable(() -> {});
mToolbarHeight = (int) getActivity().getResources().getDimension(
R.dimen.tab_group_toolbar_height);
......
......@@ -7,6 +7,7 @@ package org.chromium.chrome.browser.tasks.tab_management;
import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.areAnimatorsEnabled;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.support.test.annotation.UiThreadTest;
......@@ -29,9 +30,9 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.chrome.browser.toolbar.ToolbarColors;
import org.chromium.chrome.browser.widget.ScrimView;
import org.chromium.chrome.tab_ui.R;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator;
import org.chromium.content_public.browser.test.util.CriteriaHelper;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.ui.modelutil.PropertyModel;
......@@ -56,7 +57,7 @@ public class TabGridPanelViewBinderTest extends DummyUiActivityTestCase {
private ChromeImageView mLeftButton;
private EditText mTitleTextView;
private View mMainContent;
private ScrimView mScrimView;
private ScrimCoordinator mScrimCoordinator;
@Override
public void setUpTest() throws Exception {
......@@ -70,15 +71,15 @@ public class TabGridPanelViewBinderTest extends DummyUiActivityTestCase {
mContentView.setLayoutManager(new GridLayoutManager(getActivity(), 2));
mToolbarView = (TabGroupUiToolbarView) LayoutInflater.from(getActivity())
.inflate(R.layout.bottom_tab_grid_toolbar, mContentView, false);
mScrimView = new ScrimView(getActivity(), null, parentView);
LayoutInflater.from(getActivity())
.inflate(R.layout.tab_grid_dialog_layout, parentView, true);
mTabGridDialogView = parentView.findViewById(R.id.dialog_parent_view);
mTabGridDialogView.setupScrimView(mScrimView);
mLeftButton = mToolbarView.findViewById(R.id.toolbar_left_button);
mRightButton = mToolbarView.findViewById(R.id.toolbar_right_button);
mTitleTextView = mToolbarView.findViewById(R.id.title);
mMainContent = mToolbarView.findViewById(R.id.main_content);
mScrimCoordinator = new ScrimCoordinator(getActivity(), null, parentView, Color.RED);
mTabGridDialogView.setupScrimCoordinator(mScrimCoordinator);
mModel = new PropertyModel(TabGridPanelProperties.ALL_KEYS);
......@@ -191,21 +192,13 @@ public class TabGridPanelViewBinderTest extends DummyUiActivityTestCase {
public void testSetScrimViewObserver() {
AtomicBoolean scrimViewClicked = new AtomicBoolean();
scrimViewClicked.set(false);
ScrimView.ScrimObserver scrimObserver = new ScrimView.ScrimObserver() {
@Override
public void onScrimClick() {
scrimViewClicked.set(true);
}
Runnable scrimClickRunnable = () -> scrimViewClicked.set(true);
@Override
public void onScrimVisibilityChanged(boolean visible) {}
};
mModel.set(TabGridPanelProperties.SCRIMVIEW_OBSERVER, scrimObserver);
mModel.set(TabGridPanelProperties.SCRIMVIEW_CLICK_RUNNABLE, scrimClickRunnable);
// Open the dialog to show the ScrimView.
mModel.set(TabGridPanelProperties.IS_DIALOG_VISIBLE, true);
Assert.assertEquals(View.VISIBLE, mScrimView.getVisibility());
mScrimView.performClick();
View scrimView = mScrimCoordinator.getViewForTesting();
scrimView.performClick();
Assert.assertTrue(scrimViewClicked.get());
}
......@@ -214,9 +207,12 @@ public class TabGridPanelViewBinderTest extends DummyUiActivityTestCase {
public void testSetDialogVisibility() {
Assert.assertNull(mTabGridDialogView.getCurrentDialogAnimatorForTesting());
// Setup basic dialog animation. The dialog show/hide animation is always initialized before
// the visibility of dialog is set.
TestThreadUtils.runOnUiThreadBlocking(() -> mTabGridDialogView.setupDialogAnimation(null));
// Setup basic dialog animation and a dummy scrim view click runnable. These are always
// initialized before the visibility of dialog is set.
TestThreadUtils.runOnUiThreadBlocking(() -> {
mTabGridDialogView.setupDialogAnimation(null);
mTabGridDialogView.setScrimClickRunnable(() -> {});
});
TestThreadUtils.runOnUiThreadBlocking(
() -> mModel.set(TabGridPanelProperties.IS_DIALOG_VISIBLE, true));
......
......@@ -654,7 +654,8 @@ public class ChromeTabbedActivity extends ChromeActivity<ChromeActivityComponent
TabManagementDelegate tabManagementDelegate =
TabManagementModuleProvider.getDelegate();
if (tabManagementDelegate != null) {
mStartSurface = tabManagementDelegate.createStartSurface(this);
mStartSurface = tabManagementDelegate.createStartSurface(
this, mRootUiCoordinator.getScrimCoordinator());
}
}
mLayoutManager = new LayoutManagerChromePhone(compositorViewHolder, mStartSurface);
......
......@@ -196,6 +196,7 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve
// TODO(https://crbug.com/865801): Consolidate isBottomToolbarVisible(),
// onBottomToolbarVisibilityChanged, etc. to all use mBottomToolbarVisibilitySupplier.
private final ObservableSupplierImpl<Boolean> mBottomToolbarVisibilitySupplier;
private final ScrimCoordinator mScrimCoordinator;
/**
* Creates a ToolbarManager object.
......@@ -242,6 +243,7 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve
mShareDelegateSupplier = shareDelegateSupplier;
mBottomToolbarVisibilitySupplier = bottomToolbarVisibilitySupplier;
mCanAnimateNativeBrowserControls = canAnimateNativeBrowserControls;
mScrimCoordinator = scrimCoordinator;
mLocationBarModel = new LocationBarModel(activity);
mControlContainer = controlContainer;
......@@ -700,7 +702,9 @@ public class ToolbarManager implements UrlFocusChangeListener, ThemeColorObserve
id -> mActivity.onOptionsItemSelected(id, null)),
mAppThemeColorProvider, mShareDelegateSupplier, mShowStartSurfaceSupplier,
mToolbarTabController::openHomepage,
(reason) -> setUrlBarFocus(true, reason), mOverviewModeBehaviorSupplier);
(reason)
-> setUrlBarFocus(true, reason),
mOverviewModeBehaviorSupplier, mScrimCoordinator);
boolean isBottomToolbarVisible = BottomToolbarConfiguration.isBottomToolbarEnabled()
&& (!BottomToolbarConfiguration.isAdaptiveToolbarEnabled()
......
......@@ -31,6 +31,7 @@ import org.chromium.chrome.browser.toolbar.IncognitoStateProvider;
import org.chromium.chrome.browser.toolbar.TabCountProvider;
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.ui.base.WindowAndroid;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
......@@ -75,6 +76,7 @@ public class BottomControlsCoordinator {
* @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 overviewModeBehaviorSupplier Supplier for the overview mode manager.
* @param scrimCoordinator The {@link ScrimCoordinator} to control scrim view.
*/
@SuppressLint("CutPasteId") // Not actually cut and paste since it's View vs ViewGroup.
public BottomControlsCoordinator(ChromeFullscreenManager fullscreenManager, ViewStub stub,
......@@ -83,7 +85,8 @@ public class BottomControlsCoordinator {
ObservableSupplier<ShareDelegate> shareDelegateSupplier,
Supplier<Boolean> showStartSurfaceCallable, Runnable openHomepageAction,
Callback<Integer> setUrlBarFocusAction,
ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier) {
ObservableSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier,
ScrimCoordinator scrimCoordinator) {
final ScrollingBottomViewResourceFrameLayout root =
(ScrollingBottomViewResourceFrameLayout) stub.inflate();
......@@ -111,7 +114,8 @@ public class BottomControlsCoordinator {
&& BottomToolbarConfiguration.isBottomToolbarEnabled()))
|| TabUiFeatureUtilities.isConditionalTabStripEnabled()) {
mTabGroupUi = TabManagementModuleProvider.getDelegate().createTabGroupUi(
root.findViewById(R.id.bottom_container_slot), themeColorProvider);
root.findViewById(R.id.bottom_container_slot), themeColorProvider,
scrimCoordinator);
} else {
mBottomToolbarCoordinator =
new BottomToolbarCoordinator(root.findViewById(R.id.bottom_toolbar_stub),
......
......@@ -662,6 +662,14 @@ public class RootUiCoordinator
return mScrimView;
}
/** @return The {@link ScrimCoordinator} to control activity's primary scrim. */
// TODO(crbug.com/1064140): This method is used to pass ScrimCoordinator to StartSurface. We
// should be able to create StartSurface in this class so that we don't need to expose this
// getter.
public ScrimCoordinator getScrimCoordinator() {
return mScrimCoordinator;
}
/** @return The {@link SnackbarManager} for the {@link BottomSheetController}. */
public SnackbarManager getBottomSheetSnackbarManager() {
return mBottomSheetSnackbarManager;
......
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