Commit 3d506040 authored by Yue Zhang's avatar Yue Zhang Committed by Commit Bot

Skip showing tab switcher message card in multi-window mode

Bug: 1085630
Change-Id: If0e6e852458aedf448647e3ab8320519c4775bd2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2216630Reviewed-by: default avatarWei-Yin Chen (陳威尹) <wychen@chromium.org>
Reviewed-by: default avatarMei Liang <meiliang@chromium.org>
Commit-Queue: Yue Zhang <yuezhanggg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#776308}
parent d5a1431d
......@@ -1073,11 +1073,8 @@ class TabListMediator {
*/
void updateSpanCountForOrientation(GridLayoutManager manager, int orientation) {
// When in multi-window mode, the span count is fixed to 2 to keep tab card size reasonable.
if (MultiWindowUtils.getInstance().isInMultiWindowMode((Activity) mContext)) {
manager.setSpanCount(TabListCoordinator.GRID_LAYOUT_SPAN_COUNT_PORTRAIT);
return;
}
int spanCount = orientation == Configuration.ORIENTATION_PORTRAIT
|| MultiWindowUtils.getInstance().isInMultiWindowMode((Activity) mContext)
? TabListCoordinator.GRID_LAYOUT_SPAN_COUNT_PORTRAIT
: TabListCoordinator.GRID_LAYOUT_SPAN_COUNT_LANDSCAPE;
manager.setSpanCount(spanCount);
......
......@@ -53,7 +53,7 @@ public class TabManagementDelegateImpl implements TabManagementDelegate {
activity.getTabModelSelector(), activity.getTabContentManager(),
activity.getFullscreenManager(), activity,
activity.getMenuOrKeyboardActionController(), containerView,
activity.getShareDelegateSupplier(),
activity.getShareDelegateSupplier(), activity.getMultiWindowModeStateDispatcher(),
TabUiFeatureUtilities.isTabGroupsAndroidContinuationEnabled()
&& SysUtils.isLowEndDevice()
? TabListCoordinator.TabListMode.LIST
......@@ -66,7 +66,8 @@ public class TabManagementDelegateImpl implements TabManagementDelegate {
activity.getTabModelSelector(), activity.getTabContentManager(),
activity.getFullscreenManager(), activity,
activity.getMenuOrKeyboardActionController(), containerView,
activity.getShareDelegateSupplier(), TabListCoordinator.TabListMode.CAROUSEL);
activity.getShareDelegateSupplier(), activity.getMultiWindowModeStateDispatcher(),
TabListCoordinator.TabListMode.CAROUSEL);
}
@Override
......
......@@ -26,6 +26,7 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.lifecycle.Destroyable;
import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcher;
import org.chromium.chrome.browser.share.ShareDelegate;
import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
import org.chromium.chrome.browser.tabmodel.TabList;
......@@ -94,6 +95,7 @@ public class TabSwitcherCoordinator
private final TabModelSelector mTabModelSelector;
private final @TabListCoordinator.TabListMode int mMode;
private final MessageCardProviderCoordinator mMessageCardProviderCoordinator;
private final MultiWindowModeStateDispatcher mMultiWindowModeStateDispatcher;
private TabSelectionEditorCoordinator mTabSelectionEditorCoordinator;
private TabGroupManualSelectionMode mTabGroupManualSelectionMode;
......@@ -136,16 +138,19 @@ public class TabSwitcherCoordinator
ChromeFullscreenManager fullscreenManager, TabCreatorManager tabCreatorManager,
MenuOrKeyboardActionController menuOrKeyboardActionController, ViewGroup container,
ObservableSupplier<ShareDelegate> shareDelegateSupplier,
MultiWindowModeStateDispatcher multiWindowModeStateDispatcher,
@TabListCoordinator.TabListMode int mode) {
mMode = mode;
mTabModelSelector = tabModelSelector;
mContainer = container;
mTabCreatorManager = tabCreatorManager;
mMultiWindowModeStateDispatcher = multiWindowModeStateDispatcher;
PropertyModel containerViewModel = new PropertyModel(TabListContainerProperties.ALL_KEYS);
mMediator = new TabSwitcherMediator(this, containerViewModel, tabModelSelector,
fullscreenManager, container, tabContentManager, this, mode);
fullscreenManager, container, tabContentManager, this,
multiWindowModeStateDispatcher, mode);
mMultiThumbnailCardProvider =
new MultiThumbnailCardProvider(context, tabContentManager, tabModelSelector);
......@@ -433,6 +438,7 @@ public class TabSwitcherCoordinator
}
private void appendMessagesTo(int index) {
if (mMultiWindowModeStateDispatcher.isInMultiWindowMode()) return;
sAppendedMessagesForTesting = false;
List<MessageCardProviderMediator.Message> messages =
mMessageCardProviderCoordinator.getMessageItems();
......
......@@ -35,6 +35,7 @@ import org.chromium.chrome.browser.flags.CachedFeatureFlags;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.fullscreen.BrowserControlsStateProvider;
import org.chromium.chrome.browser.init.FirstDrawDetector;
import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcher;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabCreationState;
import org.chromium.chrome.browser.tab.TabHidingType;
......@@ -94,6 +95,8 @@ class TabSwitcherMediator implements TabSwitcher.Controller, TabListRecyclerView
private final BrowserControlsStateProvider.Observer mBrowserControlsObserver;
private final ViewGroup mContainerView;
private final TabContentManager mTabContentManager;
private final MultiWindowModeStateDispatcher mMultiWindowModeStateDispatcher;
private final MultiWindowModeStateDispatcher.MultiWindowModeObserver mMultiWindowModeObserver;
private Integer mSoftCleanupDelayMsForTesting;
private Integer mCleanupDelayMsForTesting;
......@@ -189,17 +192,21 @@ class TabSwitcherMediator implements TabSwitcher.Controller, TabListRecyclerView
* @param browserControlsStateProvider {@link BrowserControlsStateProvider} to use.
* @param containerView The container {@link ViewGroup} to use.
* @param tabContentManager The {@link TabContentManager} for first meaningful paint event.
* @param multiWindowModeStateDispatcher The {@link MultiWindowModeStateDispatcher} to observe
* for multi-window related changes.
* @param mode One of the {@link TabListCoordinator.TabListMode}.
*/
TabSwitcherMediator(ResetHandler resetHandler, PropertyModel containerViewModel,
TabModelSelector tabModelSelector,
BrowserControlsStateProvider browserControlsStateProvider, ViewGroup containerView,
TabContentManager tabContentManager, MessageItemsController messageItemsController,
MultiWindowModeStateDispatcher multiWindowModeStateDispatcher,
@TabListCoordinator.TabListMode int mode) {
mResetHandler = resetHandler;
mContainerViewModel = containerViewModel;
mTabModelSelector = tabModelSelector;
mBrowserControlsStateProvider = browserControlsStateProvider;
mMultiWindowModeStateDispatcher = multiWindowModeStateDispatcher;
mMode = mode;
mTabModelSelectorObserver = new EmptyTabModelSelectorObserver() {
......@@ -364,6 +371,15 @@ class TabSwitcherMediator implements TabSwitcher.Controller, TabListRecyclerView
// TODO(crbug.com/982018): Let the start surface pass in the parameter and add unit test for
// it. This is a temporary solution to keep this change minimum.
mShowTabsInMruOrder = isShowingTabsInMRUOrder();
mMultiWindowModeObserver = isInMultiWindowMode -> {
if (isInMultiWindowMode) {
messageItemsController.removeAllAppendedMessage();
} else {
messageItemsController.restoreAllAppendedMessage();
}
};
mMultiWindowModeStateDispatcher.addObserver(mMultiWindowModeObserver);
}
/**
......@@ -724,6 +740,7 @@ class TabSwitcherMediator implements TabSwitcher.Controller, TabListRecyclerView
mBrowserControlsStateProvider.removeObserver(mBrowserControlsObserver);
mTabModelSelector.getTabModelFilterProvider().removeTabModelFilterObserver(
mTabModelObserver);
mMultiWindowModeStateDispatcher.removeObserver(mMultiWindowModeObserver);
}
void setOnTabSelectingListener(TabSwitcher.OnTabSelectingListener listener) {
......
......@@ -21,6 +21,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.clickFirstCardFromTabSwitcher;
import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.closeFirstTabInTabSwitcher;
import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.enterTabSwitcher;
import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.getSwipeToDismissAction;
......@@ -56,6 +57,7 @@ import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.compositor.layouts.Layout;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
import org.chromium.chrome.features.start_surface.StartSurfaceLayout;
import org.chromium.chrome.tab_ui.R;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
......@@ -327,6 +329,27 @@ public class TabGridIphTest {
onView(withId(R.id.tab_grid_message_item)).check(doesNotExist());
}
@Test
@MediumTest
public void testNotShowIPHInMultiWindowMode() {
ChromeTabbedActivity cta = mActivityTestRule.getActivity();
enterTabSwitcher(cta);
onView(withId(R.id.tab_grid_message_item)).check(matches(isDisplayed()));
// Mock that user enters multi-window mode, and the IPH message should not show in tab
// switcher.
clickFirstCardFromTabSwitcher(cta);
MultiWindowUtils.getInstance().setIsInMultiWindowModeForTesting(true);
enterTabSwitcher(cta);
onView(withId(R.id.tab_grid_message_item)).check(doesNotExist());
// Mock that user exits multi-window mode, and the IPH message should show in tab switcher.
clickFirstCardFromTabSwitcher(cta);
MultiWindowUtils.getInstance().setIsInMultiWindowModeForTesting(false);
enterTabSwitcher(cta);
onView(withId(R.id.tab_grid_message_item)).check(matches(isDisplayed()));
}
private void verifyIphDialogShowing(ChromeTabbedActivity cta) {
// Verify IPH dialog view.
onView(withId(R.id.iph_dialog))
......
......@@ -47,6 +47,7 @@ import org.chromium.chrome.browser.compositor.layouts.Layout;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.fullscreen.BrowserControlsStateProvider;
import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcher;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabHidingType;
import org.chromium.chrome.browser.tab.TabSelectionType;
......@@ -123,6 +124,8 @@ public class TabSwitcherMediatorUnitTest {
TabGridDialogMediator.DialogController mTabGridDialogController;
@Mock
TabSwitcherMediator.MessageItemsController mMessageItemsController;
@Mock
MultiWindowModeStateDispatcher mMultiWindowModeStateDispatcher;
@Captor
ArgumentCaptor<TabModelObserver> mTabModelObserverCaptor;
......@@ -131,6 +134,9 @@ public class TabSwitcherMediatorUnitTest {
@Captor
private ArgumentCaptor<BrowserControlsStateProvider.Observer>
mBrowserControlsStateProviderObserverCaptor;
@Captor
ArgumentCaptor<MultiWindowModeStateDispatcher.MultiWindowModeObserver>
mMultiWindowModeObserverCaptor;
private Tab mTab1;
private Tab mTab2;
......@@ -185,12 +191,15 @@ public class TabSwitcherMediatorUnitTest {
doNothing()
.when(mBrowserControlsStateProvider)
.addObserver(mBrowserControlsStateProviderObserverCaptor.capture());
doReturn(true)
.when(mMultiWindowModeStateDispatcher)
.addObserver(mMultiWindowModeObserverCaptor.capture());
mModel = new PropertyModel(TabListContainerProperties.ALL_KEYS);
mModel.addObserver(mPropertyObserver);
mMediator = new TabSwitcherMediator(mResetHandler, mModel, mTabModelSelector,
mBrowserControlsStateProvider, mCompositorViewHolder, null, mMessageItemsController,
TabListCoordinator.TabListMode.GRID);
mMultiWindowModeStateDispatcher, TabListCoordinator.TabListMode.GRID);
mMediator.initWithNative(null);
mMediator.addOverviewModeObserver(mOverviewModeObserver);
mMediator.setOnTabSelectingListener(mLayout::onTabSelecting);
......@@ -677,6 +686,24 @@ public class TabSwitcherMediatorUnitTest {
assertEquals(0, mModel.get(TabListContainerProperties.SHADOW_TOP_MARGIN));
}
@Test
public void enterMultiWindowMode() {
initAndAssertAllProperties();
mMultiWindowModeObserverCaptor.getValue().onMultiWindowModeChanged(true);
verify(mMessageItemsController).removeAllAppendedMessage();
}
@Test
public void exitMultiWindowMode() {
initAndAssertAllProperties();
mMultiWindowModeObserverCaptor.getValue().onMultiWindowModeChanged(false);
verify(mMessageItemsController).restoreAllAppendedMessage();
}
private void initAndAssertAllProperties() {
assertThat(mModel.get(TabListContainerProperties.VISIBILITY_LISTENER),
instanceOf(TabSwitcherMediator.class));
......
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