Commit 52b0fda0 authored by Mei Liang's avatar Mei Liang Committed by Commit Bot

[TabSelectionEditor] Change menu option enable condition

This CL enables "Group tab" menu option only when there are more than
one un-grouped tabs in the current TabModel.

Change-Id: Ia7a7bde1a32fe5d8411b3a6dfd95cb232df3fa76
Bug: 970266, 987146
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1717603Reviewed-by: default avatarTheresa <twellington@chromium.org>
Reviewed-by: default avatarWei-Yin Chen (陳威尹) <wychen@chromium.org>
Commit-Queue: Mei Liang <meiliang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#681336}
parent ec7bc594
......@@ -448,6 +448,13 @@ public class TabGroupModelFilter extends TabModelFilter {
return getRelatedTabList(group.getTabIdList());
}
@Override
public boolean hasOtherRelatedTabs(Tab tab) {
int groupId = tab.getRootId();
TabGroup group = mGroupIdToGroupMap.get(groupId);
return group != null && group.size() > 1;
}
private List<Tab> getRelatedTabList(List<Integer> ids) {
List<Tab> tabs = new ArrayList<>();
for (Integer id : ids) {
......
......@@ -11,7 +11,6 @@ import android.view.View;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabModelFilter;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tabmodel.TabModelUtils;
import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter;
......@@ -117,26 +116,14 @@ class TabSelectionEditorMediator
@Override
public void show() {
mResetHandler.resetWithListOfTabs(getTabsToShow());
List<Tab> nonGroupedTabs = mTabModelSelector.getTabModelFilterProvider()
.getCurrentTabModelFilter()
.getTabsWithNoOtherRelatedTabs();
mResetHandler.resetWithListOfTabs(nonGroupedTabs);
mSelectionDelegate.setSelectionModeEnabledForZeroItems(true);
mModel.set(TabSelectionEditorProperties.IS_VISIBLE, true);
}
private List<Tab> getTabsToShow() {
List<Tab> tabs = new ArrayList<>();
TabModelFilter tabModelFilter =
mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter();
for (int i = 0; i < tabModelFilter.getCount(); i++) {
Tab tab = tabModelFilter.getTabAt(i);
// TODO(977302): This filtered out the tabs that has related tabs. This should be done
// at the TabModelFilter.
if (tabModelFilter.getRelatedTabList(tab.getId()).size() == 1) {
tabs.add(tab);
}
}
return tabs;
}
@Override
public boolean handleBackPressed() {
if (!isEditorVisible()) return false;
......
......@@ -654,4 +654,28 @@ public class TabGroupModelFilterUnitTest {
// Verify that the signal is not ignored.
verify(mTabGroupModelFilterObserver).didMoveTabOutOfGroup(mTab3, POSITION2);
}
@Test
public void getNonGroupedTab() {
Tab[] expectedNonGroupedTabs = new Tab[]{mTab1, mTab4};
List<Tab> nonGroupedTabs = mTabGroupModelFilter.getTabsWithNoOtherRelatedTabs();
assertArrayEquals(expectedNonGroupedTabs, nonGroupedTabs.toArray());
// Group mTab4 with mTab2 and mTab3
mTabGroupModelFilter.mergeTabsToGroup(mTab4.getId(), mTab2.getId());
Tab[] expectedNonGroupedTabs_AfterGrouping = new Tab[]{mTab1};
List<Tab> nonGroupedTabs_AfterGrouping =
mTabGroupModelFilter.getTabsWithNoOtherRelatedTabs();
assertArrayEquals(expectedNonGroupedTabs_AfterGrouping,
nonGroupedTabs_AfterGrouping.toArray());
// UnGroup mTab3 for its group.
mTabGroupModelFilter.moveTabOutOfGroup(TAB3_ID);
Tab[] expectedNonGroupedTabs_AfterUnGrouping = new Tab[]{mTab1, mTab3};
List<Tab> nonGroupedTabs_AfterUnGrouping =
mTabGroupModelFilter.getTabsWithNoOtherRelatedTabs();
assertArrayEquals(expectedNonGroupedTabs_AfterUnGrouping,
nonGroupedTabs_AfterUnGrouping.toArray());
}
}
......@@ -268,6 +268,13 @@ public class AppMenuPropertiesDelegateImpl implements AppMenuPropertiesDelegate
if (!FeatureUtilities.isTabGroupsAndroidUiImprovementsEnabled()
|| DeviceClassManager.enableAccessibilityLayout()) {
menu.findItem(R.id.menu_group_tabs).setVisible(false);
} else {
boolean shouldEnabled = mTabModelSelector.getTabModelFilterProvider()
.getCurrentTabModelFilter()
.getTabsWithNoOtherRelatedTabs()
.size()
> 1;
menu.findItem(R.id.menu_group_tabs).setEnabled(shouldEnabled);
}
}
......
......@@ -84,6 +84,31 @@ public abstract class TabModelFilter extends EmptyTabModelObserver implements Ta
return Collections.unmodifiableList(relatedTab);
}
/**
* @return An unmodifiable list of {@link Tab}s that are not related to any tabs
*/
@NonNull
final public List<Tab> getTabsWithNoOtherRelatedTabs() {
List<Tab> tabs = new ArrayList<>();
for (int i = 0; i < mTabModel.getCount(); i++) {
Tab tab = mTabModel.getTabAt(i);
if (!hasOtherRelatedTabs(tab)) {
tabs.add(tab);
}
}
return Collections.unmodifiableList(tabs);
}
/**
* Any of the concrete class that defined a relationship between tabs should override this
* method. By default, the given {@link Tab} has no related tabs, other than itself.
* @param tab A {@link Tab}.
* @return Whether the given {@link Tab} has other related tabs that is not itself.
*/
public boolean hasOtherRelatedTabs(Tab tab) {
return false;
}
/**
* Concrete class requires to define what's the behavior when {@link TabModel} added a
* {@link Tab}.
......
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